blob: 9e777ae432b6c7ea70fb48494f2fb4a606825dc3 [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
Sean McAllisteraf32bfb2021-07-19 09:20:17 -060016from chromite.third_party.infra_libs.buildbucket.proto import build_pb2
17from chromite.third_party.infra_libs.buildbucket.proto import common_pb2
Xinan Linc9f01152020-02-05 22:05:13 -080018
19
20def _get_task_info():
21 return task_config_reader.TaskInfo(
22 name='FakeSuiteTestPerBuild',
Brigit Rossbach6a8eea12021-01-11 09:35:31 -070023 analytics_name='FakeSuiteTestPerBuild',
Xinan Linc9f01152020-02-05 22:05:13 -080024 suite='fake_suite',
25 pool='fake_pool',
26 num=1,
27 hour=5,
28 boards='coral,hana,hatch',
29 branch_specs=['>=tot-2', '==tot'],
30 priority=50,
31 timeout=600)
32
33
34class TestExecutionTask(unittest.TestCase):
35
36 def setUp(self):
37 super(TestExecutionTask, self).setUp()
38
39 def testTaskID(self):
40 tid = str(uuid.uuid1())
Xinan Lin9b17c5b2020-08-06 10:43:30 -070041 execution = analytics.ExecutionTask(tid, 'fake_req_tag')
Xinan Linc9f01152020-02-05 22:05:13 -080042 self.assertEqual(execution.task.queued_task_id, tid)
Xinan Lin9b17c5b2020-08-06 10:43:30 -070043 self.assertEqual(execution.task.request_tag, 'fake_req_tag')
Xinan Linc9f01152020-02-05 22:05:13 -080044
45 def testUpdateResultBuildID(self):
Xinan Lin9b17c5b2020-08-06 10:43:30 -070046 execution = analytics.ExecutionTask(str(uuid.uuid1()), '')
Xinan Linc9f01152020-02-05 22:05:13 -080047 bid = 8890493019851395280
48 execution.update_result(build_pb2.Build(id=bid))
49 self.assertEqual(execution.task.response.ctp_build_id, str(bid))
50
51 def testUpdateResultInvalidBuildID(self):
Xinan Lin9b17c5b2020-08-06 10:43:30 -070052 execution = analytics.ExecutionTask(str(uuid.uuid1()), '')
Xinan Linc9f01152020-02-05 22:05:13 -080053 execution.update_result(build_pb2.Build(status=common_pb2.INFRA_FAILURE))
54 self.assertIn('status: INFRA_FAILURE',
55 execution.task.error.error_message)
56
57 def testUpdateResultErrorMsg(self):
Xinan Lin9b17c5b2020-08-06 10:43:30 -070058 execution = analytics.ExecutionTask(str(uuid.uuid1()), '')
Xinan Linc9f01152020-02-05 22:05:13 -080059 msg = 'some error'
60 execution.update_result(msg)
61 self.assertEqual(execution.task.error.error_message, msg)
62
63
64class TestScheduleJobSection(unittest.TestCase):
65
66 def setUp(self):
67 super(TestScheduleJobSection, self).setUp()
68
Xinan Lin3ffd97c2020-03-31 10:34:43 -070069 def testJobInfo(self):
Xinan Linc9f01152020-02-05 22:05:13 -080070 client = analytics.ScheduleJobSection(_get_task_info())
71 self.assertEqual(client.message.job_name, 'FakeSuiteTestPerBuild')
Xinan Lin3ffd97c2020-03-31 10:34:43 -070072 self.assertEqual(client.message.pool, 'fake_pool')
73 self.assertEqual(client.message.suite, 'fake_suite')
Xinan Linc9f01152020-02-05 22:05:13 -080074
75 def testBuildFilters(self):
76 client = analytics.ScheduleJobSection(_get_task_info())
77 job_trigger = client.message.schedule_job_trigger
78 self.assertFalse(
79 job_trigger.build_filters.only_hwtest_sanity_required)
80 branch_filters = job_trigger.build_filters.branch_filters
81 self.assertEqual(len(branch_filters), 2)
82 self.assertEqual(branch_filters[0].channel,
83 analytics_pb2.BranchFilter.MASTER)
84 self.assertEqual(branch_filters[0].operator, analytics_pb2.BranchFilter.GE)
85 self.assertEqual(branch_filters[0].lag, 2)
86 self.assertEqual(branch_filters[1].channel,
87 analytics_pb2.BranchFilter.MASTER)
88 self.assertEqual(branch_filters[1].operator, analytics_pb2.BranchFilter.EQ)
89 self.assertEqual(branch_filters[1].lag, 0)
90
91 def testGenScheduleJobTriggerDaily(self):
92 client = analytics.ScheduleJobSection(_get_task_info())
93 job_trigger = client.message.schedule_job_trigger
94 self.assertEqual(job_trigger.nightly.hour, 5)
95
96 def testGenScheduleJobTriggerEveryRun(self):
97 task_info = task_config_reader.TaskInfo(
98 name='FakeSuiteTestPerBuild',
99 suite='fake_suite',
100 pool='fake_pool')
101 client = analytics.ScheduleJobSection(task_info)
102 job_trigger = client.message.schedule_job_trigger
103 self.assertEqual(job_trigger.interval.pause, 0)
104
105 def testAddBoard(self):
106 client = analytics.ScheduleJobSection(_get_task_info())
107 client.add_board('foo_board')
108 self.assertEqual(len(client.message.build_targets), 1)
109 self.assertEqual(client.message.build_targets[0].name, 'foo_board')
110
111 def testAddModel(self):
112 client = analytics.ScheduleJobSection(_get_task_info())
113 client.add_model('foo_model')
114 self.assertEqual(len(client.message.models), 1)
115 self.assertEqual(client.message.models[0].value, 'foo_model')
116
117 def testAddMatchedBuild(self):
118 client = analytics.ScheduleJobSection(_get_task_info())
119 client.add_matched_build('foo_board', 'release', '81', '12345.6.7')
120 self.assertEqual(len(client.message.matched_builds), 1)
121 match = client.message.matched_builds[0]
122 self.assertEqual(match.release_build.build_target.name, 'foo_board')
123 self.assertEqual(match.release_build.milestone, 81)
124 self.assertEqual(match.release_build.chrome_os_version, '12345.6.7')
125 self.assertEqual(match.release_build.type, branch_pb2.Branch.RELEASE)
126
127 def testAddMatchedRelaxBuild(self):
128 client = analytics.ScheduleJobSection(_get_task_info())
129 client.add_matched_relax_build('foo_board', 'release', '81', '12345.6.7')
130 self.assertEqual(len(client.message.matched_builds), 1)
131 match = client.message.matched_builds[0]
132 self.assertEqual(match.relax_build.build_target.name, 'foo_board')
133 self.assertEqual(match.relax_build.milestone, 81)
134 self.assertEqual(match.relax_build.chrome_os_version, '12345.6.7')
135 self.assertEqual(match.relax_build.type, branch_pb2.Branch.RELEASE)
136
137 def testAddMatchedFWBuild(self):
138 client = analytics.ScheduleJobSection(_get_task_info())
139 artifact = 'gs://image/firmware-foo-firmwarebranch/RNone-1.0.0-b123/foo'
140 client.add_matched_fw_build(
141 'foo_board', 'firmware', artifact, read_only=True)
142 self.assertEqual(len(client.message.matched_builds), 1)
143 match = client.message.matched_builds[0]
144 self.assertEqual(
145 match.firmware_ro_build.build_target.name, 'foo_board')
146 self.assertEqual(match.firmware_ro_build.artifact.path, artifact)
147 self.assertEqual(match.firmware_ro_build.type, branch_pb2.Branch.FIRMWARE)
148
149 def testAddScheduleJob(self):
150 client = analytics.ScheduleJobSection(_get_task_info())
151 client.add_schedule_job('foo_board', 'foo_model', task_id='b123456789')
152 self.assertEqual(len(client.message.schedule_jobs), 1)
153 job = client.message.schedule_jobs[0]
154 self.assertEqual(job.queued_task_id, 'b123456789')
155
156 def testAddFailedJob(self):
157 client = analytics.ScheduleJobSection(_get_task_info())
158 client.add_schedule_job('foo_board', 'foo_model', msg='some error')
159 self.assertEqual(len(client.message.schedule_jobs), 1)
160 job = client.message.schedule_jobs[0]
161 self.assertEqual(job.justification, 'some error')
162
163 def testAddJobwithEmptyModel(self):
164 client = analytics.ScheduleJobSection(_get_task_info())
165 client.add_schedule_job('foo_board', None, msg='some error')
166 self.assertEqual(len(client.message.schedule_jobs), 1)
167 job = client.message.schedule_jobs[0]
168 self.assertEqual(job.justification, 'some error')
169
170 def testAddScheduleJobRaiseError(self):
171 client = analytics.ScheduleJobSection(_get_task_info())
172 self.assertRaises(analytics.AnalyticsError,
173 client.add_schedule_job,
174 'foo_board',
175 'foo_model',
176 'some error',
177 'b123456789')
178 self.assertRaises(analytics.AnalyticsError,
179 client.add_schedule_job,
180 'foo_board',
181 'foo_model')