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

Side by Side Diff: appengine/findit/handlers/test/check_duplicate_failures_test.py

Issue 1866883002: [Findit] A huge refactoring and some bug fixing. (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Fix nit. 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 import webapp2 5 import webapp2
6 6
7 from testing_utils import testing 7 from testing_utils import testing
8 8
9 from handlers import check_duplicate_failures 9 from handlers import check_duplicate_failures
10 from model.wf_analysis import WfAnalysis 10 from model.wf_analysis import WfAnalysis
11 from model import wf_analysis_result_status 11 from model import result_status
12 12
13 13
14 class CheckDuplicateFailuresTest(testing.AppengineTestCase): 14 class CheckDuplicateFailuresTest(testing.AppengineTestCase):
15 app_module = webapp2.WSGIApplication( 15 app_module = webapp2.WSGIApplication(
16 [('/check-duplicate-failures', 16 [('/check-duplicate-failures',
17 check_duplicate_failures.CheckDuplicateFailures), ], debug=True) 17 check_duplicate_failures.CheckDuplicateFailures), ], debug=True)
18 18
19 def _CreateAnalyses(self, master_name, builder_name, count): 19 def _CreateAnalyses(self, master_name, builder_name, count):
20 analyses = [] 20 analyses = []
21 for i in range(0, count): 21 for i in range(0, count):
(...skipping 22 matching lines...) Expand all
44 'suspected_cls': [], 44 'suspected_cls': [],
45 } 45 }
46 ] 46 ]
47 } 47 }
48 analysis.suspected_cls = [{ 48 analysis.suspected_cls = [{
49 'repo_name': 'chromium', 49 'repo_name': 'chromium',
50 'revision': 'r99_1', 50 'revision': 'r99_1',
51 'commit_position': 123, 51 'commit_position': 123,
52 'url': None 52 'url': None
53 }] 53 }]
54 analysis.result_status = wf_analysis_result_status.FOUND_UNTRIAGED 54 analysis.result_status = result_status.FOUND_UNTRIAGED
55 analysis.put() 55 analysis.put()
56 analyses.append(analysis) 56 analyses.append(analysis)
57 return analyses 57 return analyses
58 58
59 def testCheckDuplicateFailuresHandler(self): 59 def testCheckDuplicateFailuresHandler(self):
60 self._CreateAnalyses('m', 'b', 5) 60 self._CreateAnalyses('m', 'b', 5)
61 self.mock_current_user(user_email='test@google.com', is_admin=True) 61 self.mock_current_user(user_email='test@google.com', is_admin=True)
62 response = self.test_app.get('/check-duplicate-failures') 62 response = self.test_app.get('/check-duplicate-failures')
63 self.assertEqual(200, response.status_int) 63 self.assertEqual(200, response.status_int)
64 64
(...skipping 29 matching lines...) Expand all
94 'chromium,r99_1': ['a'] 94 'chromium,r99_1': ['a']
95 } 95 }
96 failed_steps = check_duplicate_failures._GetFailedStepsForEachCL(analysis) 96 failed_steps = check_duplicate_failures._GetFailedStepsForEachCL(analysis)
97 self.assertEqual(expected_failed_steps, failed_steps) 97 self.assertEqual(expected_failed_steps, failed_steps)
98 98
99 def testGetFailedStepsForEachCLNoFailures(self): 99 def testGetFailedStepsForEachCLNoFailures(self):
100 analysis = WfAnalysis.Create('m', 'b', 0) 100 analysis = WfAnalysis.Create('m', 'b', 0)
101 analysis.result = { 101 analysis.result = {
102 'failures': [] 102 'failures': []
103 } 103 }
104 analysis.result_status = wf_analysis_result_status.FOUND_UNTRIAGED 104 analysis.result_status = result_status.FOUND_UNTRIAGED
105 analysis.put() 105 analysis.put()
106 failed_steps = check_duplicate_failures._GetFailedStepsForEachCL(analysis) 106 failed_steps = check_duplicate_failures._GetFailedStepsForEachCL(analysis)
107 107
108 self.assertEqual({}, failed_steps) 108 self.assertEqual({}, failed_steps)
109 109
110 def testGetFailedStepsForEachCLMultipleFailures(self): 110 def testGetFailedStepsForEachCLMultipleFailures(self):
111 analysis = WfAnalysis.Create('m', 'b', 0) 111 analysis = WfAnalysis.Create('m', 'b', 0)
112 analysis.result = { 112 analysis.result = {
113 'failures': [ 113 'failures': [
114 { 114 {
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 'commit_position': 123, 344 'commit_position': 123,
345 'url': None 345 'url': None
346 }] 346 }]
347 347
348 self.assertFalse(check_duplicate_failures._AnalysesForDuplicateFailures( 348 self.assertFalse(check_duplicate_failures._AnalysesForDuplicateFailures(
349 analysis_one, analysis_two)) 349 analysis_one, analysis_two))
350 350
351 def testModifyStatusIfDuplicateSuccess(self): 351 def testModifyStatusIfDuplicateSuccess(self):
352 analyses = self._CreateAnalyses('m', 'b', 3) 352 analyses = self._CreateAnalyses('m', 'b', 3)
353 353
354 analyses[0].result_status = wf_analysis_result_status.FOUND_INCORRECT 354 analyses[0].result_status = result_status.FOUND_INCORRECT
355 analyses[0].put() 355 analyses[0].put()
356 analyses[2].result_status = wf_analysis_result_status.FOUND_INCORRECT 356 analyses[2].result_status = result_status.FOUND_INCORRECT
357 analyses[2].put() 357 analyses[2].put()
358 358
359 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[1]) 359 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[1])
360 360
361 # Use data in datastore rather than in memory. 361 # Use data in datastore rather than in memory.
362 analysis_two = WfAnalysis.Get('m', 'b', 1) 362 analysis_two = WfAnalysis.Get('m', 'b', 1)
363 self.assertEqual(wf_analysis_result_status.FOUND_INCORRECT_DUPLICATE, 363 self.assertEqual(result_status.FOUND_INCORRECT_DUPLICATE,
364 analysis_two.result_status) 364 analysis_two.result_status)
365 365
366 def testModifyStatusIfDuplicateModifiedMultipleAnalyses(self): 366 def testModifyStatusIfDuplicateModifiedMultipleAnalyses(self):
367 analyses = self._CreateAnalyses('m', 'b', 4) 367 analyses = self._CreateAnalyses('m', 'b', 4)
368 368
369 analyses[0].result_status = wf_analysis_result_status.FOUND_CORRECT 369 analyses[0].result_status = result_status.FOUND_CORRECT
370 analyses[0].put() 370 analyses[0].put()
371 analyses[3].result_status = wf_analysis_result_status.FOUND_CORRECT 371 analyses[3].result_status = result_status.FOUND_CORRECT
372 analyses[3].put() 372 analyses[3].put()
373 373
374 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[1]) 374 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[1])
375 for i in range(1, 3): 375 for i in range(1, 3):
376 analysis = WfAnalysis.Get('m', 'b', i) 376 analysis = WfAnalysis.Get('m', 'b', i)
377 self.assertEqual(wf_analysis_result_status.FOUND_CORRECT_DUPLICATE, 377 self.assertEqual(result_status.FOUND_CORRECT_DUPLICATE,
378 analysis.result_status) 378 analysis.result_status)
379 379
380 def testModifyStatusIfDuplicateSingleAnalysisResult(self): 380 def testModifyStatusIfDuplicateSingleAnalysisResult(self):
381 analyses = self._CreateAnalyses('m', 'b', 1) 381 analyses = self._CreateAnalyses('m', 'b', 1)
382 382
383 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[0]) 383 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[0])
384 384
385 analysis = WfAnalysis.Get('m', 'b', 0) 385 analysis = WfAnalysis.Get('m', 'b', 0)
386 self.assertEqual(wf_analysis_result_status.FOUND_UNTRIAGED, 386 self.assertEqual(result_status.FOUND_UNTRIAGED,
387 analysis.result_status) 387 analysis.result_status)
388 388
389 def testModifyStatusIfDuplicateCheckForTriagedResult(self): 389 def testModifyStatusIfDuplicateCheckForTriagedResult(self):
390 analyses = self._CreateAnalyses('m', 'b', 1) 390 analyses = self._CreateAnalyses('m', 'b', 1)
391 391
392 analyses[0].result_status = wf_analysis_result_status.NOT_FOUND_UNTRIAGED 392 analyses[0].result_status = result_status.NOT_FOUND_UNTRIAGED
393 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[0]) 393 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[0])
394 394
395 analysis = WfAnalysis.Get('m', 'b', 0) 395 analysis = WfAnalysis.Get('m', 'b', 0)
396 self.assertEqual(wf_analysis_result_status.NOT_FOUND_UNTRIAGED, 396 self.assertEqual(result_status.NOT_FOUND_UNTRIAGED,
397 analysis.result_status) 397 analysis.result_status)
398 398
399 def testModifyStatusIfDuplicateFirstResultUntriaged(self): 399 def testModifyStatusIfDuplicateFirstResultUntriaged(self):
400 analyses = self._CreateAnalyses('m', 'b', 3) 400 analyses = self._CreateAnalyses('m', 'b', 3)
401 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[1]) 401 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[1])
402 402
403 analysis_one = WfAnalysis.Get('m', 'b', 1) 403 analysis_one = WfAnalysis.Get('m', 'b', 1)
404 self.assertEqual(wf_analysis_result_status.FOUND_UNTRIAGED, 404 self.assertEqual(result_status.FOUND_UNTRIAGED,
405 analysis_one.result_status) 405 analysis_one.result_status)
406 406
407 def testModifyStatusIfDuplicateDifferentStatuses(self): 407 def testModifyStatusIfDuplicateDifferentStatuses(self):
408 analyses = self._CreateAnalyses('m', 'b', 4) 408 analyses = self._CreateAnalyses('m', 'b', 4)
409 409
410 analyses[0].result_status = wf_analysis_result_status.FOUND_CORRECT 410 analyses[0].result_status = result_status.FOUND_CORRECT
411 analyses[0].put() 411 analyses[0].put()
412 analyses[3].result_status = wf_analysis_result_status.FOUND_INCORRECT 412 analyses[3].result_status = result_status.FOUND_INCORRECT
413 analyses[3].put() 413 analyses[3].put()
414 414
415 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[1]) 415 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[1])
416 416
417 for i in range(1, 3): 417 for i in range(1, 3):
418 analysis = WfAnalysis.Get('m', 'b', i) 418 analysis = WfAnalysis.Get('m', 'b', i)
419 self.assertEqual(wf_analysis_result_status.FOUND_UNTRIAGED, 419 self.assertEqual(result_status.FOUND_UNTRIAGED,
420 analysis.result_status) 420 analysis.result_status)
421 421
422 def testModifyStatusIfDuplicateOnlyOneTriagedEnd(self): 422 def testModifyStatusIfDuplicateOnlyOneTriagedEnd(self):
423 analyses = self._CreateAnalyses('m', 'b', 4) 423 analyses = self._CreateAnalyses('m', 'b', 4)
424 424
425 analyses[0].result_status = wf_analysis_result_status.FOUND_CORRECT 425 analyses[0].result_status = result_status.FOUND_CORRECT
426 analyses[0].put() 426 analyses[0].put()
427 427
428 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[1]) 428 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[1])
429 for i in range(1, 3): 429 for i in range(1, 3):
430 analysis = WfAnalysis.Get('m', 'b', i) 430 analysis = WfAnalysis.Get('m', 'b', i)
431 self.assertEqual(wf_analysis_result_status.FOUND_UNTRIAGED, 431 self.assertEqual(result_status.FOUND_UNTRIAGED,
432 analysis.result_status) 432 analysis.result_status)
433 433
434 def testModifyStatusIfDuplicateExtraFlakyFailure(self): 434 def testModifyStatusIfDuplicateExtraFlakyFailure(self):
435 analyses = self._CreateAnalyses('m', 'b', 5) 435 analyses = self._CreateAnalyses('m', 'b', 5)
436 436
437 analyses[0].result_status = wf_analysis_result_status.FOUND_CORRECT 437 analyses[0].result_status = result_status.FOUND_CORRECT
438 analyses[0].put() 438 analyses[0].put()
439 analyses[4].result_status = wf_analysis_result_status.FOUND_CORRECT 439 analyses[4].result_status = result_status.FOUND_CORRECT
440 analyses[4].put() 440 analyses[4].put()
441 441
442 flaky_failure = { 442 flaky_failure = {
443 'step_name': 'flaky', 443 'step_name': 'flaky',
444 'first_failure': 2, 444 'first_failure': 2,
445 'last_pass': 1, 445 'last_pass': 1,
446 'suspected_cls': [], 446 'suspected_cls': [],
447 } 447 }
448 analyses[2].result['failures'].append(flaky_failure) 448 analyses[2].result['failures'].append(flaky_failure)
449 analyses[2].put() 449 analyses[2].put()
450 450
451 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[1]) 451 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[1])
452 452
453 for i in range(1, 4): 453 for i in range(1, 4):
454 analysis = WfAnalysis.Get('m', 'b', i) 454 analysis = WfAnalysis.Get('m', 'b', i)
455 self.assertEqual(wf_analysis_result_status.FOUND_CORRECT_DUPLICATE, 455 self.assertEqual(result_status.FOUND_CORRECT_DUPLICATE,
456 analysis.result_status) 456 analysis.result_status)
457 457
458 def testModifyStatusIfDuplicateNotContinuousFailures(self): 458 def testModifyStatusIfDuplicateNotContinuousFailures(self):
459 analyses = self._CreateAnalyses('m', 'b', 5) 459 analyses = self._CreateAnalyses('m', 'b', 5)
460 460
461 analyses[0].result_status = wf_analysis_result_status.FOUND_CORRECT 461 analyses[0].result_status = result_status.FOUND_CORRECT
462 analyses[0].put() 462 analyses[0].put()
463 analyses[4].result_status = wf_analysis_result_status.FOUND_CORRECT 463 analyses[4].result_status = result_status.FOUND_CORRECT
464 analyses[4].put() 464 analyses[4].put()
465 465
466 analyses[2].result['failures'][0]['step_name'] = 'not_a' 466 analyses[2].result['failures'][0]['step_name'] = 'not_a'
467 analyses[2].put() 467 analyses[2].put()
468 468
469 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[1]) 469 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[1])
470 470
471 analysis_one = WfAnalysis.Get('m', 'b', 1) 471 analysis_one = WfAnalysis.Get('m', 'b', 1)
472 self.assertEqual(wf_analysis_result_status.FOUND_UNTRIAGED, 472 self.assertEqual(result_status.FOUND_UNTRIAGED,
473 analysis_one.result_status) 473 analysis_one.result_status)
474 474
475 def testModifyStatusIfDuplicateDifferentStatusInBetween(self): 475 def testModifyStatusIfDuplicateDifferentStatusInBetween(self):
476 analyses = self._CreateAnalyses('m', 'b', 5) 476 analyses = self._CreateAnalyses('m', 'b', 5)
477 477
478 analyses[0].result_status = wf_analysis_result_status.FOUND_CORRECT 478 analyses[0].result_status = result_status.FOUND_CORRECT
479 analyses[0].put() 479 analyses[0].put()
480 analyses[4].result_status = wf_analysis_result_status.FOUND_CORRECT 480 analyses[4].result_status = result_status.FOUND_CORRECT
481 analyses[4].put() 481 analyses[4].put()
482 482
483 analyses[2].result_status = wf_analysis_result_status.NOT_FOUND_UNTRIAGED 483 analyses[2].result_status = result_status.NOT_FOUND_UNTRIAGED
484 analyses[2].put() 484 analyses[2].put()
485 485
486 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[1]) 486 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[1])
487 487
488 analysis_one = WfAnalysis.Get('m', 'b', 1) 488 analysis_one = WfAnalysis.Get('m', 'b', 1)
489 self.assertEqual(wf_analysis_result_status.FOUND_UNTRIAGED, 489 self.assertEqual(result_status.FOUND_UNTRIAGED,
490 analysis_one.result_status) 490 analysis_one.result_status)
491 491
492 def testModifyStatusIfDuplicateDuplicateStatusInBetween(self): 492 def testModifyStatusIfDuplicateDuplicateStatusInBetween(self):
493 analyses = self._CreateAnalyses('m', 'b', 5) 493 analyses = self._CreateAnalyses('m', 'b', 5)
494 494
495 analyses[0].result_status = wf_analysis_result_status.FOUND_CORRECT 495 analyses[0].result_status = result_status.FOUND_CORRECT
496 analyses[0].put() 496 analyses[0].put()
497 analyses[4].result_status = wf_analysis_result_status.FOUND_CORRECT 497 analyses[4].result_status = result_status.FOUND_CORRECT
498 analyses[4].put() 498 analyses[4].put()
499 499
500 analyses[2].result_status = ( 500 analyses[2].result_status = (
501 wf_analysis_result_status.FOUND_CORRECT_DUPLICATE) 501 result_status.FOUND_CORRECT_DUPLICATE)
502 analyses[2].put() 502 analyses[2].put()
503 503
504 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[1]) 504 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[1])
505 505
506 analysis_one = WfAnalysis.Get('m', 'b', 1) 506 analysis_one = WfAnalysis.Get('m', 'b', 1)
507 analysis_three = WfAnalysis.Get('m', 'b', 3) 507 analysis_three = WfAnalysis.Get('m', 'b', 3)
508 self.assertEqual(wf_analysis_result_status.FOUND_CORRECT_DUPLICATE, 508 self.assertEqual(result_status.FOUND_CORRECT_DUPLICATE,
509 analysis_one.result_status) 509 analysis_one.result_status)
510 self.assertEqual(wf_analysis_result_status.FOUND_CORRECT_DUPLICATE, 510 self.assertEqual(result_status.FOUND_CORRECT_DUPLICATE,
511 analysis_three.result_status) 511 analysis_three.result_status)
512 512
513 def testModifyStatusIfDuplicateDifferentCLs(self): 513 def testModifyStatusIfDuplicateDifferentCLs(self):
514 analyses = self._CreateAnalyses('m', 'b', 5) 514 analyses = self._CreateAnalyses('m', 'b', 5)
515 515
516 analyses[0].result_status = wf_analysis_result_status.FOUND_CORRECT 516 analyses[0].result_status = result_status.FOUND_CORRECT
517 analyses[0].put() 517 analyses[0].put()
518 analyses[4].result_status = wf_analysis_result_status.FOUND_CORRECT 518 analyses[4].result_status = result_status.FOUND_CORRECT
519 analyses[4].put() 519 analyses[4].put()
520 520
521 analyses[2].result['failures'][0]['suspected_cls'][0]['revision'] = 'rev' 521 analyses[2].result['failures'][0]['suspected_cls'][0]['revision'] = 'rev'
522 analyses[2].suspected_cls[0]['revision'] = 'rev' 522 analyses[2].suspected_cls[0]['revision'] = 'rev'
523 analyses[2].put() 523 analyses[2].put()
524 524
525 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[1]) 525 check_duplicate_failures._ModifyStatusIfDuplicate(analyses[1])
526 526
527 for i in range(1, 4): 527 for i in range(1, 4):
528 analysis = WfAnalysis.Get('m', 'b', i) 528 analysis = WfAnalysis.Get('m', 'b', i)
529 self.assertEqual(wf_analysis_result_status.FOUND_UNTRIAGED, 529 self.assertEqual(result_status.FOUND_UNTRIAGED,
530 analysis.result_status) 530 analysis.result_status)
531 531
532 def testFetchAndSortUntriagedAnalyses(self): 532 def testFetchAndSortUntriagedAnalyses(self):
533 self._CreateAnalyses('m3', 'b3', 3) 533 self._CreateAnalyses('m3', 'b3', 3)
534 self._CreateAnalyses('m2', 'b1', 3) 534 self._CreateAnalyses('m2', 'b1', 3)
535 self._CreateAnalyses('m1', 'b2', 5) 535 self._CreateAnalyses('m1', 'b2', 5)
536 expected_results = [ 536 expected_results = [
537 ('m1', 'b2', 0), 537 ('m1', 'b2', 0),
538 ('m1', 'b2', 1), 538 ('m1', 'b2', 1),
539 ('m1', 'b2', 2), 539 ('m1', 'b2', 2),
540 ('m1', 'b2', 3), 540 ('m1', 'b2', 3),
541 ('m1', 'b2', 4), 541 ('m1', 'b2', 4),
542 ('m2', 'b1', 0), 542 ('m2', 'b1', 0),
543 ('m2', 'b1', 1), 543 ('m2', 'b1', 1),
544 ('m2', 'b1', 2), 544 ('m2', 'b1', 2),
545 ('m3', 'b3', 0), 545 ('m3', 'b3', 0),
546 ('m3', 'b3', 1), 546 ('m3', 'b3', 1),
547 ('m3', 'b3', 2) 547 ('m3', 'b3', 2)
548 ] 548 ]
549 549
550 analyses = ( 550 analyses = (
551 check_duplicate_failures.CheckDuplicateFailures. 551 check_duplicate_failures.CheckDuplicateFailures.
552 _FetchAndSortUntriagedAnalyses()) 552 _FetchAndSortUntriagedAnalyses())
553 for analysis, expected_result in zip(analyses, expected_results): 553 for analysis, expected_result in zip(analyses, expected_results):
554 self.assertEqual(expected_result, ( 554 self.assertEqual(expected_result, (
555 analysis.master_name, analysis.builder_name, analysis.build_number)) 555 analysis.master_name, analysis.builder_name, analysis.build_number))
OLDNEW
« no previous file with comments | « appengine/findit/handlers/test/build_failure_test.py ('k') | appengine/findit/handlers/test/handlers_util_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698