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

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

Issue 1870103003: [Findit] Adding Try Job suspected CLs and result status to analysis (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Created 4 years, 8 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_result_status
8 from model import wf_analysis_status 9 from model import wf_analysis_status
10 from model.wf_analysis import WfAnalysis
9 from model.wf_try_job import WfTryJob 11 from model.wf_try_job import WfTryJob
10 from model.wf_try_job_data import WfTryJobData 12 from model.wf_try_job_data import WfTryJobData
13 from waterfall import identify_try_job_culprit_pipeline
11 from waterfall.identify_try_job_culprit_pipeline import( 14 from waterfall.identify_try_job_culprit_pipeline import(
12 IdentifyTryJobCulpritPipeline) 15 IdentifyTryJobCulpritPipeline)
13 from waterfall.try_job_type import TryJobType 16 from waterfall.try_job_type import TryJobType
14 17
15 18
16 class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase): 19 class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase):
17 20
18 def _MockGetChangeLog(self, revision): 21 def _MockGetChangeLog(self, revision):
19 class MockedChangeLog(object): 22 class MockedChangeLog(object):
20 23
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 IdentifyTryJobCulpritPipeline._GetFailedRevisionFromCompileResult( 72 IdentifyTryJobCulpritPipeline._GetFailedRevisionFromCompileResult(
70 { 73 {
71 'report': { 74 'report': {
72 'result': { 75 'result': {
73 'rev1': 'passed', 76 'rev1': 'passed',
74 'rev2': 'failed' 77 'rev2': 'failed'
75 } 78 }
76 } 79 }
77 })) 80 }))
78 81
82 def testGetResultanalysisStatusWithTryJobCulpritNotFoundUntriaged(self):
83 # Heuristic analysis provided no results, but the try job found a culprit.
84 analysis = WfAnalysis.Create('m', 'b', 1)
85 analysis.result_status = wf_analysis_result_status.NOT_FOUND_UNTRIAGED
86 analysis.put()
87
88 result = {
89 'culprit': {
90 'compile': {
91 'revision': 'rev1',
92 'commit_position': '1',
93 'review_url': 'url_1',
94 'repo_name': 'chromium'
95 }
96 }
97 }
98
99 status = identify_try_job_culprit_pipeline._GetResultAnalysisStatus(
100 analysis, result)
101
102 self.assertEqual(status, wf_analysis_result_status.FOUND_UNTRIAGED)
103
104 def testGetResultanalysisStatusWithTryJobCulpritNotFoundCorrect(self):
105 # Heuristic analysis found no results, which was correct. In this case, the
106 # try job result is actually a false positive.
107 analysis = WfAnalysis.Create('m', 'b', 1)
108 analysis.result_status = wf_analysis_result_status.NOT_FOUND_CORRECT
109 analysis.put()
110
111 result = {
112 'culprit': {
113 'compile': {
114 'revision': 'rev1',
115 'commit_position': '1',
116 'review_url': 'url_1',
117 'repo_name': 'chromium'
118 }
119 }
120 }
121
122 status = identify_try_job_culprit_pipeline._GetResultAnalysisStatus(
123 analysis, result)
124
125 self.assertEqual(status, wf_analysis_result_status.FOUND_UNTRIAGED)
126
127 def testGetResultanalysisStatusWithTryJobCulpritNotFoundIncorrect(self):
128 # Heuristic analysis found no results and was triaged to incorrect before a
129 # try job result was found. In this case the try job result should override
130 # the heuristic result.
131 analysis = WfAnalysis.Create('m', 'b', 1)
132 analysis.result_status = wf_analysis_result_status.NOT_FOUND_INCORRECT
133 analysis.put()
134
135 result = {
136 'culprit': {
137 'compile': {
138 'revision': 'rev1',
139 'commit_position': '1',
140 'review_url': 'url_1',
141 'repo_name': 'chromium'
142 }
143 }
144 }
145
146 status = identify_try_job_culprit_pipeline._GetResultAnalysisStatus(
147 analysis, result)
148
149 self.assertEqual(status, wf_analysis_result_status.FOUND_UNTRIAGED)
150
151 def testGetResultanalysisStatusWithTryJobCulpritNoHeuristicResult(self):
152 # In this case, the try job found a result before the heuristic result is
153 # available. This case should generally never happen, as heuristic analysis
154 # is usually much faster than try jobs.
155 analysis = WfAnalysis.Create('m', 'b', 1)
156 analysis.put()
157
158 result = {
159 'culprit': {
160 'compile': {
161 'revision': 'rev1',
162 'commit_position': '1',
163 'review_url': 'url_1',
164 'repo_name': 'chromium'
165 }
166 }
167 }
168
169 status = identify_try_job_culprit_pipeline._GetResultAnalysisStatus(
170 analysis, result)
171
172 self.assertEqual(status, wf_analysis_result_status.FOUND_UNTRIAGED)
173
174 def testGetResultanalysisStatusWithNoTryJobCulpritNoHeuristicResult(self):
175 # In this case, the try job completed faster than heuristic analysis
176 # (which should never happen) but no results were found.
177 analysis = WfAnalysis.Create('m', 'b', 1)
178 analysis.put()
179
180 result = {}
181
182 status = identify_try_job_culprit_pipeline._GetResultAnalysisStatus(
183 analysis, result)
184 self.assertEqual(status, wf_analysis_result_status.NOT_FOUND_UNTRIAGED)
185
186 def testGetResultanalysisStatusWithTryJobCulpritAndHeuristicResult(self):
187 # In this case, heuristic analysis found the correct culprit. The try job
188 # result should not overwrite it.
189 analysis = WfAnalysis.Create('m', 'b', 1)
190 analysis.result_status = wf_analysis_result_status.FOUND_CORRECT
191 analysis.put()
192
193 result = {
194 'culprit': {
195 'compile': {
196 'revision': 'rev1',
197 'commit_position': '1',
198 'review_url': 'url_1',
199 'repo_name': 'chromium'
200 }
201 }
202 }
203
204 status = identify_try_job_culprit_pipeline._GetResultAnalysisStatus(
205 analysis, result)
206 self.assertEqual(status, wf_analysis_result_status.FOUND_CORRECT)
207
208 def testGetSuspectedCLsForCompileTryJob(self):
209 heuristic_suspected_cl = {
210 'revision': 'rev1',
211 'commit_position': '1',
212 'review_url': 'url_1',
213 'repo_name': 'chromium'
214 }
215
216 compile_suspected_cl = {
217 'revision': 'rev2',
218 'commit_position': '2',
219 'review_url': 'url_2',
220 'repo_name': 'chromium'
221 }
222
223 analysis = WfAnalysis.Create('m', 'b', 1)
224 analysis.suspected_cls = [heuristic_suspected_cl]
225 analysis.put()
226
227 result = {
228 'culprit': {
229 'compile': compile_suspected_cl
230 }
231 }
232
233 self.assertEqual(
234 identify_try_job_culprit_pipeline._GetSuspectedCLs(analysis, result),
235 [heuristic_suspected_cl, compile_suspected_cl])
236
237 def testGetSuspectedCLsForTestTryJobAndHeuristicResultsSame(self):
238 suspected_cl = {
239 'revision': 'rev1',
240 'commit_position': '1',
241 'review_url': 'url_1',
242 'repo_name': 'chromium'
243 }
244
245 analysis = WfAnalysis.Create('m', 'b', 1)
246 analysis.suspected_cls = [suspected_cl]
247 analysis.put()
248
249 result = {
250 'culprit': {
251 'compile': suspected_cl
252 }
253 }
254
255 self.assertEqual(
256 identify_try_job_culprit_pipeline._GetSuspectedCLs(analysis, result),
257 [suspected_cl])
258
259 def testGetSuspectedCLsForTestTryJob(self):
260 suspected_cl1 = {
261 'revision': 'rev1',
262 'commit_position': '1',
263 'review_url': 'url_1',
264 'repo_name': 'chromium'
265 }
266 suspected_cl2 = {
267 'revision': 'rev2',
268 'commit_position': '2',
269 'review_url': 'url_2',
270 'repo_name': 'chromium'
271 }
272 suspected_cl3 = {
273 'revision': 'rev3',
274 'commit_position': '3',
275 'review_url': 'url_3',
276 'repo_name': 'chromium'
277 }
278
279 analysis = WfAnalysis.Create('m', 'b', 1)
280 analysis.suspected_cls = []
281 analysis.put()
282
283 result = {
284 'culprit': {
285 'a_test': {
286 'tests': {
287 'a_test1': suspected_cl1,
288 'a_test2': suspected_cl1
289 }
290 },
291 'b_test': {
292 'tests': {
293 'b_test1': suspected_cl2
294 }
295 },
296 'c_test': {
297 'revision': 'rev3',
298 'commit_position': '3',
299 'review_url': 'url_3',
300 'repo_name': 'chromium',
301 'tests': {}
302 }
303 }
304 }
305
306 self.assertEqual(
307 identify_try_job_culprit_pipeline._GetSuspectedCLs(analysis, result),
308 [suspected_cl3, suspected_cl2, suspected_cl1])
309
79 def testIdentifyCulpritForCompileTryJobNoCulprit(self): 310 def testIdentifyCulpritForCompileTryJobNoCulprit(self):
80 master_name = 'm' 311 master_name = 'm'
81 builder_name = 'b' 312 builder_name = 'b'
82 build_number = 1 313 build_number = 1
83 try_job_id = '1' 314 try_job_id = '1'
84 315
85 try_job = WfTryJob.Create(master_name, builder_name, build_number) 316 try_job = WfTryJob.Create(master_name, builder_name, build_number)
86 try_job.put() 317 try_job.put()
87 try_job_data = WfTryJobData.Create(try_job_id) 318 try_job_data = WfTryJobData.Create(try_job_id)
88 try_job_data.put() 319 try_job_data.put()
89 320
321 analysis = WfAnalysis.Create(master_name, builder_name, build_number)
322 analysis.put()
323
90 pipeline = IdentifyTryJobCulpritPipeline() 324 pipeline = IdentifyTryJobCulpritPipeline()
91 culprit = pipeline.run( 325 culprit = pipeline.run(
92 master_name, builder_name, build_number, ['rev1'], 326 master_name, builder_name, build_number, ['rev1'],
93 TryJobType.COMPILE, '1', None) 327 TryJobType.COMPILE, '1', None)
94 try_job = WfTryJob.Get(master_name, builder_name, build_number) 328 try_job = WfTryJob.Get(master_name, builder_name, build_number)
95 329
96 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) 330 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status)
97 self.assertEqual([], try_job.compile_results) 331 self.assertEqual([], try_job.compile_results)
98 self.assertIsNone(culprit) 332 self.assertIsNone(culprit)
99 self.assertIsNone(try_job_data.culprits) 333 self.assertIsNone(try_job_data.culprits)
334 self.assertEqual(analysis.result_status,
335 wf_analysis_result_status.NOT_FOUND_UNTRIAGED)
336 self.assertEqual(analysis.suspected_cls, [])
100 337
101 def testIdentifyCulpritForCompileTryJobSuccess(self): 338 def testIdentifyCulpritForCompileTryJobSuccess(self):
102 master_name = 'm' 339 master_name = 'm'
103 builder_name = 'b' 340 builder_name = 'b'
104 build_number = 1 341 build_number = 1
105 try_job_id = '1' 342 try_job_id = '1'
106 343
107 compile_result = { 344 compile_result = {
108 'report': { 345 'report': {
109 'result': { 346 'result': {
(...skipping 11 matching lines...) Expand all
121 try_job.compile_results = [{ 358 try_job.compile_results = [{
122 'report': { 359 'report': {
123 'result': { 360 'result': {
124 'rev1': 'passed', 361 'rev1': 'passed',
125 'rev2': 'failed' 362 'rev2': 'failed'
126 }, 363 },
127 }, 364 },
128 'try_job_id': try_job_id, 365 'try_job_id': try_job_id,
129 }] 366 }]
130 try_job.put() 367 try_job.put()
368 analysis = WfAnalysis.Create(master_name, builder_name, build_number)
369 analysis.put()
131 370
132 pipeline = IdentifyTryJobCulpritPipeline() 371 pipeline = IdentifyTryJobCulpritPipeline()
133 culprit = pipeline.run( 372 culprit = pipeline.run(
134 master_name, builder_name, build_number, ['rev1'], 373 master_name, builder_name, build_number, ['rev1'],
135 TryJobType.COMPILE, '1', compile_result) 374 TryJobType.COMPILE, '1', compile_result)
136 375
137 expected_culprit = 'rev2' 376 expected_culprit = 'rev2'
377 expected_suspected_cl = {
378 'revision': 'rev2',
379 'commit_position': '2',
380 'review_url': 'url_2',
381 'repo_name': 'chromium'
382 }
138 expected_compile_result = { 383 expected_compile_result = {
139 'report': { 384 'report': {
140 'result': { 385 'result': {
141 'rev1': 'passed', 386 'rev1': 'passed',
142 'rev2': 'failed' 387 'rev2': 'failed'
143 } 388 }
144 }, 389 },
145 'try_job_id': try_job_id, 390 'try_job_id': try_job_id,
146 'culprit': { 391 'culprit': {
147 'compile': { 392 'compile': expected_suspected_cl
148 'revision': 'rev2',
149 'commit_position': '2',
150 'review_url': 'url_2'
151 }
152 } 393 }
153 } 394 }
154 395
155 self.assertEqual(expected_compile_result['culprit'], culprit) 396 self.assertEqual(expected_compile_result['culprit'], culprit)
156 397
157 try_job = WfTryJob.Get(master_name, builder_name, build_number) 398 try_job = WfTryJob.Get(master_name, builder_name, build_number)
158 self.assertEqual(expected_compile_result, try_job.compile_results[-1]) 399 self.assertEqual(expected_compile_result, try_job.compile_results[-1])
159 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) 400 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status)
160 401
161 try_job_data = WfTryJobData.Get(try_job_id) 402 try_job_data = WfTryJobData.Get(try_job_id)
162 self.assertEqual({'compile': expected_culprit}, try_job_data.culprits) 403 self.assertEqual({'compile': expected_culprit}, try_job_data.culprits)
404 self.assertEqual(analysis.result_status,
405 wf_analysis_result_status.FOUND_UNTRIAGED)
406 self.assertEqual(analysis.suspected_cls,
407 [expected_suspected_cl])
163 408
164 def testIdentifyCulpritForCompileReturnNoneIfAllPassed(self): 409 def testIdentifyCulpritForCompileReturnNoneIfAllPassed(self):
165 master_name = 'm' 410 master_name = 'm'
166 builder_name = 'b' 411 builder_name = 'b'
167 build_number = 1 412 build_number = 1
168 try_job_id = '1' 413 try_job_id = '1'
169 414
170 compile_result = { 415 compile_result = {
171 'report': { 416 'report': {
172 'result': { 417 'result': {
173 'rev1': 'passed', 418 'rev1': 'passed',
174 'rev2': 'passed' 419 'rev2': 'passed'
175 } 420 }
176 }, 421 },
177 'url': 'url', 422 'url': 'url',
178 'try_job_id': try_job_id, 423 'try_job_id': try_job_id,
179 } 424 }
180 425
181 WfTryJobData.Create(try_job_id).put() 426 WfTryJobData.Create(try_job_id).put()
182 WfTryJob.Create(master_name, builder_name, build_number).put() 427 WfTryJob.Create(master_name, builder_name, build_number).put()
428 analysis = WfAnalysis.Create(master_name, builder_name, build_number)
429 analysis.put()
183 430
184 pipeline = IdentifyTryJobCulpritPipeline() 431 pipeline = IdentifyTryJobCulpritPipeline()
185 culprit = pipeline.run( 432 culprit = pipeline.run(
186 master_name, builder_name, build_number, ['rev1'], 433 master_name, builder_name, build_number, ['rev1'],
187 TryJobType.COMPILE, '1', compile_result) 434 TryJobType.COMPILE, '1', compile_result)
188 try_job = WfTryJob.Get(master_name, builder_name, build_number) 435 try_job = WfTryJob.Get(master_name, builder_name, build_number)
189 436
190 self.assertIsNone(culprit) 437 self.assertIsNone(culprit)
191 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) 438 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status)
192 439
193 try_job_data = WfTryJobData.Get(try_job_id) 440 try_job_data = WfTryJobData.Get(try_job_id)
194 self.assertIsNone(try_job_data.culprits) 441 self.assertIsNone(try_job_data.culprits)
195 442
443 self.assertEqual(analysis.result_status,
444 wf_analysis_result_status.NOT_FOUND_UNTRIAGED)
445 self.assertEqual(analysis.suspected_cls, [])
446
196 def testIdentifyCulpritForTestTryJobReturnNoneIfNoTryJobResult(self): 447 def testIdentifyCulpritForTestTryJobReturnNoneIfNoTryJobResult(self):
197 master_name = 'm' 448 master_name = 'm'
198 builder_name = 'b' 449 builder_name = 'b'
199 build_number = 1 450 build_number = 1
200 try_job_id = '1' 451 try_job_id = '1'
201 452
202 WfTryJobData.Create(try_job_id).put() 453 WfTryJobData.Create(try_job_id).put()
203 try_job = WfTryJob.Create(master_name, builder_name, build_number) 454 try_job = WfTryJob.Create(master_name, builder_name, build_number)
204 try_job.status = wf_analysis_status.ANALYZING 455 try_job.status = wf_analysis_status.ANALYZING
205 try_job.put() 456 try_job.put()
457 analysis = WfAnalysis.Create(master_name, builder_name, build_number)
458 analysis.put()
206 459
207 pipeline = IdentifyTryJobCulpritPipeline() 460 pipeline = IdentifyTryJobCulpritPipeline()
208 culprit = pipeline.run( 461 culprit = pipeline.run(
209 master_name, builder_name, build_number, ['rev1', 'rev2'], 462 master_name, builder_name, build_number, ['rev1', 'rev2'],
210 TryJobType.TEST, '1', None) 463 TryJobType.TEST, '1', None)
211 464
212 self.assertIsNone(culprit) 465 self.assertIsNone(culprit)
213 466
214 try_job_data = WfTryJobData.Get(try_job_id) 467 try_job_data = WfTryJobData.Get(try_job_id)
215 self.assertIsNone(try_job_data.culprits) 468 self.assertIsNone(try_job_data.culprits)
469 self.assertEqual(analysis.result_status,
470 wf_analysis_result_status.NOT_FOUND_UNTRIAGED)
471 self.assertEqual(analysis.suspected_cls, [])
216 472
217 def testIdentifyCulpritForTestTryJobReturnNoneIfNoRevisionToCheck(self): 473 def testIdentifyCulpritForTestTryJobReturnNoneIfNoRevisionToCheck(self):
218 master_name = 'm' 474 master_name = 'm'
219 builder_name = 'b' 475 builder_name = 'b'
220 build_number = 1 476 build_number = 1
221 try_job_id = '1' 477 try_job_id = '1'
222 478
223 test_result = { 479 test_result = {
224 'report': { 480 'report': {
225 'result': { 481 'result': {
226 'rev1': { 482 'rev1': {
227 'a_test': { 483 'a_test': {
228 'status': 'failed', 484 'status': 'failed',
229 'valid': True, 485 'valid': True,
230 'failures': ['a_test1'] 486 'failures': ['a_test1']
231 } 487 }
232 } 488 }
233 } 489 }
234 }, 490 },
235 'url': 'url', 491 'url': 'url',
236 'try_job_id': try_job_id 492 'try_job_id': try_job_id
237 } 493 }
238 494
239 WfTryJobData.Create(try_job_id).put() 495 WfTryJobData.Create(try_job_id).put()
240 try_job = WfTryJob.Create(master_name, builder_name, build_number) 496 try_job = WfTryJob.Create(master_name, builder_name, build_number)
241 try_job.status = wf_analysis_status.ANALYZING 497 try_job.status = wf_analysis_status.ANALYZING
242 try_job.put() 498 try_job.put()
499 analysis = WfAnalysis.Create(master_name, builder_name, build_number)
500 analysis.put()
243 501
244 pipeline = IdentifyTryJobCulpritPipeline() 502 pipeline = IdentifyTryJobCulpritPipeline()
245 culprit = pipeline.run( 503 culprit = pipeline.run(
246 master_name, builder_name, build_number, [], TryJobType.TEST, '1', 504 master_name, builder_name, build_number, [], TryJobType.TEST, '1',
247 test_result) 505 test_result)
248 506
249 self.assertIsNone(culprit) 507 self.assertIsNone(culprit)
250 508
251 try_job_data = WfTryJobData.Get(try_job_id) 509 try_job_data = WfTryJobData.Get(try_job_id)
252 self.assertIsNone(try_job_data.culprits) 510 self.assertIsNone(try_job_data.culprits)
253 511
512 self.assertEqual(analysis.result_status,
513 wf_analysis_result_status.NOT_FOUND_UNTRIAGED)
514 self.assertEqual(analysis.suspected_cls, [])
515
254 def testIdentifyCulpritForTestTryJobReturnRevisionIfNoCulpritInfo(self): 516 def testIdentifyCulpritForTestTryJobReturnRevisionIfNoCulpritInfo(self):
255 master_name = 'm' 517 master_name = 'm'
256 builder_name = 'b' 518 builder_name = 'b'
257 build_number = 1 519 build_number = 1
258 try_job_id = '1' 520 try_job_id = '1'
259 521
260 test_result = { 522 test_result = {
261 'report': { 523 'report': {
262 'result': { 524 'result': {
263 'rev3': { 525 'rev3': {
264 'a_test': { 526 'a_test': {
265 'status': 'failed', 527 'status': 'failed',
266 'valid': True, 528 'valid': True,
267 'failures': ['a_test1'] 529 'failures': ['a_test1']
268 } 530 }
269 } 531 }
270 } 532 }
271 }, 533 },
272 'url': 'url', 534 'url': 'url',
273 'try_job_id': try_job_id 535 'try_job_id': try_job_id
274 } 536 }
275 537
276 WfTryJobData.Create(try_job_id).put() 538 WfTryJobData.Create(try_job_id).put()
277 try_job = WfTryJob.Create(master_name, builder_name, build_number) 539 try_job = WfTryJob.Create(master_name, builder_name, build_number)
278 try_job.status = wf_analysis_status.ANALYZING 540 try_job.status = wf_analysis_status.ANALYZING
279 try_job.put() 541 try_job.put()
542 analysis = WfAnalysis.Create(master_name, builder_name, build_number)
543 analysis.put()
280 544
281 pipeline = IdentifyTryJobCulpritPipeline() 545 pipeline = IdentifyTryJobCulpritPipeline()
282 culprit = pipeline.run( 546 culprit = pipeline.run(
283 master_name, builder_name, build_number, ['rev3'], TryJobType.TEST, 547 master_name, builder_name, build_number, ['rev3'], TryJobType.TEST,
284 '1', test_result) 548 '1', test_result)
285 549
550 expected_suspected_cl = {
551 'revision': 'rev3',
552 'repo_name': 'chromium'
553 }
554
286 expected_culprit = { 555 expected_culprit = {
287 'a_test': { 556 'a_test': {
288 'tests': { 557 'tests': {
289 'a_test1': { 558 'a_test1': expected_suspected_cl
290 'revision': 'rev3'
291 }
292 } 559 }
293 } 560 }
294 } 561 }
295 self.assertEqual(expected_culprit, culprit) 562 self.assertEqual(expected_culprit, culprit)
296 563
297 try_job_data = WfTryJobData.Get(try_job_id) 564 try_job_data = WfTryJobData.Get(try_job_id)
298 expected_culprit_data = { 565 expected_culprit_data = {
299 'a_test': { 566 'a_test': {
300 'a_test1': 'rev3' 567 'a_test1': 'rev3'
301 } 568 }
302 } 569 }
303 self.assertEqual(expected_culprit_data, try_job_data.culprits) 570 self.assertEqual(expected_culprit_data, try_job_data.culprits)
571 self.assertEqual(analysis.result_status,
572 wf_analysis_result_status.FOUND_UNTRIAGED)
573 self.assertEqual(analysis.suspected_cls, [expected_suspected_cl])
304 574
305 def testIdentifyCulpritForTestTryJobSuccess(self): 575 def testIdentifyCulpritForTestTryJobSuccess(self):
306 master_name = 'm' 576 master_name = 'm'
307 builder_name = 'b' 577 builder_name = 'b'
308 build_number = 1 578 build_number = 1
309 try_job_id = '1' 579 try_job_id = '1'
310 580
311 test_result = { 581 test_result = {
312 'report': { 582 'report': {
313 'result': { 583 'result': {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 }, 617 },
348 'url': 'url', 618 'url': 'url',
349 'try_job_id': try_job_id 619 'try_job_id': try_job_id
350 } 620 }
351 621
352 WfTryJobData.Create(try_job_id).put() 622 WfTryJobData.Create(try_job_id).put()
353 try_job = WfTryJob.Create(master_name, builder_name, build_number) 623 try_job = WfTryJob.Create(master_name, builder_name, build_number)
354 try_job.status = wf_analysis_status.ANALYZING 624 try_job.status = wf_analysis_status.ANALYZING
355 try_job.test_results = [test_result] 625 try_job.test_results = [test_result]
356 try_job.put() 626 try_job.put()
627 analysis = WfAnalysis.Create(master_name, builder_name, build_number)
628 analysis.put()
357 629
358 pipeline = IdentifyTryJobCulpritPipeline() 630 pipeline = IdentifyTryJobCulpritPipeline()
359 culprit = pipeline.run( 631 culprit = pipeline.run(
360 master_name, builder_name, build_number, ['rev1', 'rev2'], 632 master_name, builder_name, build_number, ['rev1', 'rev2'],
361 TryJobType.TEST, '1', test_result) 633 TryJobType.TEST, '1', test_result)
362 634
635 a_test1_suspected_cl = {
636 'revision': 'rev1',
637 'commit_position': '1',
638 'review_url': 'url_1',
639 'repo_name': 'chromium'
640 }
641 a_test2_suspected_cl = {
642 'revision': 'rev2',
643 'commit_position': '2',
644 'review_url': 'url_2',
645 'repo_name': 'chromium'
646 }
647 b_test1_suspected_cl = a_test1_suspected_cl
648
363 expected_test_result = { 649 expected_test_result = {
364 'report': { 650 'report': {
365 'result': { 651 'result': {
366 'rev1': { 652 'rev1': {
367 'a_test': { 653 'a_test': {
368 'status': 'failed', 654 'status': 'failed',
369 'valid': True, 655 'valid': True,
370 'failures': ['a_test1'] 656 'failures': ['a_test1']
371 }, 657 },
372 'b_test': { 658 'b_test': {
(...skipping 22 matching lines...) Expand all
395 'failures': [] 681 'failures': []
396 } 682 }
397 } 683 }
398 } 684 }
399 }, 685 },
400 'url': 'url', 686 'url': 'url',
401 'try_job_id': try_job_id, 687 'try_job_id': try_job_id,
402 'culprit': { 688 'culprit': {
403 'a_test': { 689 'a_test': {
404 'tests': { 690 'tests': {
405 'a_test1': { 691 'a_test1': a_test1_suspected_cl,
406 'revision': 'rev1', 692 'a_test2': a_test2_suspected_cl
407 'commit_position': '1',
408 'review_url': 'url_1'
409 },
410 'a_test2': {
411 'revision': 'rev2',
412 'commit_position': '2',
413 'review_url': 'url_2'
414 }
415 } 693 }
416 }, 694 },
417 'b_test': { 695 'b_test': {
418 'tests': { 696 'tests': {
419 'b_test1': { 697 'b_test1': b_test1_suspected_cl
420 'revision': 'rev1',
421 'commit_position': '1',
422 'review_url': 'url_1'
423 }
424 } 698 }
425 }, 699 },
426 'c_test': { 700 'c_test': {
427 'revision': 'rev2', 701 'revision': 'rev2',
428 'commit_position': '2', 702 'commit_position': '2',
429 'review_url': 'url_2', 703 'review_url': 'url_2',
704 'repo_name': 'chromium',
430 'tests': {} 705 'tests': {}
431 } 706 }
432 } 707 }
433 } 708 }
434 709
435 self.assertEqual(expected_test_result['culprit'], culprit) 710 self.assertEqual(expected_test_result['culprit'], culprit)
436 711
437 try_job = WfTryJob.Get(master_name, builder_name, build_number) 712 try_job = WfTryJob.Get(master_name, builder_name, build_number)
438 self.assertEqual(expected_test_result, try_job.test_results[-1]) 713 self.assertEqual(expected_test_result, try_job.test_results[-1])
439 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) 714 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status)
440 715
441 try_job_data = WfTryJobData.Get(try_job_id) 716 try_job_data = WfTryJobData.Get(try_job_id)
442 expected_culprit_data = { 717 expected_culprit_data = {
443 'a_test': { 718 'a_test': {
444 'a_test1': 'rev1', 719 'a_test1': 'rev1',
445 'a_test2': 'rev2', 720 'a_test2': 'rev2',
446 }, 721 },
447 'b_test': { 722 'b_test': {
448 'b_test1': 'rev1', 723 'b_test1': 'rev1',
449 }, 724 },
450 'c_test': 'rev2' 725 'c_test': 'rev2'
451 } 726 }
452 self.assertEqual(expected_culprit_data, try_job_data.culprits) 727 self.assertEqual(expected_culprit_data, try_job_data.culprits)
728 self.assertEqual(analysis.result_status,
729 wf_analysis_result_status.FOUND_UNTRIAGED)
730 self.assertEqual(analysis.suspected_cls,
731 [a_test2_suspected_cl, a_test1_suspected_cl])
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698