blob: ed085f99fd61fab21b56661d3d11f6c5431acfa6 [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
67 def testJobName(self):
68 client = analytics.ScheduleJobSection(_get_task_info())
69 self.assertEqual(client.message.job_name, 'FakeSuiteTestPerBuild')
70
71 def testBuildFilters(self):
72 client = analytics.ScheduleJobSection(_get_task_info())
73 job_trigger = client.message.schedule_job_trigger
74 self.assertFalse(
75 job_trigger.build_filters.only_hwtest_sanity_required)
76 branch_filters = job_trigger.build_filters.branch_filters
77 self.assertEqual(len(branch_filters), 2)
78 self.assertEqual(branch_filters[0].channel,
79 analytics_pb2.BranchFilter.MASTER)
80 self.assertEqual(branch_filters[0].operator, analytics_pb2.BranchFilter.GE)
81 self.assertEqual(branch_filters[0].lag, 2)
82 self.assertEqual(branch_filters[1].channel,
83 analytics_pb2.BranchFilter.MASTER)
84 self.assertEqual(branch_filters[1].operator, analytics_pb2.BranchFilter.EQ)
85 self.assertEqual(branch_filters[1].lag, 0)
86
87 def testGenScheduleJobTriggerDaily(self):
88 client = analytics.ScheduleJobSection(_get_task_info())
89 job_trigger = client.message.schedule_job_trigger
90 self.assertEqual(job_trigger.nightly.hour, 5)
91
92 def testGenScheduleJobTriggerEveryRun(self):
93 task_info = task_config_reader.TaskInfo(
94 name='FakeSuiteTestPerBuild',
95 suite='fake_suite',
96 pool='fake_pool')
97 client = analytics.ScheduleJobSection(task_info)
98 job_trigger = client.message.schedule_job_trigger
99 self.assertEqual(job_trigger.interval.pause, 0)
100
101 def testAddBoard(self):
102 client = analytics.ScheduleJobSection(_get_task_info())
103 client.add_board('foo_board')
104 self.assertEqual(len(client.message.build_targets), 1)
105 self.assertEqual(client.message.build_targets[0].name, 'foo_board')
106
107 def testAddModel(self):
108 client = analytics.ScheduleJobSection(_get_task_info())
109 client.add_model('foo_model')
110 self.assertEqual(len(client.message.models), 1)
111 self.assertEqual(client.message.models[0].value, 'foo_model')
112
113 def testAddMatchedBuild(self):
114 client = analytics.ScheduleJobSection(_get_task_info())
115 client.add_matched_build('foo_board', 'release', '81', '12345.6.7')
116 self.assertEqual(len(client.message.matched_builds), 1)
117 match = client.message.matched_builds[0]
118 self.assertEqual(match.release_build.build_target.name, 'foo_board')
119 self.assertEqual(match.release_build.milestone, 81)
120 self.assertEqual(match.release_build.chrome_os_version, '12345.6.7')
121 self.assertEqual(match.release_build.type, branch_pb2.Branch.RELEASE)
122
123 def testAddMatchedRelaxBuild(self):
124 client = analytics.ScheduleJobSection(_get_task_info())
125 client.add_matched_relax_build('foo_board', 'release', '81', '12345.6.7')
126 self.assertEqual(len(client.message.matched_builds), 1)
127 match = client.message.matched_builds[0]
128 self.assertEqual(match.relax_build.build_target.name, 'foo_board')
129 self.assertEqual(match.relax_build.milestone, 81)
130 self.assertEqual(match.relax_build.chrome_os_version, '12345.6.7')
131 self.assertEqual(match.relax_build.type, branch_pb2.Branch.RELEASE)
132
133 def testAddMatchedFWBuild(self):
134 client = analytics.ScheduleJobSection(_get_task_info())
135 artifact = 'gs://image/firmware-foo-firmwarebranch/RNone-1.0.0-b123/foo'
136 client.add_matched_fw_build(
137 'foo_board', 'firmware', artifact, read_only=True)
138 self.assertEqual(len(client.message.matched_builds), 1)
139 match = client.message.matched_builds[0]
140 self.assertEqual(
141 match.firmware_ro_build.build_target.name, 'foo_board')
142 self.assertEqual(match.firmware_ro_build.artifact.path, artifact)
143 self.assertEqual(match.firmware_ro_build.type, branch_pb2.Branch.FIRMWARE)
144
145 def testAddScheduleJob(self):
146 client = analytics.ScheduleJobSection(_get_task_info())
147 client.add_schedule_job('foo_board', 'foo_model', task_id='b123456789')
148 self.assertEqual(len(client.message.schedule_jobs), 1)
149 job = client.message.schedule_jobs[0]
150 self.assertEqual(job.queued_task_id, 'b123456789')
151
152 def testAddFailedJob(self):
153 client = analytics.ScheduleJobSection(_get_task_info())
154 client.add_schedule_job('foo_board', 'foo_model', msg='some error')
155 self.assertEqual(len(client.message.schedule_jobs), 1)
156 job = client.message.schedule_jobs[0]
157 self.assertEqual(job.justification, 'some error')
158
159 def testAddJobwithEmptyModel(self):
160 client = analytics.ScheduleJobSection(_get_task_info())
161 client.add_schedule_job('foo_board', None, msg='some error')
162 self.assertEqual(len(client.message.schedule_jobs), 1)
163 job = client.message.schedule_jobs[0]
164 self.assertEqual(job.justification, 'some error')
165
166 def testAddScheduleJobRaiseError(self):
167 client = analytics.ScheduleJobSection(_get_task_info())
168 self.assertRaises(analytics.AnalyticsError,
169 client.add_schedule_job,
170 'foo_board',
171 'foo_model',
172 'some error',
173 'b123456789')
174 self.assertRaises(analytics.AnalyticsError,
175 client.add_schedule_job,
176 'foo_board',
177 'foo_model')