Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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) |
| OLD | NEW |