Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(160)

Side by Side Diff: appengine/findit/waterfall/test/try_job_pipeline_test.py

Issue 1591003002: [Findit] Modify tryjob pipelines to trigger try jobs for test failure. (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Fix nits. Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 from testing_utils import testing 5 from testing_utils import testing
6 6
7 from common import buildbucket_client 7 from common import buildbucket_client
8 from common.git_repository import GitRepository
8 from model import wf_analysis_status 9 from model import wf_analysis_status
9 from model.wf_try_job import WfTryJob 10 from model.wf_try_job import WfTryJob
10 from pipeline_wrapper import pipeline_handlers 11 from pipeline_wrapper import pipeline_handlers
11 from waterfall import waterfall_config 12 from waterfall import waterfall_config
12 from waterfall.try_job_pipeline import TryJobPipeline 13 from waterfall.try_job_pipeline import TryJobPipeline
13 14
14 15
15 class TryJobPipelineTest(testing.AppengineTestCase): 16 class TryJobPipelineTest(testing.AppengineTestCase):
16 app_module = pipeline_handlers._APP 17 app_module = pipeline_handlers._APP
17 18
18 def _Mock_GetTrybotForWaterfallBuilder(self, *_): 19 def _Mock_GetTrybotForWaterfallBuilder(self, *_):
19 def Mocked_GetTrybotForWaterfallBuilder(*_): 20 def Mocked_GetTrybotForWaterfallBuilder(*_):
20 return 'linux_chromium_variable', 'master.tryserver.chromium.linux' 21 return 'linux_chromium_variable', 'master.tryserver.chromium.linux'
21 self.mock(waterfall_config, 'GetTrybotForWaterfallBuilder', 22 self.mock(waterfall_config, 'GetTrybotForWaterfallBuilder',
22 Mocked_GetTrybotForWaterfallBuilder) 23 Mocked_GetTrybotForWaterfallBuilder)
23 24
24 def _Mock_TriggerTryJobs(self, responses): 25 def _Mock_TriggerTryJobs(self, responses):
25 def Mocked_TriggerTryJobs(*_): 26 def Mocked_TriggerTryJobs(*_):
26 compile_results = [] 27 try_job_results = []
27 for response in responses: 28 for response in responses:
28 if response.get('error'): # pragma: no cover 29 if response.get('error'): # pragma: no cover
29 compile_results.append(( 30 try_job_results.append((
30 buildbucket_client.BuildbucketError(response['error']), None)) 31 buildbucket_client.BuildbucketError(response['error']), None))
31 else: 32 else:
32 compile_results.append(( 33 try_job_results.append((
33 None, buildbucket_client.BuildbucketBuild(response['build']))) 34 None, buildbucket_client.BuildbucketBuild(response['build'])))
34 return compile_results 35 return try_job_results
35 self.mock(buildbucket_client, 'TriggerTryJobs', Mocked_TriggerTryJobs) 36 self.mock(buildbucket_client, 'TriggerTryJobs', Mocked_TriggerTryJobs)
36 37
37 def _Mock_GetTryJobs(self, build_id): 38 def _Mock_GetTryJobs(self, build_id):
38 def Mocked_GetTryJobs(*_): 39 def Mocked_GetTryJobs(*_):
39 data = { 40 data = {
40 '1': { 41 '1': {
41 'build': { 42 'build': {
42 'id': '1', 43 'id': '1',
43 'url': 'url', 44 'url': 'url',
44 'status': 'COMPLETED', 45 'status': 'COMPLETED',
45 'result_details_json': ( 46 'result_details_json': (
46 '{"properties": {"result": [["rev1", "passed"],' 47 '{"properties": {"result": [["rev1", "passed"],'
47 ' ["rev2", "failed"]]}}') 48 ' ["rev2", "failed"]]}}')
48 } 49 }
49 }, 50 },
50 '3': { 51 '3': {
51 'error': { 52 'error': {
52 'reason': 'BUILD_NOT_FOUND', 53 'reason': 'BUILD_NOT_FOUND',
53 'message': 'message', 54 'message': 'message',
54 } 55 }
55 } 56 }
56 } 57 }
57 compile_results = [] 58 try_job_results = []
58 build_error = data.get(build_id) 59 build_error = data.get(build_id)
59 if build_error.get('error'): # pragma: no cover 60 if build_error.get('error'): # pragma: no cover
60 compile_results.append(( 61 try_job_results.append((
61 buildbucket_client.BuildbucketError(build_error['error']), None)) 62 buildbucket_client.BuildbucketError(build_error['error']), None))
62 else: 63 else:
63 compile_results.append(( 64 try_job_results.append((
64 None, buildbucket_client.BuildbucketBuild(build_error['build']))) 65 None, buildbucket_client.BuildbucketBuild(build_error['build'])))
65 return compile_results 66 return try_job_results
66 self.mock(buildbucket_client, 'GetTryJobs', Mocked_GetTryJobs) 67 self.mock(buildbucket_client, 'GetTryJobs', Mocked_GetTryJobs)
67 68
69 def _Mock_GetChangeLog(self, revision):
70 def Mocked_GetChangeLog(*_):
71 class MockedChangeLog(object):
72 def __init__(self, commit_position, code_review_url):
73 self.commit_position = commit_position
74 self.code_review_url = code_review_url
75
76 mock_change_logs = {}
77 mock_change_logs['rev2'] = MockedChangeLog('2', 'url_2')
78 return mock_change_logs.get(revision)
79 self.mock(GitRepository, 'GetChangeLog', Mocked_GetChangeLog)
80
68 def testSuccessfullyScheduleNewTryJobForCompile(self): 81 def testSuccessfullyScheduleNewTryJobForCompile(self):
69 master_name = 'm' 82 master_name = 'm'
70 builder_name = 'b' 83 builder_name = 'b'
71 build_number = 1 84 build_number = 1
72 good_revision = 'rev1'
73 bad_revision = 'rev2'
74 85
75 responses = [ 86 responses = [
76 { 87 {
77 'build': { 88 'build': {
78 'id': '1', 89 'id': '1',
79 'url': 'url', 90 'url': 'url',
80 'status': 'SCHEDULED', 91 'status': 'SCHEDULED',
81 } 92 }
82 } 93 }
83 ] 94 ]
84 self._Mock_GetTrybotForWaterfallBuilder(master_name, builder_name) 95 self._Mock_GetTrybotForWaterfallBuilder(master_name, builder_name)
85 self._Mock_TriggerTryJobs(responses) 96 self._Mock_TriggerTryJobs(responses)
86 self._Mock_GetTryJobs('1') 97 self._Mock_GetTryJobs('1')
98 self._Mock_GetChangeLog('rev2')
87 99
88 WfTryJob.Create(master_name, builder_name, build_number).put() 100 WfTryJob.Create(master_name, builder_name, build_number).put()
89 101
90 root_pipeline = TryJobPipeline( 102 root_pipeline = TryJobPipeline(
91 master_name, builder_name, build_number, good_revision, bad_revision, 103 master_name, builder_name, build_number, 'rev1', 'rev2', ['rev2'],
92 []) 104 'compile', [])
93 root_pipeline.start() 105 root_pipeline.start()
94 self.execute_queued_tasks() 106 self.execute_queued_tasks()
95 107
96 try_job = WfTryJob.Get(master_name, builder_name, build_number) 108 try_job = WfTryJob.Get(master_name, builder_name, build_number)
97 109
98 expected_compile_results = [ 110 expected_try_job_results = [
99 { 111 {
100 'report': [ 112 'report': [
101 ['rev1', 'passed'], 113 ['rev1', 'passed'],
102 ['rev2', 'failed'] 114 ['rev2', 'failed']
103 ], 115 ],
104 'url': 'url', 116 'url': 'url',
105 'try_job_id': '1', 117 'try_job_id': '1',
118 'culprit': {
119 'revision': 'rev2',
120 'commit_position': '2',
121 'review_url': 'url_2'
122 }
106 } 123 }
107 ] 124 ]
108 self.assertEqual(expected_compile_results, try_job.compile_results) 125 self.assertEqual(expected_try_job_results, try_job.compile_results)
109 126
110 def testPipelineAbortedWithTryJobResult(self): 127 def testPipelineAbortedWithTryJobResult(self):
111 master_name = 'm' 128 master_name = 'm'
112 builder_name = 'b' 129 builder_name = 'b'
113 build_number = 1 130 build_number = 1
114 131
115 WfTryJob.Create(master_name, builder_name, build_number).put() 132 WfTryJob.Create(master_name, builder_name, build_number).put()
116 133
117 root_pipeline = TryJobPipeline( 134 root_pipeline = TryJobPipeline(
118 master_name, builder_name, build_number, 'rev1', 'rev2', []) 135 master_name, builder_name, build_number, 'rev1', 'rev2', ['rev2'],
136 'compile', [])
119 root_pipeline._LogUnexpectedAbort(True) 137 root_pipeline._LogUnexpectedAbort(True)
120 138
121 try_job = WfTryJob.Get(master_name, builder_name, build_number) 139 try_job = WfTryJob.Get(master_name, builder_name, build_number)
122 self.assertEqual(wf_analysis_status.ERROR, try_job.status) 140 self.assertEqual(wf_analysis_status.ERROR, try_job.status)
123 141
124 def testPipelineAbortedWithOutTryJobResult(self): 142 def testPipelineAbortedWithOutTryJobResult(self):
125 master_name = 'm' 143 master_name = 'm'
126 builder_name = 'b' 144 builder_name = 'b'
127 build_number = 1 145 build_number = 1
128 146
129 root_pipeline = TryJobPipeline( 147 root_pipeline = TryJobPipeline(
130 master_name, builder_name, build_number, 'rev1', 'rev2', []) 148 master_name, builder_name, build_number, 'rev1', 'rev2', ['rev2'],
149 'compile', [])
131 root_pipeline._LogUnexpectedAbort(True) 150 root_pipeline._LogUnexpectedAbort(True)
132 151
133 try_job = WfTryJob.Get(master_name, builder_name, build_number) 152 try_job = WfTryJob.Get(master_name, builder_name, build_number)
134 153
135 self.assertIsNone(try_job) 154 self.assertIsNone(try_job)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698