| 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.waterfall import failure_type | 7 from common.waterfall import failure_type |
| 8 from libs.gitiles.gitiles_repository import GitilesRepository | 8 from libs.gitiles.gitiles_repository import GitilesRepository |
| 9 from model import analysis_approach_type | 9 from model import analysis_approach_type |
| 10 from model import analysis_status | 10 from model import analysis_status |
| (...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 | 427 |
| 428 def testIdentifyCulpritForCompileTryJobNoCulprit(self): | 428 def testIdentifyCulpritForCompileTryJobNoCulprit(self): |
| 429 master_name = 'm' | 429 master_name = 'm' |
| 430 builder_name = 'b' | 430 builder_name = 'b' |
| 431 build_number = 1 | 431 build_number = 1 |
| 432 try_job_id = '1' | 432 try_job_id = '1' |
| 433 | 433 |
| 434 try_job = WfTryJob.Create(master_name, builder_name, build_number) | 434 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 435 try_job.put() | 435 try_job.put() |
| 436 try_job_data = WfTryJobData.Create(try_job_id) | 436 try_job_data = WfTryJobData.Create(try_job_id) |
| 437 try_job_data.try_job_key = try_job.key |
| 437 try_job_data.put() | 438 try_job_data.put() |
| 438 | 439 |
| 439 analysis = WfAnalysis.Create(master_name, builder_name, build_number) | 440 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
| 440 analysis.put() | 441 analysis.put() |
| 441 | 442 |
| 442 pipeline = IdentifyTryJobCulpritPipeline() | 443 pipeline = IdentifyTryJobCulpritPipeline() |
| 443 culprit = pipeline.run( | 444 culprit = pipeline.run( |
| 444 master_name, builder_name, build_number, ['rev1'], | 445 master_name, builder_name, build_number, ['rev1'], |
| 445 failure_type.COMPILE, '1', None) | 446 failure_type.COMPILE, '1', None) |
| 446 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 447 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| (...skipping 14 matching lines...) Expand all Loading... |
| 461 compile_result = { | 462 compile_result = { |
| 462 'report': { | 463 'report': { |
| 463 'result': { | 464 'result': { |
| 464 'rev1': 'passed', | 465 'rev1': 'passed', |
| 465 'rev2': 'failed' | 466 'rev2': 'failed' |
| 466 }, | 467 }, |
| 467 }, | 468 }, |
| 468 } | 469 } |
| 469 | 470 |
| 470 try_job_data = WfTryJobData.Create(try_job_id) | 471 try_job_data = WfTryJobData.Create(try_job_id) |
| 472 try_job_data.try_job_key = WfTryJob.Create( |
| 473 master_name, builder_name, build_number).key |
| 471 try_job_data.put() | 474 try_job_data.put() |
| 472 | 475 |
| 473 try_job = WfTryJob.Create(master_name, builder_name, build_number) | 476 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 474 try_job.status = analysis_status.RUNNING | 477 try_job.status = analysis_status.RUNNING |
| 475 try_job.compile_results = [{ | 478 try_job.compile_results = [{ |
| 476 'report': { | 479 'report': { |
| 477 'result': { | 480 'result': { |
| 478 'rev1': 'passed', | 481 'rev1': 'passed', |
| 479 'rev2': 'failed' | 482 'rev2': 'failed' |
| 480 }, | 483 }, |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 543 'report': { | 546 'report': { |
| 544 'result': { | 547 'result': { |
| 545 'rev1': 'passed', | 548 'rev1': 'passed', |
| 546 'rev2': 'passed' | 549 'rev2': 'passed' |
| 547 } | 550 } |
| 548 }, | 551 }, |
| 549 'url': 'url', | 552 'url': 'url', |
| 550 'try_job_id': try_job_id, | 553 'try_job_id': try_job_id, |
| 551 } | 554 } |
| 552 | 555 |
| 553 WfTryJobData.Create(try_job_id).put() | 556 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 554 WfTryJob.Create(master_name, builder_name, build_number).put() | 557 try_job.put() |
| 558 |
| 559 try_job_data = WfTryJobData.Create(try_job_id) |
| 560 try_job_data.try_job_key = try_job.key |
| 561 try_job_data.put() |
| 562 |
| 555 analysis = WfAnalysis.Create(master_name, builder_name, build_number) | 563 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
| 556 analysis.put() | 564 analysis.put() |
| 557 | 565 |
| 558 pipeline = IdentifyTryJobCulpritPipeline() | 566 pipeline = IdentifyTryJobCulpritPipeline() |
| 559 culprit = pipeline.run( | 567 culprit = pipeline.run( |
| 560 master_name, builder_name, build_number, ['rev1'], | 568 master_name, builder_name, build_number, ['rev1'], |
| 561 failure_type.COMPILE, '1', compile_result) | 569 failure_type.COMPILE, '1', compile_result) |
| 562 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 570 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 563 | 571 |
| 564 self.assertIsNone(culprit) | 572 self.assertIsNone(culprit) |
| 565 self.assertEqual(analysis_status.COMPLETED, try_job.status) | 573 self.assertEqual(analysis_status.COMPLETED, try_job.status) |
| 566 | 574 |
| 567 try_job_data = WfTryJobData.Get(try_job_id) | 575 try_job_data = WfTryJobData.Get(try_job_id) |
| 568 self.assertIsNone(try_job_data.culprits) | 576 self.assertIsNone(try_job_data.culprits) |
| 569 | 577 |
| 570 self.assertIsNone(analysis.result_status) | 578 self.assertIsNone(analysis.result_status) |
| 571 self.assertIsNone(analysis.suspected_cls) | 579 self.assertIsNone(analysis.suspected_cls) |
| 572 | 580 |
| 573 def testIdentifyCulpritForTestTryJobNoTryJobResultNoHeuristicResult(self): | 581 def testIdentifyCulpritForTestTryJobNoTryJobResultNoHeuristicResult(self): |
| 574 master_name = 'm' | 582 master_name = 'm' |
| 575 builder_name = 'b' | 583 builder_name = 'b' |
| 576 build_number = 1 | 584 build_number = 1 |
| 577 try_job_id = '1' | 585 try_job_id = '1' |
| 578 | 586 |
| 579 WfTryJobData.Create(try_job_id).put() | |
| 580 try_job = WfTryJob.Create(master_name, builder_name, build_number) | 587 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 581 try_job.status = analysis_status.RUNNING | 588 try_job.status = analysis_status.RUNNING |
| 582 try_job.put() | 589 try_job.put() |
| 590 |
| 591 try_job_data = WfTryJobData.Create(try_job_id) |
| 592 try_job_data.try_job_key = try_job.key |
| 593 try_job_data.put() |
| 594 |
| 583 analysis = WfAnalysis.Create(master_name, builder_name, build_number) | 595 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
| 584 analysis.put() | 596 analysis.put() |
| 585 | 597 |
| 586 pipeline = IdentifyTryJobCulpritPipeline() | 598 pipeline = IdentifyTryJobCulpritPipeline() |
| 587 culprit = pipeline.run( | 599 culprit = pipeline.run( |
| 588 master_name, builder_name, build_number, ['rev1', 'rev2'], | 600 master_name, builder_name, build_number, ['rev1', 'rev2'], |
| 589 failure_type.TEST, '1', None) | 601 failure_type.TEST, '1', None) |
| 590 | 602 |
| 591 self.assertIsNone(culprit) | 603 self.assertIsNone(culprit) |
| 592 | 604 |
| 593 try_job_data = WfTryJobData.Get(try_job_id) | 605 try_job_data = WfTryJobData.Get(try_job_id) |
| 594 self.assertIsNone(try_job_data.culprits) | 606 self.assertIsNone(try_job_data.culprits) |
| 595 self.assertIsNone(analysis.result_status) | 607 self.assertIsNone(analysis.result_status) |
| 596 self.assertIsNone(analysis.suspected_cls) | 608 self.assertIsNone(analysis.suspected_cls) |
| 597 | 609 |
| 598 def testIdentifyCulpritForTestTryJobNoTryJobResultWithHeuristicResult(self): | 610 def testIdentifyCulpritForTestTryJobNoTryJobResultWithHeuristicResult(self): |
| 599 master_name = 'm' | 611 master_name = 'm' |
| 600 builder_name = 'b' | 612 builder_name = 'b' |
| 601 build_number = 1 | 613 build_number = 1 |
| 602 try_job_id = '1' | 614 try_job_id = '1' |
| 603 | 615 |
| 604 suspected_cl = { | 616 suspected_cl = { |
| 605 'revision': 'rev1', | 617 'revision': 'rev1', |
| 606 'commit_position': 1, | 618 'commit_position': 1, |
| 607 'url': 'url_1', | 619 'url': 'url_1', |
| 608 'repo_name': 'chromium' | 620 'repo_name': 'chromium' |
| 609 } | 621 } |
| 610 | 622 |
| 611 WfTryJobData.Create(try_job_id).put() | |
| 612 try_job = WfTryJob.Create(master_name, builder_name, build_number) | 623 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 613 try_job.status = analysis_status.RUNNING | 624 try_job.status = analysis_status.RUNNING |
| 614 try_job.put() | 625 try_job.put() |
| 615 | 626 |
| 627 try_job_data = WfTryJobData.Create(try_job_id) |
| 628 try_job_data.try_job_key = try_job.key |
| 629 try_job_data.put() |
| 630 |
| 616 # Heuristic analysis already provided some results. | 631 # Heuristic analysis already provided some results. |
| 617 analysis = WfAnalysis.Create(master_name, builder_name, build_number) | 632 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
| 618 analysis.result_status = result_status.FOUND_UNTRIAGED | 633 analysis.result_status = result_status.FOUND_UNTRIAGED |
| 619 analysis.suspected_cls = [suspected_cl] | 634 analysis.suspected_cls = [suspected_cl] |
| 620 analysis.put() | 635 analysis.put() |
| 621 | 636 |
| 622 pipeline = IdentifyTryJobCulpritPipeline() | 637 pipeline = IdentifyTryJobCulpritPipeline() |
| 623 culprit = pipeline.run( | 638 culprit = pipeline.run( |
| 624 master_name, builder_name, build_number, ['rev1', 'rev2'], | 639 master_name, builder_name, build_number, ['rev1', 'rev2'], |
| 625 failure_type.TEST, '1', None) | 640 failure_type.TEST, '1', None) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 648 'valid': True, | 663 'valid': True, |
| 649 'failures': ['a_test1'] | 664 'failures': ['a_test1'] |
| 650 } | 665 } |
| 651 } | 666 } |
| 652 } | 667 } |
| 653 }, | 668 }, |
| 654 'url': 'url', | 669 'url': 'url', |
| 655 'try_job_id': try_job_id | 670 'try_job_id': try_job_id |
| 656 } | 671 } |
| 657 | 672 |
| 658 WfTryJobData.Create(try_job_id).put() | |
| 659 try_job = WfTryJob.Create(master_name, builder_name, build_number) | 673 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 660 try_job.status = analysis_status.RUNNING | 674 try_job.status = analysis_status.RUNNING |
| 661 try_job.put() | 675 try_job.put() |
| 676 |
| 677 try_job_data = WfTryJobData.Create(try_job_id) |
| 678 try_job_data.try_job_key = try_job.key |
| 679 try_job_data.put() |
| 680 |
| 662 analysis = WfAnalysis.Create(master_name, builder_name, build_number) | 681 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
| 663 analysis.put() | 682 analysis.put() |
| 664 | 683 |
| 665 pipeline = IdentifyTryJobCulpritPipeline() | 684 pipeline = IdentifyTryJobCulpritPipeline() |
| 666 culprit = pipeline.run( | 685 culprit = pipeline.run( |
| 667 master_name, builder_name, build_number, [], failure_type.TEST, '1', | 686 master_name, builder_name, build_number, [], failure_type.TEST, '1', |
| 668 test_result) | 687 test_result) |
| 669 | 688 |
| 670 self.assertIsNone(culprit) | 689 self.assertIsNone(culprit) |
| 671 | 690 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 690 'valid': True, | 709 'valid': True, |
| 691 'failures': ['a_test1'] | 710 'failures': ['a_test1'] |
| 692 } | 711 } |
| 693 } | 712 } |
| 694 } | 713 } |
| 695 }, | 714 }, |
| 696 'url': 'url', | 715 'url': 'url', |
| 697 'try_job_id': try_job_id | 716 'try_job_id': try_job_id |
| 698 } | 717 } |
| 699 | 718 |
| 700 WfTryJobData.Create(try_job_id).put() | |
| 701 try_job = WfTryJob.Create(master_name, builder_name, build_number) | 719 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 702 try_job.status = analysis_status.RUNNING | 720 try_job.status = analysis_status.RUNNING |
| 703 try_job.put() | 721 try_job.put() |
| 722 |
| 723 try_job_data = WfTryJobData.Create(try_job_id) |
| 724 try_job_data.try_job_key = try_job.key |
| 725 try_job_data.put() |
| 726 |
| 704 analysis = WfAnalysis.Create(master_name, builder_name, build_number) | 727 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
| 705 analysis.put() | 728 analysis.put() |
| 706 | 729 |
| 707 pipeline = IdentifyTryJobCulpritPipeline() | 730 pipeline = IdentifyTryJobCulpritPipeline() |
| 708 culprit = pipeline.run( | 731 culprit = pipeline.run( |
| 709 master_name, builder_name, build_number, ['rev3'], failure_type.TEST, | 732 master_name, builder_name, build_number, ['rev3'], failure_type.TEST, |
| 710 '1', test_result) | 733 '1', test_result) |
| 711 | 734 |
| 712 expected_suspected_cl = { | 735 expected_suspected_cl = { |
| 713 'revision': 'rev3', | 736 'revision': 'rev3', |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 776 'status': 'passed', | 799 'status': 'passed', |
| 777 'valid': True | 800 'valid': True |
| 778 } | 801 } |
| 779 } | 802 } |
| 780 } | 803 } |
| 781 }, | 804 }, |
| 782 'url': 'url', | 805 'url': 'url', |
| 783 'try_job_id': try_job_id | 806 'try_job_id': try_job_id |
| 784 } | 807 } |
| 785 | 808 |
| 786 WfTryJobData.Create(try_job_id).put() | |
| 787 try_job = WfTryJob.Create(master_name, builder_name, build_number) | 809 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 788 try_job.status = analysis_status.RUNNING | 810 try_job.status = analysis_status.RUNNING |
| 789 try_job.test_results = [test_result] | 811 try_job.test_results = [test_result] |
| 790 try_job.put() | 812 try_job.put() |
| 813 |
| 814 try_job_data = WfTryJobData.Create(try_job_id) |
| 815 try_job_data.try_job_key = try_job.key |
| 816 try_job_data.put() |
| 817 |
| 791 analysis = WfAnalysis.Create(master_name, builder_name, build_number) | 818 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
| 792 analysis.put() | 819 analysis.put() |
| 793 | 820 |
| 794 pipeline = IdentifyTryJobCulpritPipeline() | 821 pipeline = IdentifyTryJobCulpritPipeline() |
| 795 culprit = pipeline.run( | 822 culprit = pipeline.run( |
| 796 master_name, builder_name, build_number, ['rev1', 'rev2'], | 823 master_name, builder_name, build_number, ['rev1', 'rev2'], |
| 797 failure_type.TEST, '1', test_result) | 824 failure_type.TEST, '1', test_result) |
| 798 | 825 |
| 799 a_test1_suspected_cl = { | 826 a_test1_suspected_cl = { |
| 800 'revision': 'rev1', | 827 'revision': 'rev1', |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 940 suspected_cl.put() | 967 suspected_cl.put() |
| 941 | 968 |
| 942 compile_result = { | 969 compile_result = { |
| 943 'report': { | 970 'report': { |
| 944 'result': { | 971 'result': { |
| 945 revision: 'failed', | 972 revision: 'failed', |
| 946 }, | 973 }, |
| 947 }, | 974 }, |
| 948 } | 975 } |
| 949 | 976 |
| 950 try_job_data = WfTryJobData.Create(try_job_id) | |
| 951 try_job_data.put() | |
| 952 | |
| 953 try_job = WfTryJob.Create(master_name, builder_name, build_number) | 977 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 954 try_job.status = analysis_status.RUNNING | 978 try_job.status = analysis_status.RUNNING |
| 955 try_job.compile_results = [{ | 979 try_job.compile_results = [{ |
| 956 'report': { | 980 'report': { |
| 957 'result': { | 981 'result': { |
| 958 revision: 'failed', | 982 revision: 'failed', |
| 959 }, | 983 }, |
| 960 }, | 984 }, |
| 961 'try_job_id': try_job_id, | 985 'try_job_id': try_job_id, |
| 962 }] | 986 }] |
| 987 try_job.put() |
| 963 | 988 |
| 964 try_job.put() | 989 try_job_data = WfTryJobData.Create(try_job_id) |
| 990 try_job_data.try_job_key = try_job.key |
| 991 try_job_data.put() |
| 965 | 992 |
| 966 pipeline = IdentifyTryJobCulpritPipeline() | 993 pipeline = IdentifyTryJobCulpritPipeline() |
| 967 pipeline.run(master_name, builder_name, build_number, [revision], | 994 pipeline.run(master_name, builder_name, build_number, [revision], |
| 968 failure_type.COMPILE, '1', compile_result) | 995 failure_type.COMPILE, '1', compile_result) |
| 969 | 996 |
| 970 self.assertEqual(analysis.result_status, | 997 self.assertEqual(analysis.result_status, |
| 971 result_status.FOUND_UNTRIAGED) | 998 result_status.FOUND_UNTRIAGED) |
| 972 self.assertEqual(analysis.suspected_cls, [heuristic_suspected_cl]) | 999 self.assertEqual(analysis.suspected_cls, [heuristic_suspected_cl]) |
| 973 self.assertEqual(version, analysis.version) # No update to analysis. | 1000 self.assertEqual(version, analysis.version) # No update to analysis. |
| 974 | 1001 |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1171 | 1198 |
| 1172 identify_try_job_culprit_pipeline._NotifyCulprits( | 1199 identify_try_job_culprit_pipeline._NotifyCulprits( |
| 1173 master_name, builder_name, build_number, None, | 1200 master_name, builder_name, build_number, None, |
| 1174 heuristic_cls, compile_suspected_cl) | 1201 heuristic_cls, compile_suspected_cl) |
| 1175 self.assertEqual(1, len(instances)) | 1202 self.assertEqual(1, len(instances)) |
| 1176 self.assertTrue(instances[0].started) | 1203 self.assertTrue(instances[0].started) |
| 1177 | 1204 |
| 1178 def testGetTestFailureCausedByCLResultNone(self): | 1205 def testGetTestFailureCausedByCLResultNone(self): |
| 1179 self.assertIsNone( | 1206 self.assertIsNone( |
| 1180 identify_try_job_culprit_pipeline._GetTestFailureCausedByCL(None)) | 1207 identify_try_job_culprit_pipeline._GetTestFailureCausedByCL(None)) |
| OLD | NEW |