blob: 0ee34af61b4f08cbecea896615c453de5aa380b6 [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())
Xinan Lin9b17c5b2020-08-06 10:43:30 -070040 execution = analytics.ExecutionTask(tid, 'fake_req_tag')
Xinan Linc9f01152020-02-05 22:05:13 -080041 self.assertEqual(execution.task.queued_task_id, tid)
Xinan Lin9b17c5b2020-08-06 10:43:30 -070042 self.assertEqual(execution.task.request_tag, 'fake_req_tag')
Xinan Linc9f01152020-02-05 22:05:13 -080043
44 def testUpdateResultBuildID(self):
Xinan Lin9b17c5b2020-08-06 10:43:30 -070045 execution = analytics.ExecutionTask(str(uuid.uuid1()), '')
Xinan Linc9f01152020-02-05 22:05:13 -080046 bid = 8890493019851395280
47 execution.update_result(build_pb2.Build(id=bid))
48 self.assertEqual(execution.task.response.ctp_build_id, str(bid))
49
50 def testUpdateResultInvalidBuildID(self):
Xinan Lin9b17c5b2020-08-06 10:43:30 -070051 execution = analytics.ExecutionTask(str(uuid.uuid1()), '')
Xinan Linc9f01152020-02-05 22:05:13 -080052 execution.update_result(build_pb2.Build(status=common_pb2.INFRA_FAILURE))
53 self.assertIn('status: INFRA_FAILURE',
54 execution.task.error.error_message)
55
56 def testUpdateResultErrorMsg(self):
Xinan Lin9b17c5b2020-08-06 10:43:30 -070057 execution = analytics.ExecutionTask(str(uuid.uuid1()), '')
Xinan Linc9f01152020-02-05 22:05:13 -080058 msg = 'some error'
59 execution.update_result(msg)
60 self.assertEqual(execution.task.error.error_message, msg)
61
62
63class TestScheduleJobSection(unittest.TestCase):
64
65 def setUp(self):
66 super(TestScheduleJobSection, self).setUp()
67
Xinan Lin3ffd97c2020-03-31 10:34:43 -070068 def testJobInfo(self):
Xinan Linc9f01152020-02-05 22:05:13 -080069 client = analytics.ScheduleJobSection(_get_task_info())
70 self.assertEqual(client.message.job_name, 'FakeSuiteTestPerBuild')
Xinan Lin3ffd97c2020-03-31 10:34:43 -070071 self.assertEqual(client.message.pool, 'fake_pool')
72 self.assertEqual(client.message.suite, 'fake_suite')
Xinan Linc9f01152020-02-05 22:05:13 -080073
74 def testBuildFilters(self):
75 client = analytics.ScheduleJobSection(_get_task_info())
76 job_trigger = client.message.schedule_job_trigger
77 self.assertFalse(
78 job_trigger.build_filters.only_hwtest_sanity_required)
79 branch_filters = job_trigger.build_filters.branch_filters
80 self.assertEqual(len(branch_filters), 2)
81 self.assertEqual(branch_filters[0].channel,
82 analytics_pb2.BranchFilter.MASTER)
83 self.assertEqual(branch_filters[0].operator, analytics_pb2.BranchFilter.GE)
84 self.assertEqual(branch_filters[0].lag, 2)
85 self.assertEqual(branch_filters[1].channel,
86 analytics_pb2.BranchFilter.MASTER)
87 self.assertEqual(branch_filters[1].operator, analytics_pb2.BranchFilter.EQ)
88 self.assertEqual(branch_filters[1].lag, 0)
89
90 def testGenScheduleJobTriggerDaily(self):
91 client = analytics.ScheduleJobSection(_get_task_info())
92 job_trigger = client.message.schedule_job_trigger
93 self.assertEqual(job_trigger.nightly.hour, 5)
94
95 def testGenScheduleJobTriggerEveryRun(self):
96 task_info = task_config_reader.TaskInfo(
97 name='FakeSuiteTestPerBuild',
98 suite='fake_suite',
99 pool='fake_pool')
100 client = analytics.ScheduleJobSection(task_info)
101 job_trigger = client.message.schedule_job_trigger
102 self.assertEqual(job_trigger.interval.pause, 0)
103
104 def testAddBoard(self):
105 client = analytics.ScheduleJobSection(_get_task_info())
106 client.add_board('foo_board')
107 self.assertEqual(len(client.message.build_targets), 1)
108 self.assertEqual(client.message.build_targets[0].name, 'foo_board')
109
110 def testAddModel(self):
111 client = analytics.ScheduleJobSection(_get_task_info())
112 client.add_model('foo_model')
113 self.assertEqual(len(client.message.models), 1)
114 self.assertEqual(client.message.models[0].value, 'foo_model')
115
116 def testAddMatchedBuild(self):
117 client = analytics.ScheduleJobSection(_get_task_info())
118 client.add_matched_build('foo_board', 'release', '81', '12345.6.7')
119 self.assertEqual(len(client.message.matched_builds), 1)
120 match = client.message.matched_builds[0]
121 self.assertEqual(match.release_build.build_target.name, 'foo_board')
122 self.assertEqual(match.release_build.milestone, 81)
123 self.assertEqual(match.release_build.chrome_os_version, '12345.6.7')
124 self.assertEqual(match.release_build.type, branch_pb2.Branch.RELEASE)
125
126 def testAddMatchedRelaxBuild(self):
127 client = analytics.ScheduleJobSection(_get_task_info())
128 client.add_matched_relax_build('foo_board', 'release', '81', '12345.6.7')
129 self.assertEqual(len(client.message.matched_builds), 1)
130 match = client.message.matched_builds[0]
131 self.assertEqual(match.relax_build.build_target.name, 'foo_board')
132 self.assertEqual(match.relax_build.milestone, 81)
133 self.assertEqual(match.relax_build.chrome_os_version, '12345.6.7')
134 self.assertEqual(match.relax_build.type, branch_pb2.Branch.RELEASE)
135
136 def testAddMatchedFWBuild(self):
137 client = analytics.ScheduleJobSection(_get_task_info())
138 artifact = 'gs://image/firmware-foo-firmwarebranch/RNone-1.0.0-b123/foo'
139 client.add_matched_fw_build(
140 'foo_board', 'firmware', artifact, read_only=True)
141 self.assertEqual(len(client.message.matched_builds), 1)
142 match = client.message.matched_builds[0]
143 self.assertEqual(
144 match.firmware_ro_build.build_target.name, 'foo_board')
145 self.assertEqual(match.firmware_ro_build.artifact.path, artifact)
146 self.assertEqual(match.firmware_ro_build.type, branch_pb2.Branch.FIRMWARE)
147
148 def testAddScheduleJob(self):
149 client = analytics.ScheduleJobSection(_get_task_info())
150 client.add_schedule_job('foo_board', 'foo_model', task_id='b123456789')
151 self.assertEqual(len(client.message.schedule_jobs), 1)
152 job = client.message.schedule_jobs[0]
153 self.assertEqual(job.queued_task_id, 'b123456789')
154
155 def testAddFailedJob(self):
156 client = analytics.ScheduleJobSection(_get_task_info())
157 client.add_schedule_job('foo_board', 'foo_model', msg='some error')
158 self.assertEqual(len(client.message.schedule_jobs), 1)
159 job = client.message.schedule_jobs[0]
160 self.assertEqual(job.justification, 'some error')
161
162 def testAddJobwithEmptyModel(self):
163 client = analytics.ScheduleJobSection(_get_task_info())
164 client.add_schedule_job('foo_board', None, msg='some error')
165 self.assertEqual(len(client.message.schedule_jobs), 1)
166 job = client.message.schedule_jobs[0]
167 self.assertEqual(job.justification, 'some error')
168
169 def testAddScheduleJobRaiseError(self):
170 client = analytics.ScheduleJobSection(_get_task_info())
171 self.assertRaises(analytics.AnalyticsError,
172 client.add_schedule_job,
173 'foo_board',
174 'foo_model',
175 'some error',
176 'b123456789')
177 self.assertRaises(analytics.AnalyticsError,
178 client.add_schedule_job,
179 'foo_board',
180 'foo_model')