| 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 model import wf_analysis_status | 8 from model import wf_analysis_status |
| 9 from model.wf_try_job import WfTryJob | 9 from model.wf_try_job import WfTryJob |
| 10 from waterfall.identify_try_job_culprit_pipeline import( | 10 from waterfall.identify_try_job_culprit_pipeline import( |
| 11 IdentifyTryJobCulpritPipeline) | 11 IdentifyTryJobCulpritPipeline) |
| 12 | 12 |
| 13 | 13 |
| 14 class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase): | 14 class IdentifyTryJobCulpritPipelineTest(testing.AppengineTestCase): |
| 15 | 15 |
| 16 def _MockGetChangeLog(self, revision): | 16 def _MockGetChangeLog(self, revision): |
| 17 class MockedChangeLog(object): | 17 class MockedChangeLog(object): |
| 18 | 18 |
| 19 def __init__(self, commit_position, code_review_url): | 19 def __init__(self, commit_position, code_review_url): |
| 20 self.commit_position = commit_position | 20 self.commit_position = commit_position |
| 21 self.code_review_url = code_review_url | 21 self.code_review_url = code_review_url |
| 22 | 22 |
| 23 mock_change_logs = {} | 23 mock_change_logs = {} |
| 24 mock_change_logs['rev2'] = MockedChangeLog('2', 'url_2') | 24 mock_change_logs['rev2'] = MockedChangeLog('2', 'url_2') |
| 25 return mock_change_logs.get(revision) | 25 return mock_change_logs.get(revision) |
| 26 | 26 |
| 27 def testGetFailedRevisionFromResultsDict(self): |
| 28 self.assertIsNone( |
| 29 IdentifyTryJobCulpritPipeline._GetFailedRevisionFromResultsDict({})) |
| 30 self.assertEqual( |
| 31 None, |
| 32 IdentifyTryJobCulpritPipeline._GetFailedRevisionFromResultsDict( |
| 33 {'rev1': 'passed'})) |
| 34 self.assertEqual( |
| 35 'rev1', |
| 36 IdentifyTryJobCulpritPipeline._GetFailedRevisionFromResultsDict( |
| 37 {'rev1': 'failed'})) |
| 38 self.assertEqual( |
| 39 'rev2', |
| 40 IdentifyTryJobCulpritPipeline._GetFailedRevisionFromResultsDict( |
| 41 {'rev1': 'passed', 'rev2': 'failed'})) |
| 42 |
| 43 def testFindFailedRevisionFromCompileResult(self): |
| 44 self.assertIsNone( |
| 45 IdentifyTryJobCulpritPipeline._FindFailedRevisionFromCompileResult( |
| 46 None)) |
| 47 self.assertIsNone( |
| 48 IdentifyTryJobCulpritPipeline._FindFailedRevisionFromCompileResult( |
| 49 {'analysis_info': {}})) |
| 50 self.assertIsNone( |
| 51 IdentifyTryJobCulpritPipeline._FindFailedRevisionFromCompileResult( |
| 52 { |
| 53 'analysis_info': { |
| 54 'result': { |
| 55 'rev1': 'passed' |
| 56 } |
| 57 } |
| 58 })) |
| 59 self.assertEqual( |
| 60 'rev2', |
| 61 IdentifyTryJobCulpritPipeline._FindFailedRevisionFromCompileResult( |
| 62 { |
| 63 'analysis_info': { |
| 64 'result': { |
| 65 'rev1': 'passed', |
| 66 'rev2': 'failed' |
| 67 } |
| 68 } |
| 69 })) |
| 70 |
| 71 def testGetCulpritFromFailedRevision(self): |
| 72 self.mock(GitRepository, 'GetChangeLog', self._MockGetChangeLog) |
| 73 self.assertIsNone( |
| 74 IdentifyTryJobCulpritPipeline._GetCulpritFromFailedRevision(None)) |
| 75 self.assertEqual( |
| 76 { |
| 77 'revision': 'rev2', |
| 78 'commit_position': '2', |
| 79 'review_url': 'url_2' |
| 80 }, |
| 81 IdentifyTryJobCulpritPipeline._GetCulpritFromFailedRevision('rev2')) |
| 82 |
| 27 def testIdentifyCulpritForCompileReturnNoneIfNoCompileResult(self): | 83 def testIdentifyCulpritForCompileReturnNoneIfNoCompileResult(self): |
| 28 master_name = 'm' | 84 master_name = 'm' |
| 29 builder_name = 'b' | 85 builder_name = 'b' |
| 30 build_number = 1 | 86 build_number = 1 |
| 31 try_job_id = '1' | 87 try_job_id = '1' |
| 32 compile_result = None | 88 compile_result = None |
| 33 | 89 |
| 34 WfTryJob.Create(master_name, builder_name, build_number).put() | 90 WfTryJob.Create(master_name, builder_name, build_number).put() |
| 35 pipeline = IdentifyTryJobCulpritPipeline() | 91 pipeline = IdentifyTryJobCulpritPipeline() |
| 36 culprit = pipeline.run( | 92 culprit = pipeline.run( |
| 37 master_name, builder_name, build_number, try_job_id, compile_result) | 93 master_name, builder_name, build_number, try_job_id, compile_result) |
| 38 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 94 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 39 | 95 |
| 40 self.assertIsNone(culprit) | 96 self.assertIsNone(culprit) |
| 41 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) | 97 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) |
| 42 | 98 |
| 43 def testIdentifyCulpritForCompileReturnNoneIfNoTryJobResultForCompile(self): | 99 def testIdentifyCulpritForCompileReturnNoneIfNoTryJobResultForCompile(self): |
| 44 master_name = 'm' | 100 master_name = 'm' |
| 45 builder_name = 'b' | 101 builder_name = 'b' |
| 46 build_number = 1 | 102 build_number = 1 |
| 47 try_job_id = '1' | 103 try_job_id = '1' |
| 48 compile_result = { | 104 compile_result = { |
| 49 'result': [], | 105 'analysis_info': { |
| 106 'result': {}, |
| 107 }, |
| 50 'url': 'url', | 108 'url': 'url', |
| 51 'try_job_id': '1', | 109 'try_job_id': '1', |
| 52 } | 110 } |
| 53 WfTryJob.Create(master_name, builder_name, build_number).put() | 111 WfTryJob.Create(master_name, builder_name, build_number).put() |
| 54 | 112 |
| 55 pipeline = IdentifyTryJobCulpritPipeline() | 113 pipeline = IdentifyTryJobCulpritPipeline() |
| 56 culprit = pipeline.run( | 114 culprit = pipeline.run( |
| 57 master_name, builder_name, build_number, try_job_id, compile_result) | 115 master_name, builder_name, build_number, try_job_id, compile_result) |
| 58 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 116 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 59 | 117 |
| 60 self.assertIsNone(culprit) | 118 self.assertIsNone(culprit) |
| 61 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) | 119 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) |
| 62 | 120 |
| 63 def testIdentifyCulpritForCompileReturnNoneIfAllPassed(self): | 121 def testIdentifyCulpritForCompileReturnNoneIfAllPassed(self): |
| 64 master_name = 'm' | 122 master_name = 'm' |
| 65 builder_name = 'b' | 123 builder_name = 'b' |
| 66 build_number = 1 | 124 build_number = 1 |
| 67 try_job_id = '1' | 125 try_job_id = '1' |
| 68 compile_result = { | 126 compile_result = { |
| 127 'analysis_info': { |
| 128 'result': { |
| 129 'rev1': 'passed', |
| 130 'rev2': 'passed' |
| 131 } |
| 132 }, |
| 133 'url': 'url', |
| 134 'try_job_id': '1', |
| 135 } |
| 136 WfTryJob.Create(master_name, builder_name, build_number).put() |
| 137 |
| 138 pipeline = IdentifyTryJobCulpritPipeline() |
| 139 culprit = pipeline.run( |
| 140 master_name, builder_name, build_number, try_job_id, compile_result) |
| 141 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 142 |
| 143 self.assertIsNone(culprit) |
| 144 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) |
| 145 |
| 146 def testIdentifyCulpritForCompileReturnNoneIfNoChangeLog(self): |
| 147 master_name = 'm' |
| 148 builder_name = 'b' |
| 149 build_number = 1 |
| 150 try_job_id = '1' |
| 151 compile_result = { |
| 152 'result': [ |
| 153 ['rev1', 'failed'] |
| 154 ], |
| 155 'url': 'url', |
| 156 'try_job_id': '1', |
| 157 } |
| 158 |
| 159 self.mock(GitRepository, 'GetChangeLog', self._MockGetChangeLog) |
| 160 WfTryJob.Create(master_name, builder_name, build_number).put() |
| 161 |
| 162 pipeline = IdentifyTryJobCulpritPipeline() |
| 163 culprit = pipeline.run( |
| 164 master_name, builder_name, build_number, try_job_id, compile_result) |
| 165 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 166 |
| 167 self.assertIsNone(culprit) |
| 168 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) |
| 169 |
| 170 def testIdentifyCulpritForCompileTryJobSuccess(self): |
| 171 master_name = 'm' |
| 172 builder_name = 'b' |
| 173 build_number = 1 |
| 174 try_job_id = '1' |
| 175 compile_result = { |
| 176 'analysis_info': { |
| 177 'result': { |
| 178 'rev1': 'passed', |
| 179 'rev2': 'failed' |
| 180 } |
| 181 }, |
| 182 'url': 'url', |
| 183 'try_job_id': '1', |
| 184 } |
| 185 |
| 186 try_job = WfTryJob.Create(master_name, builder_name, build_number) |
| 187 try_job.status = wf_analysis_status.ANALYZING |
| 188 try_job.compile_results = [{ |
| 189 'analysis_info': { |
| 190 'result': { |
| 191 'rev1': 'passed', |
| 192 'rev2': 'failed' |
| 193 }, |
| 194 }, |
| 195 'url': 'url', |
| 196 'try_job_id': '1', |
| 197 }] |
| 198 try_job.put() |
| 199 |
| 200 self.mock(GitRepository, 'GetChangeLog', self._MockGetChangeLog) |
| 201 |
| 202 pipeline = IdentifyTryJobCulpritPipeline() |
| 203 culprit = pipeline.run( |
| 204 master_name, builder_name, build_number, try_job_id, compile_result) |
| 205 |
| 206 expected_compile_result = { |
| 207 'analysis_info': { |
| 208 'result': { |
| 209 'rev1': 'passed', |
| 210 'rev2': 'failed' |
| 211 } |
| 212 }, |
| 213 'url': 'url', |
| 214 'try_job_id': '1', |
| 215 'culprit': { |
| 216 'revision': 'rev2', |
| 217 'commit_position': '2', |
| 218 'review_url': 'url_2' |
| 219 } |
| 220 } |
| 221 |
| 222 self.assertEqual(expected_compile_result['culprit'], culprit) |
| 223 |
| 224 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 225 self.assertEqual(expected_compile_result, try_job.compile_results[-1]) |
| 226 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) |
| 227 |
| 228 # TODO(lijeffrey): Deprecate all tests with compile_results whose 'result' |
| 229 # key is a list once it is returned as a dict from the recipe. |
| 230 def testIdentifyCulpritForCompileNoTryJobResultListForCompile(self): |
| 231 master_name = 'm' |
| 232 builder_name = 'b' |
| 233 build_number = 1 |
| 234 try_job_id = '1' |
| 235 compile_result = { |
| 236 'result': [], |
| 237 'url': 'url', |
| 238 'try_job_id': '1', |
| 239 } |
| 240 WfTryJob.Create(master_name, builder_name, build_number).put() |
| 241 |
| 242 pipeline = IdentifyTryJobCulpritPipeline() |
| 243 culprit = pipeline.run( |
| 244 master_name, builder_name, build_number, try_job_id, compile_result) |
| 245 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 246 |
| 247 self.assertIsNone(culprit) |
| 248 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) |
| 249 |
| 250 def testIdentifyCulpritForCompileListReturnNoneIfAllPassed(self): |
| 251 master_name = 'm' |
| 252 builder_name = 'b' |
| 253 build_number = 1 |
| 254 try_job_id = '1' |
| 255 compile_result = { |
| 69 'result': [ | 256 'result': [ |
| 70 ['rev1', 'passed'], | 257 ['rev1', 'passed'], |
| 71 ['rev2', 'passed'] | 258 ['rev2', 'passed'] |
| 72 ], | 259 ], |
| 73 'url': 'url', | 260 'url': 'url', |
| 74 'try_job_id': '1', | 261 'try_job_id': '1', |
| 75 } | 262 } |
| 76 WfTryJob.Create(master_name, builder_name, build_number).put() | 263 WfTryJob.Create(master_name, builder_name, build_number).put() |
| 77 | 264 |
| 78 pipeline = IdentifyTryJobCulpritPipeline() | 265 pipeline = IdentifyTryJobCulpritPipeline() |
| 79 culprit = pipeline.run( | 266 culprit = pipeline.run( |
| 80 master_name, builder_name, build_number, try_job_id, compile_result) | 267 master_name, builder_name, build_number, try_job_id, compile_result) |
| 81 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 268 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 82 | 269 |
| 83 self.assertIsNone(culprit) | 270 self.assertIsNone(culprit) |
| 84 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) | 271 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) |
| 85 | 272 |
| 86 def testIdentifyCulpritForCompileReturnNoneIfNoChangeLog(self): | 273 def testIdentifyCulpritForCompileListReturnNoneIfNoChangeLog(self): |
| 87 master_name = 'm' | 274 master_name = 'm' |
| 88 builder_name = 'b' | 275 builder_name = 'b' |
| 89 build_number = 1 | 276 build_number = 1 |
| 90 try_job_id = '1' | 277 try_job_id = '1' |
| 91 compile_result = { | 278 compile_result = { |
| 92 'result': [ | 279 'result': [ |
| 93 ['rev1', 'failed'] | 280 ['rev1', 'failed'] |
| 94 ], | 281 ], |
| 95 'url': 'url', | 282 'url': 'url', |
| 96 'try_job_id': '1', | 283 'try_job_id': '1', |
| 97 } | 284 } |
| 98 | 285 |
| 99 self.mock(GitRepository, 'GetChangeLog', self._MockGetChangeLog) | 286 self.mock(GitRepository, 'GetChangeLog', self._MockGetChangeLog) |
| 100 WfTryJob.Create(master_name, builder_name, build_number).put() | 287 WfTryJob.Create(master_name, builder_name, build_number).put() |
| 101 | 288 |
| 102 pipeline = IdentifyTryJobCulpritPipeline() | 289 pipeline = IdentifyTryJobCulpritPipeline() |
| 103 culprit = pipeline.run( | 290 culprit = pipeline.run( |
| 104 master_name, builder_name, build_number, try_job_id, compile_result) | 291 master_name, builder_name, build_number, try_job_id, compile_result) |
| 105 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 292 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 106 | 293 |
| 107 self.assertIsNone(culprit) | 294 self.assertIsNone(culprit) |
| 108 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) | 295 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) |
| 109 | 296 |
| 110 def testIdentifyCulpritForCompileTryJobSuccess(self): | 297 def testIdentifyCulpritForCompileListTryJobSuccess(self): |
| 111 master_name = 'm' | 298 master_name = 'm' |
| 112 builder_name = 'b' | 299 builder_name = 'b' |
| 113 build_number = 1 | 300 build_number = 1 |
| 114 try_job_id = '1' | 301 try_job_id = '1' |
| 115 compile_result = { | 302 compile_result = { |
| 116 'result': [ | 303 'result': [ |
| 117 ['rev1', 'passed'], | 304 ['rev1', 'passed'], |
| 118 ['rev2', 'failed'] | 305 ['rev2', 'failed'] |
| 119 ], | 306 ], |
| 120 'url': 'url', | 307 'url': 'url', |
| (...skipping 30 matching lines...) Expand all Loading... |
| 151 'commit_position': '2', | 338 'commit_position': '2', |
| 152 'review_url': 'url_2' | 339 'review_url': 'url_2' |
| 153 } | 340 } |
| 154 } | 341 } |
| 155 | 342 |
| 156 self.assertEqual(expected_compile_result['culprit'], culprit) | 343 self.assertEqual(expected_compile_result['culprit'], culprit) |
| 157 | 344 |
| 158 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 345 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 159 self.assertEqual(expected_compile_result, try_job.compile_results[-1]) | 346 self.assertEqual(expected_compile_result, try_job.compile_results[-1]) |
| 160 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) | 347 self.assertEqual(wf_analysis_status.ANALYZED, try_job.status) |
| OLD | NEW |