| OLD | NEW |
| 1 # Copyright 2015 The Chromium Authors. All rights reserved. | 1 # Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import mock |
| 6 |
| 5 from common.waterfall import buildbucket_client | 7 from common.waterfall import buildbucket_client |
| 8 from common.waterfall import failure_type |
| 6 from model.wf_try_job import WfTryJob | 9 from model.wf_try_job import WfTryJob |
| 7 from model.wf_try_job_data import WfTryJobData | 10 from model.wf_try_job_data import WfTryJobData |
| 11 from waterfall import schedule_try_job_pipeline |
| 8 from waterfall.schedule_try_job_pipeline import ScheduleTryJobPipeline | 12 from waterfall.schedule_try_job_pipeline import ScheduleTryJobPipeline |
| 9 from waterfall.test import wf_testcase | 13 from waterfall.test import wf_testcase |
| 10 from waterfall.try_job_type import TryJobType | |
| 11 | 14 |
| 12 | 15 |
| 13 class ScheduleTryjobPipelineTest(wf_testcase.WaterfallTestCase): | 16 class ScheduleTryjobPipelineTest(wf_testcase.WaterfallTestCase): |
| 14 | 17 |
| 15 def _Mock_TriggerTryJobs(self, responses): | 18 def testGetBuildPropertiesWithSuspectedRevision(self): |
| 16 def MockedTriggerTryJobs(*_): | |
| 17 results = [] | |
| 18 for response in responses: | |
| 19 if response.get('error'): # pragma: no cover | |
| 20 results.append(( | |
| 21 buildbucket_client.BuildbucketError(response['error']), None)) | |
| 22 else: | |
| 23 results.append(( | |
| 24 None, buildbucket_client.BuildbucketBuild(response['build']))) | |
| 25 return results | |
| 26 self.mock(buildbucket_client, 'TriggerTryJobs', MockedTriggerTryJobs) | |
| 27 | |
| 28 def testGetBuildPropertiesWithCompileTargets(self): | |
| 29 master_name = 'm' | 19 master_name = 'm' |
| 30 builder_name = 'b' | 20 builder_name = 'b' |
| 31 build_number = 1 | 21 build_number = 1 |
| 32 | 22 |
| 33 expected_properties = { | 23 expected_properties = { |
| 34 'recipe': 'findit/chromium/compile', | 24 'recipe': 'findit/chromium/compile', |
| 35 'good_revision': 1, | 25 'good_revision': 1, |
| 36 'bad_revision': 2, | 26 'bad_revision': 2, |
| 37 'target_mastername': master_name, | 27 'target_mastername': master_name, |
| 38 'target_buildername': 'b', | |
| 39 'referenced_build_url': ('https://build.chromium.org/p/%s/builders' | 28 'referenced_build_url': ('https://build.chromium.org/p/%s/builders' |
| 40 '/%s/builds/%s') % ( | 29 '/%s/builds/%s') % ( |
| 41 master_name, builder_name, build_number) | 30 master_name, builder_name, build_number), |
| 31 'suspected_revisions': ['rev'] |
| 42 } | 32 } |
| 43 try_job_pipeline = ScheduleTryJobPipeline() | 33 try_job_pipeline = ScheduleTryJobPipeline() |
| 44 properties = try_job_pipeline._GetBuildProperties( | 34 properties = try_job_pipeline._GetBuildProperties( |
| 45 master_name, builder_name, build_number, 1, 2, TryJobType.COMPILE, None) | 35 master_name, builder_name, build_number, 1, 2, failure_type.COMPILE, |
| 36 ['rev']) |
| 46 | 37 |
| 47 self.assertEqual(properties, expected_properties) | 38 self.assertEqual(properties, expected_properties) |
| 48 | 39 |
| 49 def testGetBuildPropertiesForTestFailure(self): | 40 def testGetBuildPropertiesNoSuspectedRevision(self): |
| 50 master_name = 'm' | 41 master_name = 'm' |
| 51 builder_name = 'b' | 42 builder_name = 'b' |
| 52 build_number = 1 | 43 build_number = 1 |
| 53 | 44 |
| 54 expected_properties = { | 45 expected_properties = { |
| 55 'recipe': 'findit/chromium/test', | 46 'recipe': 'findit/chromium/test', |
| 56 'good_revision': 1, | 47 'good_revision': 1, |
| 57 'bad_revision': 2, | 48 'bad_revision': 2, |
| 58 'target_mastername': master_name, | 49 'target_mastername': master_name, |
| 59 'target_testername': 'b', | |
| 60 'referenced_build_url': ('https://build.chromium.org/p/%s/builders' | 50 'referenced_build_url': ('https://build.chromium.org/p/%s/builders' |
| 61 '/%s/builds/%s') % ( | 51 '/%s/builds/%s') % ( |
| 62 master_name, builder_name, build_number) | 52 master_name, builder_name, build_number) |
| 63 } | 53 } |
| 64 try_job_pipeline = ScheduleTryJobPipeline() | 54 try_job_pipeline = ScheduleTryJobPipeline() |
| 65 properties = try_job_pipeline._GetBuildProperties( | 55 properties = try_job_pipeline._GetBuildProperties( |
| 66 master_name, builder_name, build_number, 1, 2, TryJobType.TEST, None) | 56 master_name, builder_name, build_number, 1, 2, failure_type.TEST, None) |
| 67 | 57 |
| 68 self.assertEqual(properties, expected_properties) | 58 self.assertEqual(properties, expected_properties) |
| 69 | 59 |
| 70 def testSuccessfullyScheduleNewTryJobForCompileWithSuspectedRevisions(self): | 60 @mock.patch.object(schedule_try_job_pipeline, 'buildbucket_client') |
| 61 def testTriggerTryJob(self, mock_other): |
| 71 master_name = 'm' | 62 master_name = 'm' |
| 72 builder_name = 'b' | 63 builder_name = 'b' |
| 73 build_number = 223 | 64 response = { |
| 74 good_revision = 'rev1' | 65 'build': { |
| 75 bad_revision = 'rev2' | 66 'id': '1', |
| 76 build_id = '1' | 67 'url': 'url', |
| 77 url = 'url' | 68 'status': 'SCHEDULED', |
| 78 | |
| 79 responses = [ | |
| 80 { | |
| 81 'build': { | |
| 82 'id': build_id, | |
| 83 'url': url, | |
| 84 'status': 'SCHEDULED', | |
| 85 } | |
| 86 } | 69 } |
| 87 ] | 70 } |
| 88 | 71 results = [(None, buildbucket_client.BuildbucketBuild(response['build']))] |
| 89 self._Mock_TriggerTryJobs(responses) | 72 mock_other.TriggerTryJobs.return_value = results |
| 90 | |
| 91 WfTryJob.Create(master_name, builder_name, build_number).put() | |
| 92 | 73 |
| 93 try_job_pipeline = ScheduleTryJobPipeline() | 74 try_job_pipeline = ScheduleTryJobPipeline() |
| 94 try_job_id = try_job_pipeline.run( | 75 build_id = try_job_pipeline._TriggerTryJob( |
| 95 master_name, builder_name, build_number, good_revision, bad_revision, | 76 master_name, builder_name, {}, []) |
| 96 TryJobType.COMPILE, None, None, ['r5']) | |
| 97 | 77 |
| 98 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 78 self.assertEqual(build_id, '1') |
| 99 try_job_data = WfTryJobData.Get(build_id) | |
| 100 | 79 |
| 101 expected_try_job_id = '1' | |
| 102 self.assertEqual(expected_try_job_id, try_job_id) | |
| 103 self.assertEqual( | |
| 104 expected_try_job_id, try_job.compile_results[-1]['try_job_id']) | |
| 105 self.assertTrue(expected_try_job_id in try_job.try_job_ids) | |
| 106 self.assertIsNotNone(try_job_data) | |
| 107 self.assertEqual(try_job_data.master_name, master_name) | |
| 108 self.assertEqual(try_job_data.builder_name, builder_name) | |
| 109 self.assertEqual(try_job_data.build_number, build_number) | |
| 110 self.assertEqual(try_job_data.try_job_type, TryJobType.COMPILE) | |
| 111 self.assertFalse(try_job_data.has_compile_targets) | |
| 112 self.assertTrue(try_job_data.has_heuristic_results) | |
| 113 | 80 |
| 114 def testSuccessfullyScheduleNewTryJobForTest(self): | 81 def testCreateTryJobData(self): |
| 82 build_id = 1 |
| 115 master_name = 'm' | 83 master_name = 'm' |
| 116 builder_name = 'b' | 84 builder_name = 'b' |
| 117 build_number = 223 | 85 build_number = 1 |
| 118 good_revision = 'rev1' | 86 try_job_type = failure_type.GetDescriptionForFailureType(failure_type.TEST) |
| 119 bad_revision = 'rev2' | |
| 120 targeted_tests = {'a': ['test1', 'test2']} | |
| 121 build_id = '1' | |
| 122 | 87 |
| 123 responses = [ | 88 ScheduleTryJobPipeline()._CreateTryJobData( |
| 124 { | 89 build_id, master_name, builder_name, build_number, try_job_type, |
| 125 'build': { | 90 False, False) |
| 126 'id': build_id, | |
| 127 'url': 'url', | |
| 128 'status': 'SCHEDULED', | |
| 129 } | |
| 130 } | |
| 131 ] | |
| 132 self._Mock_TriggerTryJobs(responses) | |
| 133 | 91 |
| 134 WfTryJob.Create(master_name, builder_name, build_number).put() | 92 data = WfTryJobData.Get(build_id) |
| 135 | 93 |
| 136 try_job_pipeline = ScheduleTryJobPipeline() | 94 self.assertIsNotNone(data) |
| 137 try_job_id = try_job_pipeline.run( | 95 self.assertEqual(data.master_name, master_name) |
| 138 master_name, builder_name, build_number, good_revision, bad_revision, | 96 self.assertEqual(data.builder_name, builder_name) |
| 139 TryJobType.TEST, None, targeted_tests, None) | 97 self.assertEqual(data.build_number, build_number) |
| 140 | 98 self.assertEqual(data.try_job_type, try_job_type) |
| 141 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 99 self.assertFalse(data.has_compile_targets) |
| 142 try_job_data = WfTryJobData.Get(try_job_id) | 100 self.assertFalse(data.has_heuristic_results) |
| 143 self.assertEqual(try_job_id, build_id) | |
| 144 self.assertEqual(try_job.test_results[-1]['try_job_id'], build_id) | |
| 145 self.assertIsNotNone(try_job_data) | |
| 146 self.assertEqual(try_job_data.master_name, master_name) | |
| 147 self.assertEqual(try_job_data.builder_name, builder_name) | |
| 148 self.assertEqual(try_job_data.build_number, build_number) | |
| 149 self.assertEqual(try_job_data.try_job_type, TryJobType.TEST) | |
| 150 self.assertFalse(try_job_data.has_compile_targets) | |
| 151 self.assertFalse(try_job_data.has_heuristic_results) | |
| OLD | NEW |