| 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.pipeline_wrapper import pipeline_handlers | 7 from common.pipeline_wrapper import pipeline_handlers |
| 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 |
| 12 from model.wf_suspected_cl import WfSuspectedCL |
| 11 from waterfall import build_failure_analysis | 13 from waterfall import build_failure_analysis |
| 12 from waterfall import identify_culprit_pipeline | 14 from waterfall import identify_culprit_pipeline |
| 13 | 15 |
| 14 | 16 |
| 15 class IdentifyCulpritPipelineTest(testing.AppengineTestCase): | 17 class IdentifyCulpritPipelineTest(testing.AppengineTestCase): |
| 16 app_module = pipeline_handlers._APP | 18 app_module = pipeline_handlers._APP |
| 17 | 19 |
| 18 def testGetSuspectedCLs(self): | |
| 19 dummy_result = { | |
| 20 'failures': [ | |
| 21 { | |
| 22 'step_name': 'a', | |
| 23 'first_failure': 98, | |
| 24 'last_pass': None, | |
| 25 'suspected_cls': [ | |
| 26 { | |
| 27 'build_number': 99, | |
| 28 'repo_name': 'chromium', | |
| 29 'revision': 'r99_1', | |
| 30 'commit_position': None, | |
| 31 'url': None, | |
| 32 'score': 1, | |
| 33 'hints': { | |
| 34 'modified f99_2.cc (and it was in log)': 1, | |
| 35 }, | |
| 36 } | |
| 37 ], | |
| 38 }, | |
| 39 { | |
| 40 'step_name': 'b', | |
| 41 'first_failure': 98, | |
| 42 'last_pass': None, | |
| 43 'suspected_cls': [ | |
| 44 { | |
| 45 'build_number': 99, | |
| 46 'repo_name': 'chromium', | |
| 47 'revision': 'r99_2', | |
| 48 'commit_position': None, | |
| 49 'url': None, | |
| 50 'score': 5, | |
| 51 'hints': { | |
| 52 'added x/y/f99_1.cc (and it was in log)': 5, | |
| 53 }, | |
| 54 } | |
| 55 ], | |
| 56 } | |
| 57 ] | |
| 58 } | |
| 59 | |
| 60 expected_suspected_cls = [ | |
| 61 { | |
| 62 'repo_name': 'chromium', | |
| 63 'revision': 'r99_1', | |
| 64 'commit_position': None, | |
| 65 'url': None | |
| 66 }, | |
| 67 { | |
| 68 'repo_name': 'chromium', | |
| 69 'revision': 'r99_2', | |
| 70 'commit_position': None, | |
| 71 'url': None | |
| 72 } | |
| 73 ] | |
| 74 | |
| 75 self.assertEqual(expected_suspected_cls, | |
| 76 identify_culprit_pipeline._GetSuspectedCLs(dummy_result)) | |
| 77 | |
| 78 def testGetSuspectedCLsNoDuplicates(self): | |
| 79 dummy_result = { | |
| 80 'failures': [ | |
| 81 { | |
| 82 'step_name': 'a', | |
| 83 'first_failure': 98, | |
| 84 'last_pass': None, | |
| 85 'suspected_cls': [ | |
| 86 { | |
| 87 'build_number': 99, | |
| 88 'repo_name': 'chromium', | |
| 89 'revision': 'r99_1', | |
| 90 'commit_position': None, | |
| 91 'url': None, | |
| 92 'score': 1, | |
| 93 'hints': { | |
| 94 'modified f99_2.cc (and it was in log)': 1, | |
| 95 }, | |
| 96 } | |
| 97 ], | |
| 98 }, | |
| 99 { | |
| 100 'step_name': 'b', | |
| 101 'first_failure': 98, | |
| 102 'last_pass': None, | |
| 103 'suspected_cls': [ | |
| 104 { | |
| 105 'build_number': 99, | |
| 106 'repo_name': 'chromium', | |
| 107 'revision': 'r99_1', | |
| 108 'commit_position': None, | |
| 109 'url': None, | |
| 110 'score': 5, | |
| 111 'hints': { | |
| 112 'added x/y/f99_1.cc (and it was in log)': 5, | |
| 113 }, | |
| 114 } | |
| 115 ], | |
| 116 } | |
| 117 ] | |
| 118 } | |
| 119 | |
| 120 expected_suspected_cls = [ | |
| 121 { | |
| 122 'repo_name': 'chromium', | |
| 123 'revision': 'r99_1', | |
| 124 'commit_position': None, | |
| 125 'url': None | |
| 126 } | |
| 127 ] | |
| 128 | |
| 129 self.assertEqual(expected_suspected_cls, | |
| 130 identify_culprit_pipeline._GetSuspectedCLs(dummy_result)) | |
| 131 | |
| 132 def testGetResultAnalysisStatusFoundUntriaged(self): | 20 def testGetResultAnalysisStatusFoundUntriaged(self): |
| 133 dummy_result = { | 21 dummy_result = { |
| 134 'failures': [ | 22 'failures': [ |
| 135 { | 23 { |
| 136 'step_name': 'a', | 24 'step_name': 'a', |
| 137 'first_failure': 98, | 25 'first_failure': 98, |
| 138 'last_pass': None, | 26 'last_pass': None, |
| 139 'suspected_cls': [ | 27 'suspected_cls': [ |
| 140 { | 28 { |
| 141 'build_number': 99, | 29 'build_number': 99, |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 | 92 |
| 205 analysis = WfAnalysis.Create(master_name, builder_name, build_number) | 93 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
| 206 analysis.result = None | 94 analysis.result = None |
| 207 analysis.status = analysis_status.RUNNING | 95 analysis.status = analysis_status.RUNNING |
| 208 analysis.put() | 96 analysis.put() |
| 209 | 97 |
| 210 failure_info = { | 98 failure_info = { |
| 211 'master_name': master_name, | 99 'master_name': master_name, |
| 212 'builder_name': builder_name, | 100 'builder_name': builder_name, |
| 213 'build_number': build_number, | 101 'build_number': build_number, |
| 102 'failure_type': failure_type.TEST |
| 214 } | 103 } |
| 215 change_logs = {} | 104 change_logs = {} |
| 216 deps_info = {} | 105 deps_info = {} |
| 217 signals = {} | 106 signals = {} |
| 218 | 107 |
| 219 dummy_result = {'failures': []} | 108 dummy_result = {'failures': []} |
| 220 | 109 |
| 221 def MockAnalyzeBuildFailure(*_): | 110 def MockAnalyzeBuildFailure(*_): |
| 222 return dummy_result | 111 return dummy_result, [] |
| 223 | 112 |
| 224 self.mock(build_failure_analysis, | 113 self.mock(build_failure_analysis, |
| 225 'AnalyzeBuildFailure', MockAnalyzeBuildFailure) | 114 'AnalyzeBuildFailure', MockAnalyzeBuildFailure) |
| 226 | 115 |
| 227 pipeline = identify_culprit_pipeline.IdentifyCulpritPipeline( | 116 pipeline = identify_culprit_pipeline.IdentifyCulpritPipeline( |
| 228 failure_info, change_logs, deps_info, signals, True) | 117 failure_info, change_logs, deps_info, signals, True) |
| 229 pipeline.start() | 118 pipeline.start() |
| 230 self.execute_queued_tasks() | 119 self.execute_queued_tasks() |
| 231 | 120 |
| 232 expected_suspected_cls = [] | 121 expected_suspected_cls = [] |
| 233 | 122 |
| 234 analysis = WfAnalysis.Get(master_name, builder_name, build_number) | 123 analysis = WfAnalysis.Get(master_name, builder_name, build_number) |
| 235 self.assertTrue(analysis.build_completed) | 124 self.assertTrue(analysis.build_completed) |
| 236 self.assertIsNotNone(analysis) | 125 self.assertIsNotNone(analysis) |
| 237 self.assertEqual(dummy_result, analysis.result) | 126 self.assertEqual(dummy_result, analysis.result) |
| 238 self.assertEqual(analysis_status.COMPLETED, analysis.status) | 127 self.assertEqual(analysis_status.COMPLETED, analysis.status) |
| 239 self.assertIsNone(analysis.result_status) | 128 self.assertIsNone(analysis.result_status) |
| 240 self.assertEqual(expected_suspected_cls, analysis.suspected_cls) | 129 self.assertEqual(expected_suspected_cls, analysis.suspected_cls) |
| 130 |
| 131 def testSaveSuspectedCLs(self): |
| 132 suspected_cls = [ |
| 133 { |
| 134 'repo_name': 'chromium', |
| 135 'revision': 'r98_1', |
| 136 'commit_position': None, |
| 137 'url': None, |
| 138 'failures': { |
| 139 'b': ['Unittest2.Subtest1', 'Unittest3.Subtest2'] |
| 140 }, |
| 141 'top_score': 4 |
| 142 } |
| 143 ] |
| 144 master_name = 'm' |
| 145 builder_name = 'b' |
| 146 build_number = 98 |
| 147 test_type = failure_type.TEST |
| 148 |
| 149 identify_culprit_pipeline._SaveSuspectedCLs( |
| 150 suspected_cls, master_name, builder_name, build_number, test_type) |
| 151 |
| 152 suspected_cl = WfSuspectedCL.Get('chromium', 'r98_1') |
| 153 self.assertIsNotNone(suspected_cl) |
| 154 |
| 155 def testGetSuspectedCLsWithOnlyCLInfo(self): |
| 156 suspected_cls = [ |
| 157 { |
| 158 'repo_name': 'chromium', |
| 159 'revision': 'r98_1', |
| 160 'commit_position': None, |
| 161 'url': None, |
| 162 'failures': { |
| 163 'b': ['Unittest2.Subtest1', 'Unittest3.Subtest2'] |
| 164 }, |
| 165 'top_score': 4 |
| 166 } |
| 167 ] |
| 168 |
| 169 expected_new_suspected_cls = [ |
| 170 { |
| 171 'repo_name': 'chromium', |
| 172 'revision': 'r98_1', |
| 173 'commit_position': None, |
| 174 'url': None |
| 175 } |
| 176 ] |
| 177 |
| 178 self.assertEqual( |
| 179 expected_new_suspected_cls, |
| 180 identify_culprit_pipeline._GetSuspectedCLsWithOnlyCLInfo(suspected_cls)) |
| OLD | NEW |