| 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 |
| 9 from model import analysis_approach_type |
| 8 from model import analysis_status | 10 from model import analysis_status |
| 9 from model import result_status | 11 from model import result_status |
| 10 from model.wf_analysis import WfAnalysis | 12 from model.wf_analysis import WfAnalysis |
| 13 from model.wf_suspected_cl import WfSuspectedCL |
| 11 from waterfall import build_failure_analysis | 14 from waterfall import build_failure_analysis |
| 12 from waterfall import identify_culprit_pipeline | 15 from waterfall import identify_culprit_pipeline |
| 13 | 16 |
| 14 | 17 |
| 15 class IdentifyCulpritPipelineTest(testing.AppengineTestCase): | 18 class IdentifyCulpritPipelineTest(testing.AppengineTestCase): |
| 16 app_module = pipeline_handlers._APP | 19 app_module = pipeline_handlers._APP |
| 17 | 20 |
| 18 def testGetSuspectedCLs(self): | 21 def testGetSuspectedCLs(self): |
| 19 dummy_result = { | 22 dummy_result = { |
| 20 'failures': [ | 23 'failures': [ |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 } | 197 } |
| 195 | 198 |
| 196 self.assertEqual(result_status.NOT_FOUND_UNTRIAGED, | 199 self.assertEqual(result_status.NOT_FOUND_UNTRIAGED, |
| 197 identify_culprit_pipeline._GetResultAnalysisStatus( | 200 identify_culprit_pipeline._GetResultAnalysisStatus( |
| 198 dummy_result)) | 201 dummy_result)) |
| 199 | 202 |
| 200 def testIdentifyCulpritPipeline(self): | 203 def testIdentifyCulpritPipeline(self): |
| 201 master_name = 'm' | 204 master_name = 'm' |
| 202 builder_name = 'b' | 205 builder_name = 'b' |
| 203 build_number = 123 | 206 build_number = 123 |
| 207 repo_name = 'chromium' |
| 208 revision = 'r99_1' |
| 204 | 209 |
| 205 analysis = WfAnalysis.Create(master_name, builder_name, build_number) | 210 analysis = WfAnalysis.Create(master_name, builder_name, build_number) |
| 206 analysis.result = None | 211 analysis.result = None |
| 207 analysis.status = analysis_status.RUNNING | 212 analysis.status = analysis_status.RUNNING |
| 208 analysis.put() | 213 analysis.put() |
| 209 | 214 |
| 210 failure_info = { | 215 failure_info = { |
| 211 'master_name': master_name, | 216 'master_name': master_name, |
| 212 'builder_name': builder_name, | 217 'builder_name': builder_name, |
| 213 'build_number': build_number, | 218 'build_number': build_number, |
| 219 'failure_type': failure_type.TEST |
| 214 } | 220 } |
| 215 change_logs = {} | 221 change_logs = {} |
| 216 deps_info = {} | 222 deps_info = {} |
| 217 signals = {} | 223 signals = {} |
| 218 | 224 |
| 219 dummy_result = {'failures': []} | 225 dummy_result = { |
| 226 'failures': [ |
| 227 { |
| 228 'step_name': 'a', |
| 229 'first_failure': 98, |
| 230 'last_pass': None, |
| 231 'suspected_cls': [ |
| 232 { |
| 233 'build_number': 99, |
| 234 'repo_name': repo_name, |
| 235 'revision': revision, |
| 236 'commit_position': None, |
| 237 'url': None, |
| 238 'score': 1, |
| 239 'hints': { |
| 240 'modified f99_2.cc (and it was in log)': 1, |
| 241 }, |
| 242 } |
| 243 ], |
| 244 } |
| 245 ] |
| 246 } |
| 220 | 247 |
| 221 def MockAnalyzeBuildFailure(*_): | 248 def MockAnalyzeBuildFailure(*_): |
| 222 return dummy_result | 249 return dummy_result |
| 223 | 250 |
| 224 self.mock(build_failure_analysis, | 251 self.mock(build_failure_analysis, |
| 225 'AnalyzeBuildFailure', MockAnalyzeBuildFailure) | 252 'AnalyzeBuildFailure', MockAnalyzeBuildFailure) |
| 226 | 253 |
| 227 pipeline = identify_culprit_pipeline.IdentifyCulpritPipeline( | 254 pipeline = identify_culprit_pipeline.IdentifyCulpritPipeline( |
| 228 failure_info, change_logs, deps_info, signals, True) | 255 failure_info, change_logs, deps_info, signals, True) |
| 229 pipeline.start() | 256 pipeline.start() |
| 230 self.execute_queued_tasks() | 257 self.execute_queued_tasks() |
| 231 | 258 |
| 232 expected_suspected_cls = [] | 259 expected_suspected_cls = [ |
| 260 { |
| 261 'repo_name': repo_name, |
| 262 'revision': revision, |
| 263 'commit_position': None, |
| 264 'url': None |
| 265 } |
| 266 ] |
| 233 | 267 |
| 234 analysis = WfAnalysis.Get(master_name, builder_name, build_number) | 268 analysis = WfAnalysis.Get(master_name, builder_name, build_number) |
| 235 self.assertTrue(analysis.build_completed) | 269 self.assertTrue(analysis.build_completed) |
| 236 self.assertIsNotNone(analysis) | 270 self.assertIsNotNone(analysis) |
| 237 self.assertEqual(dummy_result, analysis.result) | 271 self.assertEqual(dummy_result, analysis.result) |
| 238 self.assertEqual(analysis_status.COMPLETED, analysis.status) | 272 self.assertEqual(analysis_status.COMPLETED, analysis.status) |
| 239 self.assertIsNone(analysis.result_status) | 273 self.assertIsNotNone(analysis.result_status) |
| 240 self.assertEqual(expected_suspected_cls, analysis.suspected_cls) | 274 self.assertEqual(expected_suspected_cls, analysis.suspected_cls) |
| 275 |
| 276 suspected_cl = WfSuspectedCL.Get(repo_name, revision) |
| 277 self.assertIsNotNone(suspected_cl) |
| 278 self.assertEqual( |
| 279 [[master_name, builder_name, build_number]], suspected_cl.builds) |
| 280 |
| 281 def testCreateWfSuspectedCL(self): |
| 282 build_info = ['m', 'b', 123] |
| 283 compile_failure_type = failure_type.COMPILE |
| 284 repo_name = 'chromium' |
| 285 revision = 'r1' |
| 286 commit_position = 1 |
| 287 |
| 288 self.assertIsNone(WfSuspectedCL.Get(repo_name, revision)) |
| 289 |
| 290 identify_culprit_pipeline._SaveSuspectedCL( |
| 291 build_info, compile_failure_type, repo_name, revision, commit_position) |
| 292 |
| 293 suspected_cl = WfSuspectedCL.Get(repo_name, revision) |
| 294 |
| 295 self.assertIsNotNone(suspected_cl) |
| 296 self.assertEqual(analysis_approach_type.HEURISTIC, suspected_cl.approach) |
| 297 self.assertEqual(compile_failure_type, suspected_cl.failure_type) |
| 298 self.assertEqual([build_info], suspected_cl.builds) |
| 299 |
| 300 def testUpdateWfSuspectedCL(self): |
| 301 build_info = ['m', 'b', 122] |
| 302 test_failure_type = failure_type.TEST |
| 303 repo_name = 'chromium' |
| 304 revision = 'r2' |
| 305 commit_position = 2 |
| 306 |
| 307 suspected_cl = WfSuspectedCL.Create(repo_name, revision, commit_position) |
| 308 suspected_cl.approach = analysis_approach_type.TRY_JOB |
| 309 suspected_cl.builds.append(['m', 'b1', 100]) |
| 310 suspected_cl.failure_type = test_failure_type |
| 311 suspected_cl.put() |
| 312 |
| 313 identify_culprit_pipeline._SaveSuspectedCL( |
| 314 build_info, test_failure_type, repo_name, revision, commit_position) |
| 315 |
| 316 suspected_cl = WfSuspectedCL.Get(repo_name, revision) |
| 317 |
| 318 self.assertIsNotNone(suspected_cl) |
| 319 self.assertEqual(analysis_approach_type.BOTH, suspected_cl.approach) |
| 320 self.assertEqual(test_failure_type, suspected_cl.failure_type) |
| 321 self.assertEqual([['m', 'b1', 100], build_info], suspected_cl.builds) |
| 322 |
| 323 def testUpdateWfSuspectedCLAddanotherHeuristic(self): |
| 324 build_info = ['m', 'b', 122] |
| 325 test_failure_type = failure_type.TEST |
| 326 repo_name = 'chromium' |
| 327 revision = 'r2' |
| 328 commit_position = 2 |
| 329 |
| 330 suspected_cl = WfSuspectedCL.Create(repo_name, revision, commit_position) |
| 331 suspected_cl.approach = analysis_approach_type.HEURISTIC |
| 332 suspected_cl.put() |
| 333 |
| 334 identify_culprit_pipeline._SaveSuspectedCL( |
| 335 build_info, test_failure_type, repo_name, revision, commit_position) |
| 336 |
| 337 suspected_cl = WfSuspectedCL.Get(repo_name, revision) |
| 338 |
| 339 self.assertEqual(analysis_approach_type.HEURISTIC, suspected_cl.approach) |
| 340 |
| 341 def testUpdateWfSuspectedCLRerun(self): |
| 342 build_info = ['m', 'b', 122] |
| 343 test_failure_type = failure_type.TEST |
| 344 repo_name = 'chromium' |
| 345 revision = 'r2' |
| 346 commit_position = 2 |
| 347 |
| 348 suspected_cl = WfSuspectedCL.Create(repo_name, revision, commit_position) |
| 349 suspected_cl.builds = [build_info] |
| 350 suspected_cl.put() |
| 351 |
| 352 identify_culprit_pipeline._SaveSuspectedCL( |
| 353 build_info, test_failure_type, repo_name, revision, commit_position) |
| 354 |
| 355 suspected_cl = WfSuspectedCL.Get(repo_name, revision) |
| 356 |
| 357 self.assertEqual([build_info], suspected_cl.builds) |
| 358 |
| 359 def testGetResultAnalysisStatusNone(self): |
| 360 self.assertIsNone(identify_culprit_pipeline._GetResultAnalysisStatus([])) |
| 361 |
| 362 def testGetSuspectedCLsEmpty(self): |
| 363 self.assertEqual([], identify_culprit_pipeline._GetSuspectedCLs([])) |
| OLD | NEW |