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

Side by Side Diff: appengine/findit/waterfall/test/identify_try_job_culprit_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: Simplify the format for final try-job result for test failures. 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.git_repository import GitRepository 7 from common.git_repository import GitRepository
8 from model import wf_analysis_status 8 from model import wf_analysis_status
9 from model.wf_try_job import WfTryJob 9 from model.wf_try_job import WfTryJob
10 from waterfall.identify_try_job_culprit_pipeline import( 10 from waterfall.identify_try_job_culprit_pipeline import(
11 IdentifyTryJobCulpritPipeline) 11 IdentifyTryJobCulpritPipeline)
12 from waterfall.try_job_enums import TryJobType
12 13
13 14
14 class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase): 15 class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase):
15 16
16 def _MockGetChangeLog(self, revision): 17 def _MockGetChangeLog(self, revision):
17 class MockedChangeLog(object): 18 class MockedChangeLog(object):
18 19
19 def __init__(self, commit_position, code_review_url): 20 def __init__(self, commit_position, code_review_url):
20 self.commit_position = commit_position 21 self.commit_position = commit_position
21 self.code_review_url = code_review_url 22 self.code_review_url = code_review_url
22 23
23 mock_change_logs = {} 24 mock_change_logs = {}
25 mock_change_logs['rev1'] = MockedChangeLog('1', 'url_1')
24 mock_change_logs['rev2'] = MockedChangeLog('2', 'url_2') 26 mock_change_logs['rev2'] = MockedChangeLog('2', 'url_2')
25 return mock_change_logs.get(revision) 27 return mock_change_logs.get(revision)
26 28
27 def testIdentifyCulpritForCompileReturnNoneIfNoCompileResult(self): 29 def testIdentifyCulpritForCompileReturnNoneIfNoCompileResult(self):
28 master_name = 'm' 30 master_name = 'm'
29 builder_name = 'b' 31 builder_name = 'b'
30 build_number = 1 32 build_number = 1
31 try_job_id = '1'
32 compile_result = None
33 33
34 WfTryJob.Create(master_name, builder_name, build_number).put() 34 WfTryJob.Create(master_name, builder_name, build_number).put()
35 pipeline = IdentifyTryJobCulpritPipeline() 35 pipeline = IdentifyTryJobCulpritPipeline()
36 culprit = pipeline.run( 36 culprit = pipeline.run(
37 master_name, builder_name, build_number, try_job_id, compile_result) 37 master_name, builder_name, build_number, ['rev1'],
38 TryJobType.COMPILE, '1', None)
38 try_job = WfTryJob.Get(master_name, builder_name, build_number) 39 try_job = WfTryJob.Get(master_name, builder_name, build_number)
39 40
40 self.assertIsNone(culprit) 41 self.assertIsNone(culprit)
41 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) 42 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status)
42 43
43 def testIdentifyCulpritForCompileReturnNoneIfNoTryJobResultForCompile(self): 44 def testIdentifyCulpritForCompileReturnNoneIfNoTryJobResultForCompile(self):
44 master_name = 'm' 45 master_name = 'm'
45 builder_name = 'b' 46 builder_name = 'b'
46 build_number = 1 47 build_number = 1
47 try_job_id = '1'
48 compile_result = { 48 compile_result = {
49 'result': [], 49 'result': [],
50 'url': 'url', 50 'url': 'url',
51 'try_job_id': '1', 51 'try_job_id': '1',
52 } 52 }
53 WfTryJob.Create(master_name, builder_name, build_number).put() 53 WfTryJob.Create(master_name, builder_name, build_number).put()
54 54
55 pipeline = IdentifyTryJobCulpritPipeline() 55 pipeline = IdentifyTryJobCulpritPipeline()
56 culprit = pipeline.run( 56 culprit = pipeline.run(
57 master_name, builder_name, build_number, try_job_id, compile_result) 57 master_name, builder_name, build_number, ['rev1'],
58 TryJobType.COMPILE, '1', compile_result)
58 try_job = WfTryJob.Get(master_name, builder_name, build_number) 59 try_job = WfTryJob.Get(master_name, builder_name, build_number)
59 60
60 self.assertIsNone(culprit) 61 self.assertIsNone(culprit)
61 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) 62 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status)
62 63
63 def testIdentifyCulpritForCompileReturnNoneIfAllPassed(self): 64 def testIdentifyCulpritForCompileReturnNoneIfAllPassed(self):
64 master_name = 'm' 65 master_name = 'm'
65 builder_name = 'b' 66 builder_name = 'b'
66 build_number = 1 67 build_number = 1
67 try_job_id = '1'
68 compile_result = { 68 compile_result = {
69 'result': [ 69 'result': [
70 ['rev1', 'passed'], 70 ['rev1', 'passed'],
71 ['rev2', 'passed'] 71 ['rev2', 'passed']
72 ], 72 ],
73 'url': 'url', 73 'url': 'url',
74 'try_job_id': '1', 74 'try_job_id': '1',
75 } 75 }
76 WfTryJob.Create(master_name, builder_name, build_number).put() 76 WfTryJob.Create(master_name, builder_name, build_number).put()
77 77
78 pipeline = IdentifyTryJobCulpritPipeline() 78 pipeline = IdentifyTryJobCulpritPipeline()
79 culprit = pipeline.run( 79 culprit = pipeline.run(
80 master_name, builder_name, build_number, try_job_id, compile_result) 80 master_name, builder_name, build_number, ['rev1'],
81 TryJobType.COMPILE, '1', compile_result)
81 try_job = WfTryJob.Get(master_name, builder_name, build_number) 82 try_job = WfTryJob.Get(master_name, builder_name, build_number)
82 83
83 self.assertIsNone(culprit) 84 self.assertIsNone(culprit)
84 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) 85 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status)
85 86
86 def testIdentifyCulpritForCompileReturnNoneIfNoChangeLog(self): 87 def testIdentifyCulpritForCompileReturnNoneIfNoChangeLog(self):
87 master_name = 'm' 88 master_name = 'm'
88 builder_name = 'b' 89 builder_name = 'b'
89 build_number = 1 90 build_number = 1
90 try_job_id = '1'
91 compile_result = { 91 compile_result = {
92 'result': [ 92 'result': [
93 ['rev1', 'failed'] 93 ['rev0', 'failed']
94 ], 94 ],
95 'url': 'url', 95 'url': 'url',
96 'try_job_id': '1', 96 'try_job_id': '1',
97 } 97 }
98 98
99 self.mock(GitRepository, 'GetChangeLog', self._MockGetChangeLog) 99 self.mock(GitRepository, 'GetChangeLog', self._MockGetChangeLog)
100 WfTryJob.Create(master_name, builder_name, build_number).put() 100 WfTryJob.Create(master_name, builder_name, build_number).put()
101 101
102 pipeline = IdentifyTryJobCulpritPipeline() 102 pipeline = IdentifyTryJobCulpritPipeline()
103 culprit = pipeline.run( 103 culprit = pipeline.run(
104 master_name, builder_name, build_number, try_job_id, compile_result) 104 master_name, builder_name, build_number, ['rev1'],
105 TryJobType.COMPILE, '1', compile_result)
105 try_job = WfTryJob.Get(master_name, builder_name, build_number) 106 try_job = WfTryJob.Get(master_name, builder_name, build_number)
106 107
107 self.assertIsNone(culprit) 108 self.assertIsNone(culprit)
108 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) 109 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status)
109 110
110 def testIdentifyCulpritForCompileTryJobSuccess(self): 111 def testIdentifyCulpritForCompileTryJobSuccess(self):
111 master_name = 'm' 112 master_name = 'm'
112 builder_name = 'b' 113 builder_name = 'b'
113 build_number = 1 114 build_number = 1
114 try_job_id = '1'
115 compile_result = { 115 compile_result = {
116 'result': [ 116 'result': [
117 ['rev1', 'passed'], 117 ['rev1', 'passed'],
118 ['rev2', 'failed'] 118 ['rev2', 'failed']
119 ], 119 ],
120 'url': 'url', 120 'url': 'url',
121 'try_job_id': '1', 121 'try_job_id': '1',
122 } 122 }
123 123
124 try_job = WfTryJob.Create(master_name, builder_name, build_number) 124 try_job = WfTryJob.Create(master_name, builder_name, build_number)
125 try_job.status = wf_analysis_status.ANALYZING 125 try_job.status = wf_analysis_status.ANALYZING
126 try_job.compile_results = [{ 126 try_job.compile_results = [compile_result]
127 'result': [
128 ['rev1', 'passed'],
129 ['rev2', 'failed']
130 ],
131 'url': 'url',
132 'try_job_id': '1',
133 }]
134 try_job.put() 127 try_job.put()
135 128
136 self.mock(GitRepository, 'GetChangeLog', self._MockGetChangeLog) 129 self.mock(GitRepository, 'GetChangeLog', self._MockGetChangeLog)
137 130
138 pipeline = IdentifyTryJobCulpritPipeline() 131 pipeline = IdentifyTryJobCulpritPipeline()
139 culprit = pipeline.run( 132 culprit = pipeline.run(
140 master_name, builder_name, build_number, try_job_id, compile_result) 133 master_name, builder_name, build_number, ['rev1'],
134 TryJobType.COMPILE, '1', compile_result)
141 135
142 expected_compile_result = { 136 expected_compile_result = {
143 'result': [ 137 'result': [
144 ['rev1', 'passed'], 138 ['rev1', 'passed'],
145 ['rev2', 'failed'] 139 ['rev2', 'failed']
146 ], 140 ],
147 'url': 'url', 141 'url': 'url',
148 'try_job_id': '1', 142 'try_job_id': '1',
149 'culprit': { 143 'culprit': {
150 'revision': 'rev2', 144 'revision': 'rev2',
151 'commit_position': '2', 145 'commit_position': '2',
152 'review_url': 'url_2' 146 'review_url': 'url_2'
153 } 147 }
154 } 148 }
155 149
156 self.assertEqual(expected_compile_result['culprit'], culprit) 150 self.assertEqual(expected_compile_result['culprit'], culprit)
157 151
158 try_job = WfTryJob.Get(master_name, builder_name, build_number) 152 try_job = WfTryJob.Get(master_name, builder_name, build_number)
159 self.assertEqual(expected_compile_result, try_job.compile_results[-1]) 153 self.assertEqual(expected_compile_result, try_job.compile_results[-1])
160 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) 154 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status)
155
156 def testIdentifyCulpritForTestTryJobReturnNoneIfNoTryJobResult(self):
157 master_name = 'm'
158 builder_name = 'b'
159 build_number = 1
160
161 try_job = WfTryJob.Create(master_name, builder_name, build_number)
162 try_job.status = wf_analysis_status.ANALYZING
163 try_job.put()
164
165 pipeline = IdentifyTryJobCulpritPipeline()
166 culprit = pipeline.run(
167 master_name, builder_name, build_number, ['rev1', 'rev2'],
168 TryJobType.TEST, '1', None)
169
170 self.assertIsNone(culprit)
171
172 def testIdentifyCulpritForTestTryJobReturnNoneIfNoRevisionToCheck(self):
173 master_name = 'm'
174 builder_name = 'b'
175 build_number = 1
176 test_result = {
177 'result': {
178 'rev1': {
179 'a_test': {
180 'status': 'failed',
181 'valid': True,
182 'failures': ['a_test1']
183 }
184 }
185 },
186 'url': 'url',
187 'try_job_id': '1'
188 }
189
190 try_job = WfTryJob.Create(master_name, builder_name, build_number)
191 try_job.status = wf_analysis_status.ANALYZING
192 try_job.put()
193
194 pipeline = IdentifyTryJobCulpritPipeline()
195 culprit = pipeline.run(
196 master_name, builder_name, build_number, [], TryJobType.TEST, '1',
197 test_result)
198
199 self.assertIsNone(culprit)
200
201 def testIdentifyCulpritForTestTryJobReturnNoneIfNoCulpritInfo(self):
202 master_name = 'm'
203 builder_name = 'b'
204 build_number = 1
205 test_result = {
206 'result': {
207 'rev3': {
208 'a_test': {
209 'status': 'failed',
210 'valid': True,
211 'failures': ['a_test1']
212 }
213 }
214 },
215 'url': 'url',
216 'try_job_id': '1'
217 }
218
219 try_job = WfTryJob.Create(master_name, builder_name, build_number)
220 try_job.status = wf_analysis_status.ANALYZING
221 try_job.put()
222
223 pipeline = IdentifyTryJobCulpritPipeline()
224 culprit = pipeline.run(
225 master_name, builder_name, build_number, ['rev3'], TryJobType.TEST,
226 '1', test_result)
227
228 self.assertIsNone(culprit)
229
230 def testIdentifyCulpritForTestTryJobSuccess(self):
231 master_name = 'm'
232 builder_name = 'b'
233 build_number = 1
234 test_result = {
235 'result': {
236 'rev1': {
237 'a_test': {
238 'status': 'failed',
239 'valid': True,
240 'failures': ['a_test1']
241 },
242 'b_test': {
243 'status': 'failed',
244 'valid': True,
245 'failures': ['b_test1']
246 },
247 'c_test': {
248 'status': 'passed',
249 'valid': True
250 }
251 },
252 'rev2': {
253 'a_test': {
254 'status': 'failed',
255 'valid': True,
256 'failures': ['a_test1', 'a_test2']
257 },
258 'b_test': {
259 'status': 'passed',
260 'valid': True
261 },
262 'c_test': {
263 'status': 'failed',
264 'valid': True,
265 'failures': []
266 }
267 }
268 },
269 'url': 'url',
270 'try_job_id': '1'
271 }
272
273 try_job = WfTryJob.Create(master_name, builder_name, build_number)
274 try_job.status = wf_analysis_status.ANALYZING
275 try_job.test_results = [test_result]
276 try_job.put()
277
278 self.mock(GitRepository, 'GetChangeLog', self._MockGetChangeLog)
279
280 pipeline = IdentifyTryJobCulpritPipeline()
281 culprit = pipeline.run(
282 master_name, builder_name, build_number, ['rev1', 'rev2'],
283 TryJobType.TEST, '1', test_result)
284
285 expected_test_result = {
stgao 2016/01/29 18:55:02 style nit: too many space.
chanli 2016/01/30 02:22:37 Done.
286 'result': {
287 'rev1': {
288 'a_test': {
289 'status': 'failed',
290 'valid': True,
291 'failures': ['a_test1']
292 },
293 'b_test': {
294 'status': 'failed',
295 'valid': True,
296 'failures': ['b_test1']
297 },
298 'c_test': {
299 'status': 'passed',
300 'valid': True
301 }
302 },
303 'rev2': {
304 'a_test': {
305 'status': 'failed',
306 'valid': True,
307 'failures': ['a_test1', 'a_test2']
308 },
309 'b_test': {
310 'status': 'passed',
311 'valid': True
312 },
313 'c_test': {
314 'status': 'failed',
315 'valid': True,
316 'failures': []
317 }
318 }
319 },
320 'url': 'url',
321 'try_job_id': '1',
322 'culprit': {
323 'a_test': {
324 'tests': {
325 'a_test1': {
326 'revision': 'rev1',
327 'commit_position': '1',
328 'review_url': 'url_1'
329 },
330 'a_test2': {
331 'revision': 'rev2',
332 'commit_position': '2',
333 'review_url': 'url_2'
334 }
335 }
336 },
337 'b_test': {
338 'tests': {
339 'b_test1': {
340 'revision': 'rev1',
341 'commit_position': '1',
342 'review_url': 'url_1'
343 }
344 }
345 },
346 'c_test': {
347 'revision': 'rev2',
348 'commit_position': '2',
349 'review_url': 'url_2',
350 'tests': {}
351 }
352 }
353 }
354
355 self.assertEqual(expected_test_result['culprit'], culprit)
356
357 try_job = WfTryJob.Get(master_name, builder_name, build_number)
358 self.assertEqual(expected_test_result, try_job.test_results[-1])
359 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698