blob: 4eee0dadff5eedc3c4b6a48ba31a7fa82e2cb628 [file] [log] [blame]
Xinan Linc9f01152020-02-05 22:05:13 -08001#!/usr/bin/env python2
2# Copyright 2020 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""Module for analytics unittests."""
7
8import uuid
9import unittest
10
11import analytics
12import task_config_reader
13
14from chromite.api.gen.test_platform.suite_scheduler import analytics_pb2
15from chromite.api.gen.chromiumos import branch_pb2
16from infra_libs.buildbucket.proto import build_pb2
17from infra_libs.buildbucket.proto import common_pb2
18
19
20def _get_task_info():
21 return task_config_reader.TaskInfo(
22 name='FakeSuiteTestPerBuild',
23 suite='fake_suite',
24 pool='fake_pool',
25 num=1,
26 hour=5,
27 boards='coral,hana,hatch',
28 branch_specs=['>=tot-2', '==tot'],
29 priority=50,
30 timeout=600)
31
32
33class TestExecutionTask(unittest.TestCase):
34
35 def setUp(self):
36 super(TestExecutionTask, self).setUp()
37
38 def testTaskID(self):
39 tid = str(uuid.uuid1())
40 execution = analytics.ExecutionTask(tid)
41 self.assertEqual(execution.task.queued_task_id, tid)
42
43 def testUpdateResultBuildID(self):
44 execution = analytics.ExecutionTask(str(uuid.uuid1()))
45 bid = 8890493019851395280
46 execution.update_result(build_pb2.Build(id=bid))
47 self.assertEqual(execution.task.response.ctp_build_id, str(bid))
48
49 def testUpdateResultInvalidBuildID(self):
50 execution = analytics.ExecutionTask(str(uuid.uuid1()))
51 execution.update_result(build_pb2.Build(status=common_pb2.INFRA_FAILURE))
52 self.assertIn('status: INFRA_FAILURE',
53 execution.task.error.error_message)
54
55 def testUpdateResultErrorMsg(self):
56 execution = analytics.ExecutionTask(str(uuid.uuid1()))
57 msg = 'some error'
58 execution.update_result(msg)
59 self.assertEqual(execution.task.error.error_message, msg)
60
61
62class TestScheduleJobSection(unittest.TestCase):
63
64 def setUp(self):
65 super(TestScheduleJobSection, self).setUp()
66
Xinan Lin3ffd97c2020-03-31 10:34:43 -070067 def testJobInfo(self):
Xinan Linc9f01152020-02-05 22:05:13 -080068 client = analytics.ScheduleJobSection(_get_task_info())
69 self.assertEqual(client.message.job_name, 'FakeSuiteTestPerBuild')
Xinan Lin3ffd97c2020-03-31 10:34:43 -070070 self.assertEqual(client.message.pool, 'fake_pool')
71 self.assertEqual(client.message.suite, 'fake_suite')
Xinan Linc9f01152020-02-05 22:05:13 -080072
73 def testBuildFilters(self):
74 client = analytics.ScheduleJobSection(_get_task_info())
75 job_trigger = client.message.schedule_job_trigger
76 self.assertFalse(
77 job_trigger.build_filters.only_hwtest_sanity_required)
78 branch_filters = job_trigger.build_filters.branch_filters
79 self.assertEqual(len(branch_filters), 2)
80 self.assertEqual(branch_filters[0].channel,
81 analytics_pb2.BranchFilter.MASTER)
82 self.assertEqual(branch_filters[0].operator, analytics_pb2.BranchFilter.GE)
83 self.assertEqual(branch_filters[0].lag, 2)
84 self.assertEqual(branch_filters[1].channel,
85 analytics_pb2.BranchFilter.MASTER)
86 self.assertEqual(branch_filters[1].operator, analytics_pb2.BranchFilter.EQ)
87 self.assertEqual(branch_filters[1].lag, 0)
88
89 def testGenScheduleJobTriggerDaily(self):
90 client = analytics.ScheduleJobSection(_get_task_info())
91 job_trigger = client.message.schedule_job_trigger
92 self.assertEqual(job_trigger.nightly.hour, 5)
93
94 def testGenScheduleJobTriggerEveryRun(self):
95 task_info = task_config_reader.TaskInfo(
96 name='FakeSuiteTestPerBuild',
97 suite='fake_suite',
98 pool='fake_pool')
99 client = analytics.ScheduleJobSection(task_info)
100 job_trigger = client.message.schedule_job_trigger
101 self.assertEqual(job_trigger.interval.pause, 0)
102
103 def testAddBoard(self):
104 client = analytics.ScheduleJobSection(_get_task_info())
105 client.add_board('foo_board')
106 self.assertEqual(len(client.message.build_targets), 1)
107 self.assertEqual(client.message.build_targets[0].name, 'foo_board')
108
109 def testAddModel(self):
110 client = analytics.ScheduleJobSection(_get_task_info())
111 client.add_model('foo_model')
112 self.assertEqual(len(client.message.models), 1)
113 self.assertEqual(client.message.models[0].value, 'foo_model')
114
115 def testAddMatchedBuild(self):
116 client = analytics.ScheduleJobSection(_get_task_info())
117 client.add_matched_build('foo_board', 'release', '81', '12345.6.7')
118 self.assertEqual(len(client.message.matched_builds), 1)
119 match = client.message.matched_builds[0]
120 self.assertEqual(match.release_build.build_target.name, 'foo_board')
121 self.assertEqual(match.release_build.milestone, 81)
122 self.assertEqual(match.release_build.chrome_os_version, '12345.6.7')
123 self.assertEqual(match.release_build.type, branch_pb2.Branch.RELEASE)
124
125 def testAddMatchedRelaxBuild(self):
126 client = analytics.ScheduleJobSection(_get_task_info())
127 client.add_matched_relax_build('foo_board', 'release', '81', '12345.6.7')
128 self.assertEqual(len(client.message.matched_builds), 1)
129 match = client.message.matched_builds[0]
130 self.assertEqual(match.relax_build.build_target.name, 'foo_board')
131 self.assertEqual(match.relax_build.milestone, 81)
132 self.assertEqual(match.relax_build.chrome_os_version, '12345.6.7')
133 self.assertEqual(match.relax_build.type, branch_pb2.Branch.RELEASE)
134
135 def testAddMatchedFWBuild(self):
136 client = analytics.ScheduleJobSection(_get_task_info())
137 artifact = 'gs://image/firmware-foo-firmwarebranch/RNone-1.0.0-b123/foo'
138 client.add_matched_fw_build(
139 'foo_board', 'firmware', artifact, read_only=True)
140 self.assertEqual(len(client.message.matched_builds), 1)
141 match = client.message.matched_builds[0]
142 self.assertEqual(
143 match.firmware_ro_build.build_target.name, 'foo_board')
144 self.assertEqual(match.firmware_ro_build.artifact.path, artifact)
145 self.assertEqual(match.firmware_ro_build.type, branch_pb2.Branch.FIRMWARE)
146
147 def testAddScheduleJob(self):
148 client = analytics.ScheduleJobSection(_get_task_info())
149 client.add_schedule_job('foo_board', 'foo_model', task_id='b123456789')
150 self.assertEqual(len(client.message.schedule_jobs), 1)
151 job = client.message.schedule_jobs[0]
152 self.assertEqual(job.queued_task_id, 'b123456789')
153
154 def testAddFailedJob(self):
155 client = analytics.ScheduleJobSection(_get_task_info())
156 client.add_schedule_job('foo_board', 'foo_model', msg='some error')
157 self.assertEqual(len(client.message.schedule_jobs), 1)
158 job = client.message.schedule_jobs[0]
159 self.assertEqual(job.justification, 'some error')
160
161 def testAddJobwithEmptyModel(self):
162 client = analytics.ScheduleJobSection(_get_task_info())
163 client.add_schedule_job('foo_board', None, msg='some error')
164 self.assertEqual(len(client.message.schedule_jobs), 1)
165 job = client.message.schedule_jobs[0]
166 self.assertEqual(job.justification, 'some error')
167
168 def testAddScheduleJobRaiseError(self):
169 client = analytics.ScheduleJobSection(_get_task_info())
170 self.assertRaises(analytics.AnalyticsError,
171 client.add_schedule_job,
172 'foo_board',
173 'foo_model',
174 'some error',
175 'b123456789')
176 self.assertRaises(analytics.AnalyticsError,
177 client.add_schedule_job,
178 'foo_board',
179 'foo_model')