| 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 datetime import datetime | 5 from datetime import datetime |
| 6 from datetime import timedelta | 6 from datetime import timedelta |
| 7 import mock |
| 7 | 8 |
| 8 from common.waterfall import failure_type | 9 from common.waterfall import failure_type |
| 9 from model import analysis_status | 10 from model import analysis_status |
| 10 from model.wf_analysis import WfAnalysis | 11 from model.wf_analysis import WfAnalysis |
| 11 from model.wf_build import WfBuild | 12 from model.wf_build import WfBuild |
| 12 from model.wf_failure_group import WfFailureGroup | 13 from model.wf_failure_group import WfFailureGroup |
| 13 from model.wf_try_job import WfTryJob | 14 from model.wf_try_job import WfTryJob |
| 14 from waterfall import try_job_util | 15 from waterfall import try_job_util |
| 15 from waterfall.test import wf_testcase | 16 from waterfall.test import wf_testcase |
| 16 | 17 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 } | 62 } |
| 62 }, | 63 }, |
| 63 'failure_type': failure_type.COMPILE | 64 'failure_type': failure_type.COMPILE |
| 64 } | 65 } |
| 65 | 66 |
| 66 need_try_job = try_job_util.NeedANewTryJob( | 67 need_try_job = try_job_util.NeedANewTryJob( |
| 67 master_name, builder_name, build_number, failure_info, None, None) | 68 master_name, builder_name, build_number, failure_info, None, None) |
| 68 | 69 |
| 69 self.assertFalse(need_try_job) | 70 self.assertFalse(need_try_job) |
| 70 | 71 |
| 71 def testBailOutForTestTryJob(self): | 72 @mock.patch.object(try_job_util, '_ShouldBailOutForOutdatedBuild') |
| 73 def testBailOutForTestTryJob(self, mock_fn): |
| 72 master_name = 'master2' | 74 master_name = 'master2' |
| 73 builder_name = 'builder2' | 75 builder_name = 'builder2' |
| 74 build_number = 223 | 76 build_number = 223 |
| 75 WfAnalysis.Create(master_name, builder_name, build_number).put() | 77 WfAnalysis.Create(master_name, builder_name, build_number).put() |
| 76 failure_info = { | 78 failure_info = { |
| 77 'master_name': master_name, | 79 'master_name': master_name, |
| 78 'builder_name': builder_name, | 80 'builder_name': builder_name, |
| 79 'build_number': build_number, | 81 'build_number': build_number, |
| 80 'failed_steps': { | 82 'failed_steps': { |
| 81 'a_test': {} | 83 'a_test': {} |
| 82 }, | 84 }, |
| 83 'failure_type': failure_type.TEST | 85 'failure_type': failure_type.TEST |
| 84 } | 86 } |
| 85 | 87 |
| 86 def _MockShouldBailOutForOutdatedBuild(*_): | 88 mock_fn.return_value = False |
| 87 return False | |
| 88 self.mock( | |
| 89 try_job_util, '_ShouldBailOutForOutdatedBuild', | |
| 90 _MockShouldBailOutForOutdatedBuild) | |
| 91 | 89 |
| 92 need_try_job = try_job_util.NeedANewTryJob( | 90 need_try_job = try_job_util.NeedANewTryJob( |
| 93 master_name, builder_name, build_number, failure_info, None, None) | 91 master_name, builder_name, build_number, failure_info, None, None) |
| 94 | 92 |
| 95 self.assertFalse(need_try_job) | 93 self.assertFalse(need_try_job) |
| 96 | 94 |
| 97 def testBailOutForTryJobWithOutdatedTimestamp(self): | 95 @mock.patch.object(try_job_util, '_ShouldBailOutForOutdatedBuild') |
| 96 def testBailOutForTryJobWithOutdatedTimestamp(self, mock_fn): |
| 98 master_name = 'master1' | 97 master_name = 'master1' |
| 99 builder_name = 'builder1' | 98 builder_name = 'builder1' |
| 100 build_number = 223 | 99 build_number = 223 |
| 101 WfAnalysis.Create(master_name, builder_name, build_number).put() | 100 WfAnalysis.Create(master_name, builder_name, build_number).put() |
| 102 failure_info = { | 101 failure_info = { |
| 103 'master_name': master_name, | 102 'master_name': master_name, |
| 104 'builder_name': builder_name, | 103 'builder_name': builder_name, |
| 105 'build_number': build_number, | 104 'build_number': build_number, |
| 106 'failed_steps': { | 105 'failed_steps': { |
| 107 'compile': { | 106 'compile': { |
| 108 'current_failure': 221, | 107 'current_failure': 221, |
| 109 'first_failure': 221, | 108 'first_failure': 221, |
| 110 'last_pass': 220 | 109 'last_pass': 220 |
| 111 } | 110 } |
| 112 }, | 111 }, |
| 113 'failure_type': failure_type.COMPILE | 112 'failure_type': failure_type.COMPILE |
| 114 } | 113 } |
| 115 | 114 |
| 116 yesterday = datetime.utcnow() - timedelta(days=1) | 115 yesterday = datetime.utcnow() - timedelta(days=1) |
| 117 build = WfBuild.Create(master_name, builder_name, build_number) | 116 build = WfBuild.Create(master_name, builder_name, build_number) |
| 118 build.start_time = yesterday | 117 build.start_time = yesterday |
| 119 build.put() | 118 build.put() |
| 120 | 119 |
| 121 def _MockShouldBailOutForOutdatedBuild(*_): | 120 mock_fn.return_value = True |
| 122 return True | |
| 123 | |
| 124 self.mock( | |
| 125 try_job_util, '_ShouldBailOutForOutdatedBuild', | |
| 126 _MockShouldBailOutForOutdatedBuild) | |
| 127 | 121 |
| 128 need_try_job = try_job_util.NeedANewTryJob( | 122 need_try_job = try_job_util.NeedANewTryJob( |
| 129 master_name, builder_name, build_number, failure_info, None, None) | 123 master_name, builder_name, build_number, failure_info, None, None) |
| 130 | 124 |
| 131 self.assertFalse(need_try_job) | 125 self.assertFalse(need_try_job) |
| 132 | 126 |
| 133 def testNotNeedANewTryJobIfNotFirstTimeFailure(self): | 127 @mock.patch.object(try_job_util, '_ShouldBailOutForOutdatedBuild') |
| 128 def testNotNeedANewTryJobIfNotFirstTimeFailure(self, mock_fn): |
| 134 master_name = 'm' | 129 master_name = 'm' |
| 135 builder_name = 'b' | 130 builder_name = 'b' |
| 136 build_number = 223 | 131 build_number = 223 |
| 137 WfAnalysis.Create(master_name, builder_name, build_number).put() | 132 WfAnalysis.Create(master_name, builder_name, build_number).put() |
| 138 failure_info = { | 133 failure_info = { |
| 139 'master_name': master_name, | 134 'master_name': master_name, |
| 140 'builder_name': builder_name, | 135 'builder_name': builder_name, |
| 141 'build_number': build_number, | 136 'build_number': build_number, |
| 142 'failed_steps': { | 137 'failed_steps': { |
| 143 'compile': { | 138 'compile': { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 162 '223': { | 157 '223': { |
| 163 'blame_list': ['223-1', '223-2', '223-3'], | 158 'blame_list': ['223-1', '223-2', '223-3'], |
| 164 'chromium_revision': '223-3' | 159 'chromium_revision': '223-3' |
| 165 } | 160 } |
| 166 }, | 161 }, |
| 167 'failure_type': failure_type.COMPILE | 162 'failure_type': failure_type.COMPILE |
| 168 } | 163 } |
| 169 | 164 |
| 170 WfAnalysis.Create(master_name, builder_name, build_number).put() | 165 WfAnalysis.Create(master_name, builder_name, build_number).put() |
| 171 | 166 |
| 172 def _MockShouldBailOutForOutdatedBuild(*_): | 167 mock_fn.return_value = False |
| 173 return False | |
| 174 self.mock( | |
| 175 try_job_util, '_ShouldBailOutForOutdatedBuild', | |
| 176 _MockShouldBailOutForOutdatedBuild) | |
| 177 | 168 |
| 178 need_try_job = try_job_util.NeedANewTryJob( | 169 need_try_job = try_job_util.NeedANewTryJob( |
| 179 master_name, builder_name, build_number, failure_info, None, None) | 170 master_name, builder_name, build_number, failure_info, None, None) |
| 180 | 171 |
| 181 self.assertFalse(need_try_job) | 172 self.assertFalse(need_try_job) |
| 182 | 173 |
| 183 def testBlameListsIntersect(self): | 174 def testBlameListsIntersect(self): |
| 184 self.assertFalse(try_job_util._BlameListsIntersection(['0'], ['1'])) | 175 self.assertFalse(try_job_util._BlameListsIntersection(['0'], ['1'])) |
| 185 self.assertFalse(try_job_util._BlameListsIntersection(['1'], [])) | 176 self.assertFalse(try_job_util._BlameListsIntersection(['1'], [])) |
| 186 self.assertFalse(try_job_util._BlameListsIntersection([], [])) | 177 self.assertFalse(try_job_util._BlameListsIntersection([], [])) |
| (...skipping 603 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 790 | 781 |
| 791 WfAnalysis.Create(master_name_2, builder_name, build_number).put() | 782 WfAnalysis.Create(master_name_2, builder_name, build_number).put() |
| 792 # Run pipeline with signals that have different failed steps. | 783 # Run pipeline with signals that have different failed steps. |
| 793 # Observe new group creation. | 784 # Observe new group creation. |
| 794 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( | 785 self.assertTrue(try_job_util._IsBuildFailureUniqueAcrossPlatforms( |
| 795 master_name_2, builder_name, build_number, failure_type.TEST, | 786 master_name_2, builder_name, build_number, failure_type.TEST, |
| 796 blame_list, failed_steps_2, None, None)) | 787 blame_list, failed_steps_2, None, None)) |
| 797 self.assertTrue( | 788 self.assertTrue( |
| 798 WfFailureGroup.Get(master_name_2, builder_name, build_number)) | 789 WfFailureGroup.Get(master_name_2, builder_name, build_number)) |
| 799 | 790 |
| 800 def testNotNeedANewTryJobIfOneWithResultExists(self): | 791 @mock.patch.object(try_job_util, '_ShouldBailOutForOutdatedBuild') |
| 792 def testNotNeedANewTryJobIfOneWithResultExists(self, mock_fn): |
| 801 master_name = 'm' | 793 master_name = 'm' |
| 802 builder_name = 'b' | 794 builder_name = 'b' |
| 803 build_number = 223 | 795 build_number = 223 |
| 804 failure_info = { | 796 failure_info = { |
| 805 'failed_steps': { | 797 'failed_steps': { |
| 806 'compile': { | 798 'compile': { |
| 807 'current_failure': 223, | 799 'current_failure': 223, |
| 808 'first_failure': 223, | 800 'first_failure': 223, |
| 809 'last_pass': 220 | 801 'last_pass': 220 |
| 810 } | 802 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 822 'failure_type': failure_type.COMPILE | 814 'failure_type': failure_type.COMPILE |
| 823 } | 815 } |
| 824 | 816 |
| 825 try_job = WfTryJob.Create(master_name, builder_name, build_number) | 817 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 826 try_job.compile_results = [['rev', 'failed']] | 818 try_job.compile_results = [['rev', 'failed']] |
| 827 try_job.status = analysis_status.COMPLETED | 819 try_job.status = analysis_status.COMPLETED |
| 828 try_job.put() | 820 try_job.put() |
| 829 | 821 |
| 830 WfAnalysis.Create(master_name, builder_name, build_number).put() | 822 WfAnalysis.Create(master_name, builder_name, build_number).put() |
| 831 | 823 |
| 832 def _MockShouldBailOutForOutdatedBuild(*_): | 824 mock_fn.return_value = False |
| 833 return False | |
| 834 self.mock( | |
| 835 try_job_util, '_ShouldBailOutForOutdatedBuild', | |
| 836 _MockShouldBailOutForOutdatedBuild) | |
| 837 | 825 |
| 838 need_try_job = try_job_util.NeedANewTryJob( | 826 need_try_job = try_job_util.NeedANewTryJob( |
| 839 master_name, builder_name, build_number, failure_info, None, None) | 827 master_name, builder_name, build_number, failure_info, None, None) |
| 840 | 828 |
| 841 self.assertFalse(need_try_job) | 829 self.assertFalse(need_try_job) |
| 842 | 830 |
| 843 def testNeedANewTryJobIfExistingOneHasError(self): | 831 @mock.patch.object(try_job_util, '_ShouldBailOutForOutdatedBuild') |
| 832 def testNeedANewTryJobIfExistingOneHasError(self, mock_fn): |
| 844 master_name = 'm' | 833 master_name = 'm' |
| 845 builder_name = 'b' | 834 builder_name = 'b' |
| 846 build_number = 223 | 835 build_number = 223 |
| 847 failure_info = { | 836 failure_info = { |
| 848 'failed_steps': { | 837 'failed_steps': { |
| 849 'compile': { | 838 'compile': { |
| 850 'current_failure': 223, | 839 'current_failure': 223, |
| 851 'first_failure': 223, | 840 'first_failure': 223, |
| 852 'last_pass': 220 | 841 'last_pass': 220 |
| 853 } | 842 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 864 }, | 853 }, |
| 865 'failure_type': failure_type.COMPILE | 854 'failure_type': failure_type.COMPILE |
| 866 } | 855 } |
| 867 | 856 |
| 868 try_job = WfTryJob.Create(master_name, builder_name, build_number) | 857 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 869 try_job.status = analysis_status.ERROR | 858 try_job.status = analysis_status.ERROR |
| 870 try_job.put() | 859 try_job.put() |
| 871 | 860 |
| 872 WfAnalysis.Create(master_name, builder_name, build_number).put() | 861 WfAnalysis.Create(master_name, builder_name, build_number).put() |
| 873 | 862 |
| 874 def _MockShouldBailOutForOutdatedBuild(*_): | 863 mock_fn.return_value = False |
| 875 return False | |
| 876 self.mock( | |
| 877 try_job_util, '_ShouldBailOutForOutdatedBuild', | |
| 878 _MockShouldBailOutForOutdatedBuild) | |
| 879 | 864 |
| 880 need_try_job = try_job_util.NeedANewTryJob( | 865 need_try_job = try_job_util.NeedANewTryJob( |
| 881 master_name, builder_name, build_number, failure_info, None, None) | 866 master_name, builder_name, build_number, failure_info, None, None) |
| 882 | 867 |
| 883 self.assertTrue(need_try_job) | 868 self.assertTrue(need_try_job) |
| 884 | 869 |
| 885 def testNotNeedANewTryJobIfNoNewFailure(self): | 870 @mock.patch.object(try_job_util, '_ShouldBailOutForOutdatedBuild') |
| 871 def testNotNeedANewTryJobIfNoNewFailure(self, mock_fn): |
| 886 master_name = 'm' | 872 master_name = 'm' |
| 887 builder_name = 'b' | 873 builder_name = 'b' |
| 888 build_number = 223 | 874 build_number = 223 |
| 889 failure_info = { | 875 failure_info = { |
| 890 'failed_steps': { | 876 'failed_steps': { |
| 891 'a': { | 877 'a': { |
| 892 'current_failure': 223, | 878 'current_failure': 223, |
| 893 'first_failure': 222, | 879 'first_failure': 222, |
| 894 'last_pass': 221, | 880 'last_pass': 221, |
| 895 'tests': { | 881 'tests': { |
| 896 'a.t2': { | 882 'a.t2': { |
| 897 'current_failure': 223, | 883 'current_failure': 223, |
| 898 'first_failure': 222, | 884 'first_failure': 222, |
| 899 'last_pass': 221 | 885 'last_pass': 221 |
| 900 } | 886 } |
| 901 } | 887 } |
| 902 } | 888 } |
| 903 }, | 889 }, |
| 904 'failure_type': failure_type.TEST | 890 'failure_type': failure_type.TEST |
| 905 } | 891 } |
| 906 | 892 |
| 907 analysis = WfAnalysis.Create(master_name, builder_name, build_number) | 893 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
| 908 analysis.failure_result_map = { | 894 analysis.failure_result_map = { |
| 909 'a': { | 895 'a': { |
| 910 'a.t2': 'm/b/222' | 896 'a.t2': 'm/b/222' |
| 911 } | 897 } |
| 912 } | 898 } |
| 913 analysis.put() | 899 analysis.put() |
| 914 | 900 |
| 915 def _MockShouldBailOutForOutdatedBuild(*_): | 901 mock_fn.return_value = False |
| 916 return False | |
| 917 self.mock( | |
| 918 try_job_util, '_ShouldBailOutForOutdatedBuild', | |
| 919 _MockShouldBailOutForOutdatedBuild) | |
| 920 | 902 |
| 921 need_try_job = try_job_util.NeedANewTryJob( | 903 need_try_job = try_job_util.NeedANewTryJob( |
| 922 master_name, builder_name, build_number, failure_info, None, None) | 904 master_name, builder_name, build_number, failure_info, None, None) |
| 923 | 905 |
| 924 self.assertFalse(need_try_job) | 906 self.assertFalse(need_try_job) |
| 925 | 907 |
| 926 def testNeedANewTryJobIfTestFailureSwarming(self): | 908 @mock.patch.object(try_job_util, '_ShouldBailOutForOutdatedBuild') |
| 909 def testNeedANewTryJobIfTestFailureSwarming(self, mock_fn): |
| 927 master_name = 'm' | 910 master_name = 'm' |
| 928 builder_name = 'b' | 911 builder_name = 'b' |
| 929 build_number = 223 | 912 build_number = 223 |
| 930 failure_info = { | 913 failure_info = { |
| 931 'failed_steps': { | 914 'failed_steps': { |
| 932 'a': { | 915 'a': { |
| 933 'current_failure': 223, | 916 'current_failure': 223, |
| 934 'first_failure': 222, | 917 'first_failure': 222, |
| 935 'last_pass': 221, | 918 'last_pass': 221, |
| 936 'tests': { | 919 'tests': { |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 990 'a.t2': 'm/b/222', | 973 'a.t2': 'm/b/222', |
| 991 'a.t3': 'm/b/223' | 974 'a.t3': 'm/b/223' |
| 992 }, | 975 }, |
| 993 'b': { | 976 'b': { |
| 994 'b.t1': 'm/b/222', | 977 'b.t1': 'm/b/222', |
| 995 'b.t2': 'm/b/222' | 978 'b.t2': 'm/b/222' |
| 996 } | 979 } |
| 997 } | 980 } |
| 998 analysis.put() | 981 analysis.put() |
| 999 | 982 |
| 1000 def _MockShouldBailOutForOutdatedBuild(*_): | 983 mock_fn.return_value = False |
| 1001 return False | |
| 1002 self.mock( | |
| 1003 try_job_util, '_ShouldBailOutForOutdatedBuild', | |
| 1004 _MockShouldBailOutForOutdatedBuild) | |
| 1005 | 984 |
| 1006 need_try_job = try_job_util.NeedANewTryJob( | 985 need_try_job = try_job_util.NeedANewTryJob( |
| 1007 master_name, builder_name, build_number, failure_info, None, None) | 986 master_name, builder_name, build_number, failure_info, None, None) |
| 1008 | 987 |
| 1009 self.assertTrue(need_try_job) | 988 self.assertTrue(need_try_job) |
| 1010 | 989 |
| 1011 def testNeedANewTryJob(self): | 990 @mock.patch.object(try_job_util, '_ShouldBailOutForOutdatedBuild') |
| 991 def testNeedANewTryJob(self, mock_fn): |
| 1012 master_name = 'm' | 992 master_name = 'm' |
| 1013 builder_name = 'b' | 993 builder_name = 'b' |
| 1014 build_number = 223 | 994 build_number = 223 |
| 1015 failure_info = { | 995 failure_info = { |
| 1016 'master_name': master_name, | 996 'master_name': master_name, |
| 1017 'builder_name': builder_name, | 997 'builder_name': builder_name, |
| 1018 'build_number': build_number, | 998 'build_number': build_number, |
| 1019 'failed_steps': { | 999 'failed_steps': { |
| 1020 'compile': { | 1000 'compile': { |
| 1021 'current_failure': 223, | 1001 'current_failure': 223, |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1035 }, | 1015 }, |
| 1036 'failure_type': failure_type.COMPILE | 1016 'failure_type': failure_type.COMPILE |
| 1037 } | 1017 } |
| 1038 | 1018 |
| 1039 analysis = WfAnalysis.Create(master_name, builder_name, build_number) | 1019 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
| 1040 analysis.failure_result_map = { | 1020 analysis.failure_result_map = { |
| 1041 'compile': 'm/b/223' | 1021 'compile': 'm/b/223' |
| 1042 } | 1022 } |
| 1043 analysis.put() | 1023 analysis.put() |
| 1044 | 1024 |
| 1045 def _MockShouldBailOutForOutdatedBuild(*_): | 1025 mock_fn.return_value = False |
| 1046 return False | |
| 1047 self.mock( | |
| 1048 try_job_util, '_ShouldBailOutForOutdatedBuild', | |
| 1049 _MockShouldBailOutForOutdatedBuild) | |
| 1050 | 1026 |
| 1051 need_try_job = try_job_util.NeedANewTryJob( | 1027 need_try_job = try_job_util.NeedANewTryJob( |
| 1052 master_name, builder_name, build_number, failure_info, None, None) | 1028 master_name, builder_name, build_number, failure_info, None, None) |
| 1053 | 1029 |
| 1054 self.assertTrue(need_try_job) | 1030 self.assertTrue(need_try_job) |
| 1055 | 1031 |
| 1056 def testNotNeedANewTryJobForOtherType(self): | 1032 @mock.patch.object(try_job_util, '_ShouldBailOutForOutdatedBuild') |
| 1033 def testNotNeedANewTryJobForOtherType(self, mock_fn): |
| 1057 master_name = 'm' | 1034 master_name = 'm' |
| 1058 builder_name = 'b' | 1035 builder_name = 'b' |
| 1059 build_number = 223 | 1036 build_number = 223 |
| 1060 failure_info = { | 1037 failure_info = { |
| 1061 'master_name': master_name, | 1038 'master_name': master_name, |
| 1062 'builder_name': builder_name, | 1039 'builder_name': builder_name, |
| 1063 'build_number': build_number, | 1040 'build_number': build_number, |
| 1064 'failed_steps': {}, | 1041 'failed_steps': {}, |
| 1065 'builds': { | 1042 'builds': { |
| 1066 '222': { | 1043 '222': { |
| 1067 'blame_list': ['222-1'], | 1044 'blame_list': ['222-1'], |
| 1068 'chromium_revision': '222-1' | 1045 'chromium_revision': '222-1' |
| 1069 }, | 1046 }, |
| 1070 '223': { | 1047 '223': { |
| 1071 'blame_list': ['223-1', '223-2', '223-3'], | 1048 'blame_list': ['223-1', '223-2', '223-3'], |
| 1072 'chromium_revision': '223-3' | 1049 'chromium_revision': '223-3' |
| 1073 } | 1050 } |
| 1074 }, | 1051 }, |
| 1075 'failure_type': failure_type.UNKNOWN | 1052 'failure_type': failure_type.UNKNOWN |
| 1076 } | 1053 } |
| 1077 | 1054 |
| 1078 def _MockShouldBailOutForOutdatedBuild(*_): | 1055 mock_fn.return_value = False |
| 1079 return False | |
| 1080 self.mock( | |
| 1081 try_job_util, '_ShouldBailOutForOutdatedBuild', | |
| 1082 _MockShouldBailOutForOutdatedBuild) | |
| 1083 | 1056 |
| 1084 need_try_job = try_job_util.NeedANewTryJob( | 1057 need_try_job = try_job_util.NeedANewTryJob( |
| 1085 master_name, builder_name, build_number, failure_info, None, None) | 1058 master_name, builder_name, build_number, failure_info, None, None) |
| 1086 | 1059 |
| 1087 self.assertFalse(need_try_job) | 1060 self.assertFalse(need_try_job) |
| 1088 | 1061 |
| 1089 def testNotNeedANewTryJobForCompileTypeNoFailureInfo(self): | 1062 @mock.patch.object(try_job_util, '_ShouldBailOutForOutdatedBuild') |
| 1063 def testNotNeedANewTryJobForCompileTypeNoFailureInfo(self, mock_fn): |
| 1090 master_name = 'm' | 1064 master_name = 'm' |
| 1091 builder_name = 'b' | 1065 builder_name = 'b' |
| 1092 build_number = 223 | 1066 build_number = 223 |
| 1093 failure_info = { | 1067 failure_info = { |
| 1094 'master_name': master_name, | 1068 'master_name': master_name, |
| 1095 'builder_name': builder_name, | 1069 'builder_name': builder_name, |
| 1096 'build_number': build_number, | 1070 'build_number': build_number, |
| 1097 'failed_steps': {}, | 1071 'failed_steps': {}, |
| 1098 'builds': { | 1072 'builds': { |
| 1099 '222': { | 1073 '222': { |
| 1100 'blame_list': ['222-1'], | 1074 'blame_list': ['222-1'], |
| 1101 'chromium_revision': '222-1' | 1075 'chromium_revision': '222-1' |
| 1102 }, | 1076 }, |
| 1103 '223': { | 1077 '223': { |
| 1104 'blame_list': ['223-1', '223-2', '223-3'], | 1078 'blame_list': ['223-1', '223-2', '223-3'], |
| 1105 'chromium_revision': '223-3' | 1079 'chromium_revision': '223-3' |
| 1106 } | 1080 } |
| 1107 }, | 1081 }, |
| 1108 'failure_type': failure_type.COMPILE | 1082 'failure_type': failure_type.COMPILE |
| 1109 } | 1083 } |
| 1110 | 1084 |
| 1111 def _MockShouldBailOutForOutdatedBuild(*_): | 1085 mock_fn.return_value = False |
| 1112 return False | |
| 1113 self.mock( | |
| 1114 try_job_util, '_ShouldBailOutForOutdatedBuild', | |
| 1115 _MockShouldBailOutForOutdatedBuild) | |
| 1116 | 1086 |
| 1117 need_try_job = try_job_util.NeedANewTryJob( | 1087 need_try_job = try_job_util.NeedANewTryJob( |
| 1118 master_name, builder_name, build_number, failure_info, None, None) | 1088 master_name, builder_name, build_number, failure_info, None, None) |
| 1119 | 1089 |
| 1120 self.assertFalse(need_try_job) | 1090 self.assertFalse(need_try_job) |
| 1121 | 1091 |
| 1122 def testForceTryJob(self): | 1092 def testForceTryJob(self): |
| 1123 master_name = 'm' | 1093 master_name = 'm' |
| 1124 builder_name = 'b' | 1094 builder_name = 'b' |
| 1125 build_number = 223 | 1095 build_number = 223 |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1284 'failed_targets': [ | 1254 'failed_targets': [ |
| 1285 {'source': 'b.cc', 'target': 'b.o'}, | 1255 {'source': 'b.cc', 'target': 'b.o'}, |
| 1286 ] | 1256 ] |
| 1287 } | 1257 } |
| 1288 } | 1258 } |
| 1289 | 1259 |
| 1290 self.assertEqual( | 1260 self.assertEqual( |
| 1291 try_job_util.GetFailedTargetsFromSignals( | 1261 try_job_util.GetFailedTargetsFromSignals( |
| 1292 signals, 'master1', 'builder1'), | 1262 signals, 'master1', 'builder1'), |
| 1293 ['b.o']) | 1263 ['b.o']) |
| OLD | NEW |