Xinan Lin | c9f0115 | 2020-02-05 22:05:13 -0800 | [diff] [blame] | 1 | #!/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 | |
| 8 | import uuid |
| 9 | import unittest |
| 10 | |
| 11 | import analytics |
| 12 | import task_config_reader |
| 13 | |
| 14 | from chromite.api.gen.test_platform.suite_scheduler import analytics_pb2 |
| 15 | from chromite.api.gen.chromiumos import branch_pb2 |
Sean McAllister | af32bfb | 2021-07-19 09:20:17 -0600 | [diff] [blame^] | 16 | from chromite.third_party.infra_libs.buildbucket.proto import build_pb2 |
| 17 | from chromite.third_party.infra_libs.buildbucket.proto import common_pb2 |
Xinan Lin | c9f0115 | 2020-02-05 22:05:13 -0800 | [diff] [blame] | 18 | |
| 19 | |
| 20 | def _get_task_info(): |
| 21 | return task_config_reader.TaskInfo( |
| 22 | name='FakeSuiteTestPerBuild', |
Brigit Rossbach | 6a8eea1 | 2021-01-11 09:35:31 -0700 | [diff] [blame] | 23 | analytics_name='FakeSuiteTestPerBuild', |
Xinan Lin | c9f0115 | 2020-02-05 22:05:13 -0800 | [diff] [blame] | 24 | 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 | |
| 34 | class TestExecutionTask(unittest.TestCase): |
| 35 | |
| 36 | def setUp(self): |
| 37 | super(TestExecutionTask, self).setUp() |
| 38 | |
| 39 | def testTaskID(self): |
| 40 | tid = str(uuid.uuid1()) |
Xinan Lin | 9b17c5b | 2020-08-06 10:43:30 -0700 | [diff] [blame] | 41 | execution = analytics.ExecutionTask(tid, 'fake_req_tag') |
Xinan Lin | c9f0115 | 2020-02-05 22:05:13 -0800 | [diff] [blame] | 42 | self.assertEqual(execution.task.queued_task_id, tid) |
Xinan Lin | 9b17c5b | 2020-08-06 10:43:30 -0700 | [diff] [blame] | 43 | self.assertEqual(execution.task.request_tag, 'fake_req_tag') |
Xinan Lin | c9f0115 | 2020-02-05 22:05:13 -0800 | [diff] [blame] | 44 | |
| 45 | def testUpdateResultBuildID(self): |
Xinan Lin | 9b17c5b | 2020-08-06 10:43:30 -0700 | [diff] [blame] | 46 | execution = analytics.ExecutionTask(str(uuid.uuid1()), '') |
Xinan Lin | c9f0115 | 2020-02-05 22:05:13 -0800 | [diff] [blame] | 47 | 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 Lin | 9b17c5b | 2020-08-06 10:43:30 -0700 | [diff] [blame] | 52 | execution = analytics.ExecutionTask(str(uuid.uuid1()), '') |
Xinan Lin | c9f0115 | 2020-02-05 22:05:13 -0800 | [diff] [blame] | 53 | 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 Lin | 9b17c5b | 2020-08-06 10:43:30 -0700 | [diff] [blame] | 58 | execution = analytics.ExecutionTask(str(uuid.uuid1()), '') |
Xinan Lin | c9f0115 | 2020-02-05 22:05:13 -0800 | [diff] [blame] | 59 | msg = 'some error' |
| 60 | execution.update_result(msg) |
| 61 | self.assertEqual(execution.task.error.error_message, msg) |
| 62 | |
| 63 | |
| 64 | class TestScheduleJobSection(unittest.TestCase): |
| 65 | |
| 66 | def setUp(self): |
| 67 | super(TestScheduleJobSection, self).setUp() |
| 68 | |
Xinan Lin | 3ffd97c | 2020-03-31 10:34:43 -0700 | [diff] [blame] | 69 | def testJobInfo(self): |
Xinan Lin | c9f0115 | 2020-02-05 22:05:13 -0800 | [diff] [blame] | 70 | client = analytics.ScheduleJobSection(_get_task_info()) |
| 71 | self.assertEqual(client.message.job_name, 'FakeSuiteTestPerBuild') |
Xinan Lin | 3ffd97c | 2020-03-31 10:34:43 -0700 | [diff] [blame] | 72 | self.assertEqual(client.message.pool, 'fake_pool') |
| 73 | self.assertEqual(client.message.suite, 'fake_suite') |
Xinan Lin | c9f0115 | 2020-02-05 22:05:13 -0800 | [diff] [blame] | 74 | |
| 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') |