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

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

Issue 2187763004: [Findit] Refactor Findit pipeline. (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Fix nits after preliminary check. Created 4 years, 4 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 common.waterfall import failure_type
8 from model import analysis_status 9 from model import analysis_status
9 from model import result_status 10 from model import result_status
10 from model.wf_analysis import WfAnalysis 11 from model.wf_analysis import WfAnalysis
11 from model.wf_try_job import WfTryJob 12 from model.wf_try_job import WfTryJob
12 from model.wf_try_job_data import WfTryJobData 13 from model.wf_try_job_data import WfTryJobData
13 from waterfall import identify_try_job_culprit_pipeline 14 from waterfall import identify_try_job_culprit_pipeline
14 from waterfall.identify_try_job_culprit_pipeline import( 15 from waterfall.identify_try_job_culprit_pipeline import(
15 IdentifyTryJobCulpritPipeline) 16 IdentifyTryJobCulpritPipeline)
16 from waterfall.try_job_type import TryJobType
17 17
18 18
19 class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase): 19 class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase):
20
21 def _MockGetChangeLog(self, revision): 20 def _MockGetChangeLog(self, revision):
lijeffrey 2016/08/04 10:31:47 should the empty line be kept?
chanli 2016/08/05 19:53:54 Done.
22 class MockedChangeLog(object): 21 class MockedChangeLog(object):
23 22
24 def __init__(self, commit_position, code_review_url): 23 def __init__(self, commit_position, code_review_url):
25 self.commit_position = commit_position 24 self.commit_position = commit_position
26 self.code_review_url = code_review_url 25 self.code_review_url = code_review_url
27 26
28 mock_change_logs = {} 27 mock_change_logs = {}
29 mock_change_logs['rev1'] = MockedChangeLog('1', 'url_1') 28 mock_change_logs['rev1'] = MockedChangeLog('1', 'url_1')
30 mock_change_logs['rev2'] = MockedChangeLog('2', 'url_2') 29 mock_change_logs['rev2'] = MockedChangeLog('2', 'url_2')
31 return mock_change_logs.get(revision) 30 return mock_change_logs.get(revision)
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
384 try_job.put() 383 try_job.put()
385 try_job_data = WfTryJobData.Create(try_job_id) 384 try_job_data = WfTryJobData.Create(try_job_id)
386 try_job_data.put() 385 try_job_data.put()
387 386
388 analysis = WfAnalysis.Create(master_name, builder_name, build_number) 387 analysis = WfAnalysis.Create(master_name, builder_name, build_number)
389 analysis.put() 388 analysis.put()
390 389
391 pipeline = IdentifyTryJobCulpritPipeline() 390 pipeline = IdentifyTryJobCulpritPipeline()
392 culprit = pipeline.run( 391 culprit = pipeline.run(
393 master_name, builder_name, build_number, ['rev1'], 392 master_name, builder_name, build_number, ['rev1'],
394 TryJobType.COMPILE, '1', None) 393 failure_type.COMPILE, '1', None)
395 try_job = WfTryJob.Get(master_name, builder_name, build_number) 394 try_job = WfTryJob.Get(master_name, builder_name, build_number)
396 395
397 self.assertEqual(analysis_status.COMPLETED, try_job.status) 396 self.assertEqual(analysis_status.COMPLETED, try_job.status)
398 self.assertEqual([], try_job.compile_results) 397 self.assertEqual([], try_job.compile_results)
399 self.assertIsNone(culprit) 398 self.assertIsNone(culprit)
400 self.assertIsNone(try_job_data.culprits) 399 self.assertIsNone(try_job_data.culprits)
401 self.assertIsNone(analysis.result_status) 400 self.assertIsNone(analysis.result_status)
402 self.assertIsNone(analysis.suspected_cls) 401 self.assertIsNone(analysis.suspected_cls)
403 402
404 def testIdentifyCulpritForCompileTryJobSuccess(self): 403 def testIdentifyCulpritForCompileTryJobSuccess(self):
(...skipping 25 matching lines...) Expand all
430 }, 429 },
431 'try_job_id': try_job_id, 430 'try_job_id': try_job_id,
432 }] 431 }]
433 try_job.put() 432 try_job.put()
434 analysis = WfAnalysis.Create(master_name, builder_name, build_number) 433 analysis = WfAnalysis.Create(master_name, builder_name, build_number)
435 analysis.put() 434 analysis.put()
436 435
437 pipeline = IdentifyTryJobCulpritPipeline() 436 pipeline = IdentifyTryJobCulpritPipeline()
438 culprit = pipeline.run( 437 culprit = pipeline.run(
439 master_name, builder_name, build_number, ['rev1'], 438 master_name, builder_name, build_number, ['rev1'],
440 TryJobType.COMPILE, '1', compile_result) 439 failure_type.COMPILE, '1', compile_result)
441 440
442 expected_culprit = 'rev2' 441 expected_culprit = 'rev2'
443 expected_suspected_cl = { 442 expected_suspected_cl = {
444 'revision': 'rev2', 443 'revision': 'rev2',
445 'commit_position': '2', 444 'commit_position': '2',
446 'url': 'url_2', 445 'url': 'url_2',
447 'repo_name': 'chromium' 446 'repo_name': 'chromium'
448 } 447 }
449 expected_compile_result = { 448 expected_compile_result = {
450 'report': { 449 'report': {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 } 490 }
492 491
493 WfTryJobData.Create(try_job_id).put() 492 WfTryJobData.Create(try_job_id).put()
494 WfTryJob.Create(master_name, builder_name, build_number).put() 493 WfTryJob.Create(master_name, builder_name, build_number).put()
495 analysis = WfAnalysis.Create(master_name, builder_name, build_number) 494 analysis = WfAnalysis.Create(master_name, builder_name, build_number)
496 analysis.put() 495 analysis.put()
497 496
498 pipeline = IdentifyTryJobCulpritPipeline() 497 pipeline = IdentifyTryJobCulpritPipeline()
499 culprit = pipeline.run( 498 culprit = pipeline.run(
500 master_name, builder_name, build_number, ['rev1'], 499 master_name, builder_name, build_number, ['rev1'],
501 TryJobType.COMPILE, '1', compile_result) 500 failure_type.COMPILE, '1', compile_result)
502 try_job = WfTryJob.Get(master_name, builder_name, build_number) 501 try_job = WfTryJob.Get(master_name, builder_name, build_number)
503 502
504 self.assertIsNone(culprit) 503 self.assertIsNone(culprit)
505 self.assertEqual(analysis_status.COMPLETED, try_job.status) 504 self.assertEqual(analysis_status.COMPLETED, try_job.status)
506 505
507 try_job_data = WfTryJobData.Get(try_job_id) 506 try_job_data = WfTryJobData.Get(try_job_id)
508 self.assertIsNone(try_job_data.culprits) 507 self.assertIsNone(try_job_data.culprits)
509 508
510 self.assertIsNone(analysis.result_status) 509 self.assertIsNone(analysis.result_status)
511 self.assertIsNone(analysis.suspected_cls) 510 self.assertIsNone(analysis.suspected_cls)
512 511
513 def testIdentifyCulpritForTestTryJobNoTryJobResultNoHeuristicResult(self): 512 def testIdentifyCulpritForTestTryJobNoTryJobResultNoHeuristicResult(self):
514 master_name = 'm' 513 master_name = 'm'
515 builder_name = 'b' 514 builder_name = 'b'
516 build_number = 1 515 build_number = 1
517 try_job_id = '1' 516 try_job_id = '1'
518 517
519 WfTryJobData.Create(try_job_id).put() 518 WfTryJobData.Create(try_job_id).put()
520 try_job = WfTryJob.Create(master_name, builder_name, build_number) 519 try_job = WfTryJob.Create(master_name, builder_name, build_number)
521 try_job.status = analysis_status.RUNNING 520 try_job.status = analysis_status.RUNNING
522 try_job.put() 521 try_job.put()
523 analysis = WfAnalysis.Create(master_name, builder_name, build_number) 522 analysis = WfAnalysis.Create(master_name, builder_name, build_number)
524 analysis.put() 523 analysis.put()
525 524
526 pipeline = IdentifyTryJobCulpritPipeline() 525 pipeline = IdentifyTryJobCulpritPipeline()
527 culprit = pipeline.run( 526 culprit = pipeline.run(
528 master_name, builder_name, build_number, ['rev1', 'rev2'], 527 master_name, builder_name, build_number, ['rev1', 'rev2'],
529 TryJobType.TEST, '1', None) 528 failure_type.TEST, '1', None)
530 529
531 self.assertIsNone(culprit) 530 self.assertIsNone(culprit)
532 531
533 try_job_data = WfTryJobData.Get(try_job_id) 532 try_job_data = WfTryJobData.Get(try_job_id)
534 self.assertIsNone(try_job_data.culprits) 533 self.assertIsNone(try_job_data.culprits)
535 self.assertIsNone(analysis.result_status) 534 self.assertIsNone(analysis.result_status)
536 self.assertIsNone(analysis.suspected_cls) 535 self.assertIsNone(analysis.suspected_cls)
537 536
538 def testIdentifyCulpritForTestTryJobNoTryJobResultWithHeuristicResult(self): 537 def testIdentifyCulpritForTestTryJobNoTryJobResultWithHeuristicResult(self):
539 master_name = 'm' 538 master_name = 'm'
(...skipping 15 matching lines...) Expand all
555 554
556 # Heuristic analysis already provided some results. 555 # Heuristic analysis already provided some results.
557 analysis = WfAnalysis.Create(master_name, builder_name, build_number) 556 analysis = WfAnalysis.Create(master_name, builder_name, build_number)
558 analysis.result_status = result_status.FOUND_UNTRIAGED 557 analysis.result_status = result_status.FOUND_UNTRIAGED
559 analysis.suspected_cls = [suspected_cl] 558 analysis.suspected_cls = [suspected_cl]
560 analysis.put() 559 analysis.put()
561 560
562 pipeline = IdentifyTryJobCulpritPipeline() 561 pipeline = IdentifyTryJobCulpritPipeline()
563 culprit = pipeline.run( 562 culprit = pipeline.run(
564 master_name, builder_name, build_number, ['rev1', 'rev2'], 563 master_name, builder_name, build_number, ['rev1', 'rev2'],
565 TryJobType.TEST, '1', None) 564 failure_type.TEST, '1', None)
566 565
567 self.assertIsNone(culprit) 566 self.assertIsNone(culprit)
568 567
569 try_job_data = WfTryJobData.Get(try_job_id) 568 try_job_data = WfTryJobData.Get(try_job_id)
570 self.assertIsNone(try_job_data.culprits) 569 self.assertIsNone(try_job_data.culprits)
571 570
572 # Ensure analysis results are not updated since no culprit from try job. 571 # Ensure analysis results are not updated since no culprit from try job.
573 self.assertEqual(analysis.result_status, result_status.FOUND_UNTRIAGED) 572 self.assertEqual(analysis.result_status, result_status.FOUND_UNTRIAGED)
574 self.assertEqual(analysis.suspected_cls, [suspected_cl]) 573 self.assertEqual(analysis.suspected_cls, [suspected_cl])
575 574
(...skipping 21 matching lines...) Expand all
597 596
598 WfTryJobData.Create(try_job_id).put() 597 WfTryJobData.Create(try_job_id).put()
599 try_job = WfTryJob.Create(master_name, builder_name, build_number) 598 try_job = WfTryJob.Create(master_name, builder_name, build_number)
600 try_job.status = analysis_status.RUNNING 599 try_job.status = analysis_status.RUNNING
601 try_job.put() 600 try_job.put()
602 analysis = WfAnalysis.Create(master_name, builder_name, build_number) 601 analysis = WfAnalysis.Create(master_name, builder_name, build_number)
603 analysis.put() 602 analysis.put()
604 603
605 pipeline = IdentifyTryJobCulpritPipeline() 604 pipeline = IdentifyTryJobCulpritPipeline()
606 culprit = pipeline.run( 605 culprit = pipeline.run(
607 master_name, builder_name, build_number, [], TryJobType.TEST, '1', 606 master_name, builder_name, build_number, [], failure_type.TEST, '1',
608 test_result) 607 test_result)
609 608
610 self.assertIsNone(culprit) 609 self.assertIsNone(culprit)
611 610
612 try_job_data = WfTryJobData.Get(try_job_id) 611 try_job_data = WfTryJobData.Get(try_job_id)
613 self.assertIsNone(try_job_data.culprits) 612 self.assertIsNone(try_job_data.culprits)
614 613
615 self.assertIsNone(analysis.result_status) 614 self.assertIsNone(analysis.result_status)
616 self.assertIsNone(analysis.suspected_cls) 615 self.assertIsNone(analysis.suspected_cls)
617 616
(...skipping 21 matching lines...) Expand all
639 638
640 WfTryJobData.Create(try_job_id).put() 639 WfTryJobData.Create(try_job_id).put()
641 try_job = WfTryJob.Create(master_name, builder_name, build_number) 640 try_job = WfTryJob.Create(master_name, builder_name, build_number)
642 try_job.status = analysis_status.RUNNING 641 try_job.status = analysis_status.RUNNING
643 try_job.put() 642 try_job.put()
644 analysis = WfAnalysis.Create(master_name, builder_name, build_number) 643 analysis = WfAnalysis.Create(master_name, builder_name, build_number)
645 analysis.put() 644 analysis.put()
646 645
647 pipeline = IdentifyTryJobCulpritPipeline() 646 pipeline = IdentifyTryJobCulpritPipeline()
648 culprit = pipeline.run( 647 culprit = pipeline.run(
649 master_name, builder_name, build_number, ['rev3'], TryJobType.TEST, 648 master_name, builder_name, build_number, ['rev3'], failure_type.TEST,
650 '1', test_result) 649 '1', test_result)
651 650
652 expected_suspected_cl = { 651 expected_suspected_cl = {
653 'revision': 'rev3', 652 'revision': 'rev3',
654 'repo_name': 'chromium' 653 'repo_name': 'chromium'
655 } 654 }
656 655
657 expected_culprit = { 656 expected_culprit = {
658 'a_test': { 657 'a_test': {
659 'tests': { 658 'tests': {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
726 try_job = WfTryJob.Create(master_name, builder_name, build_number) 725 try_job = WfTryJob.Create(master_name, builder_name, build_number)
727 try_job.status = analysis_status.RUNNING 726 try_job.status = analysis_status.RUNNING
728 try_job.test_results = [test_result] 727 try_job.test_results = [test_result]
729 try_job.put() 728 try_job.put()
730 analysis = WfAnalysis.Create(master_name, builder_name, build_number) 729 analysis = WfAnalysis.Create(master_name, builder_name, build_number)
731 analysis.put() 730 analysis.put()
732 731
733 pipeline = IdentifyTryJobCulpritPipeline() 732 pipeline = IdentifyTryJobCulpritPipeline()
734 culprit = pipeline.run( 733 culprit = pipeline.run(
735 master_name, builder_name, build_number, ['rev1', 'rev2'], 734 master_name, builder_name, build_number, ['rev1', 'rev2'],
736 TryJobType.TEST, '1', test_result) 735 failure_type.TEST, '1', test_result)
737 736
738 a_test1_suspected_cl = { 737 a_test1_suspected_cl = {
739 'revision': 'rev1', 738 'revision': 'rev1',
740 'commit_position': '1', 739 'commit_position': '1',
741 'url': 'url_1', 740 'url': 'url_1',
742 'repo_name': 'chromium' 741 'repo_name': 'chromium'
743 } 742 }
744 a_test2_suspected_cl = { 743 a_test2_suspected_cl = {
745 'revision': 'rev2', 744 'revision': 'rev2',
746 'commit_position': '2', 745 'commit_position': '2',
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
872 'rev1': 'failed', 871 'rev1': 'failed',
873 }, 872 },
874 }, 873 },
875 'try_job_id': try_job_id, 874 'try_job_id': try_job_id,
876 }] 875 }]
877 876
878 try_job.put() 877 try_job.put()
879 878
880 pipeline = IdentifyTryJobCulpritPipeline() 879 pipeline = IdentifyTryJobCulpritPipeline()
881 pipeline.run(master_name, builder_name, build_number, ['rev1'], 880 pipeline.run(master_name, builder_name, build_number, ['rev1'],
882 TryJobType.COMPILE, '1', compile_result) 881 failure_type.COMPILE, '1', compile_result)
883 882
884 self.assertEqual(analysis.result_status, 883 self.assertEqual(analysis.result_status,
885 result_status.FOUND_UNTRIAGED) 884 result_status.FOUND_UNTRIAGED)
886 self.assertEqual(analysis.suspected_cls, [suspected_cl]) 885 self.assertEqual(analysis.suspected_cls, [suspected_cl])
887 self.assertEqual(version, analysis.version) # No update to analysis. 886 self.assertEqual(version, analysis.version) # No update to analysis.
888 887
889 def testFindCulpritForEachTestFailureRevisionNotRun(self): 888 def testFindCulpritForEachTestFailureRevisionNotRun(self):
890 blame_list = ['rev1'] 889 blame_list = ['rev1']
891 result = { 890 result = {
892 'report': { 891 'report': {
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
949 culprits = { 948 culprits = {
950 'r1': { 949 'r1': {
951 'repo_name': 'chromium', 950 'repo_name': 'chromium',
952 'revision': 'r1', 951 'revision': 'r1',
953 } 952 }
954 } 953 }
955 954
956 identify_try_job_culprit_pipeline._NotifyCulprits('m', 'b', 1, culprits) 955 identify_try_job_culprit_pipeline._NotifyCulprits('m', 'b', 1, culprits)
957 self.assertEqual(1, len(instances)) 956 self.assertEqual(1, len(instances))
958 self.assertTrue(instances[0].started) 957 self.assertTrue(instances[0].started)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698