| 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 |
| 6 from datetime import timedelta |
| 7 |
| 5 from common.waterfall import failure_type | 8 from common.waterfall import failure_type |
| 6 from model import analysis_status | 9 from model import analysis_status |
| 10 from model.wf_build import WfBuild |
| 7 from model.wf_try_job import WfTryJob | 11 from model.wf_try_job import WfTryJob |
| 8 from waterfall import try_job_util | 12 from waterfall import try_job_util |
| 9 from waterfall.test import wf_testcase | 13 from waterfall.test import wf_testcase |
| 10 from waterfall.try_job_type import TryJobType | 14 from waterfall.try_job_type import TryJobType |
| 11 | 15 |
| 12 | 16 |
| 13 class _MockRootPipeline(object): | 17 class _MockRootPipeline(object): |
| 14 STARTED = False | 18 STARTED = False |
| 15 | 19 |
| 16 def __init__(self, *_): | 20 def __init__(self, *_): |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 'chromium_revision': '223-3' | 63 'chromium_revision': '223-3' |
| 60 } | 64 } |
| 61 } | 65 } |
| 62 } | 66 } |
| 63 | 67 |
| 64 self.mock( | 68 self.mock( |
| 65 try_job_util.swarming_tasks_to_try_job_pipeline, | 69 try_job_util.swarming_tasks_to_try_job_pipeline, |
| 66 'SwarmingTasksToTryJobPipeline', _MockRootPipeline) | 70 'SwarmingTasksToTryJobPipeline', _MockRootPipeline) |
| 67 _MockRootPipeline.STARTED = False | 71 _MockRootPipeline.STARTED = False |
| 68 | 72 |
| 73 def _MockShouldBailOutForOutdatedBuild(*_): |
| 74 return False |
| 75 self.mock( |
| 76 try_job_util, '_ShouldBailOutForOutdatedBuild', |
| 77 _MockShouldBailOutForOutdatedBuild) |
| 78 |
| 69 failure_result_map = try_job_util.ScheduleTryJobIfNeeded( | 79 failure_result_map = try_job_util.ScheduleTryJobIfNeeded( |
| 70 failure_info, None, None) | 80 failure_info, None, None) |
| 71 | 81 |
| 72 self.assertFalse(_MockRootPipeline.STARTED) | 82 self.assertFalse(_MockRootPipeline.STARTED) |
| 73 self.assertEqual({}, failure_result_map) | 83 self.assertEqual({}, failure_result_map) |
| 74 | 84 |
| 75 def testBailOutForTestTryJob(self): | 85 def testBailOutForTestTryJob(self): |
| 76 master_name = 'master2' | 86 master_name = 'master2' |
| 77 builder_name = 'builder2' | 87 builder_name = 'builder2' |
| 78 build_number = 223 | 88 build_number = 223 |
| 79 failure_info = { | 89 failure_info = { |
| 80 'master_name': master_name, | 90 'master_name': master_name, |
| 81 'builder_name': builder_name, | 91 'builder_name': builder_name, |
| 82 'build_number': build_number, | 92 'build_number': build_number, |
| 83 'failed_steps': { | 93 'failed_steps': { |
| 84 'a_test': {} | 94 'a_test': {} |
| 85 }, | 95 }, |
| 86 'failure_type': failure_type.TEST | 96 'failure_type': failure_type.TEST |
| 87 } | 97 } |
| 88 | 98 |
| 99 def _MockShouldBailOutForOutdatedBuild(*_): |
| 100 return False |
| 101 self.mock( |
| 102 try_job_util, '_ShouldBailOutForOutdatedBuild', |
| 103 _MockShouldBailOutForOutdatedBuild) |
| 104 |
| 89 failure_result_map = try_job_util.ScheduleTryJobIfNeeded( | 105 failure_result_map = try_job_util.ScheduleTryJobIfNeeded( |
| 90 failure_info, None, None) | 106 failure_info, None, None) |
| 91 | 107 |
| 92 self.assertEqual({}, failure_result_map) | 108 self.assertEqual({}, failure_result_map) |
| 93 | 109 |
| 110 def testBailOutForTryJobWithOutdatedTimestamp(self): |
| 111 master_name = 'master3' |
| 112 builder_name = 'builder3' |
| 113 build_number = 223 |
| 114 failure_info = { |
| 115 'master_name': master_name, |
| 116 'builder_name': builder_name, |
| 117 'build_number': build_number, |
| 118 'failed_steps': { |
| 119 'compile': { |
| 120 'current_failure': 221, |
| 121 'first_failure': 221, |
| 122 'last_pass': 220 |
| 123 } |
| 124 }, |
| 125 } |
| 126 |
| 127 self.mock( |
| 128 try_job_util.swarming_tasks_to_try_job_pipeline, |
| 129 'SwarmingTasksToTryJobPipeline', _MockRootPipeline) |
| 130 _MockRootPipeline.STARTED = False |
| 131 |
| 132 def _MockShouldBailOutForOutdatedBuild(*_): |
| 133 return True |
| 134 self.mock( |
| 135 try_job_util, '_ShouldBailOutForOutdatedBuild', |
| 136 _MockShouldBailOutForOutdatedBuild) |
| 137 |
| 138 failure_result_map = try_job_util.ScheduleTryJobIfNeeded( |
| 139 failure_info, None, None) |
| 140 |
| 141 self.assertFalse(_MockRootPipeline.STARTED) |
| 142 self.assertEqual({}, failure_result_map) |
| 143 |
| 94 def testNotNeedANewTryJobIfNotFirstTimeFailure(self): | 144 def testNotNeedANewTryJobIfNotFirstTimeFailure(self): |
| 95 master_name = 'm' | 145 master_name = 'm' |
| 96 builder_name = 'b' | 146 builder_name = 'b' |
| 97 build_number = 223 | 147 build_number = 223 |
| 98 failure_info = { | 148 failure_info = { |
| 99 'master_name': master_name, | 149 'master_name': master_name, |
| 100 'builder_name': builder_name, | 150 'builder_name': builder_name, |
| 101 'build_number': build_number, | 151 'build_number': build_number, |
| 102 'failed_steps': { | 152 'failed_steps': { |
| 103 'compile': { | 153 'compile': { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 125 } | 175 } |
| 126 }, | 176 }, |
| 127 'failure_type': failure_type.COMPILE | 177 'failure_type': failure_type.COMPILE |
| 128 } | 178 } |
| 129 | 179 |
| 130 self.mock( | 180 self.mock( |
| 131 try_job_util.swarming_tasks_to_try_job_pipeline, | 181 try_job_util.swarming_tasks_to_try_job_pipeline, |
| 132 'SwarmingTasksToTryJobPipeline', _MockRootPipeline) | 182 'SwarmingTasksToTryJobPipeline', _MockRootPipeline) |
| 133 _MockRootPipeline.STARTED = False | 183 _MockRootPipeline.STARTED = False |
| 134 | 184 |
| 185 def _MockShouldBailOutForOutdatedBuild(*_): |
| 186 return False |
| 187 self.mock( |
| 188 try_job_util, '_ShouldBailOutForOutdatedBuild', |
| 189 _MockShouldBailOutForOutdatedBuild) |
| 190 |
| 135 try_job_util.ScheduleTryJobIfNeeded(failure_info, None, None) | 191 try_job_util.ScheduleTryJobIfNeeded(failure_info, None, None) |
| 136 | 192 |
| 137 self.assertFalse(_MockRootPipeline.STARTED) | 193 self.assertFalse(_MockRootPipeline.STARTED) |
| 138 | 194 |
| 139 def testNotNeedANewTryJobIfOneWithResultExists(self): | 195 def testNotNeedANewTryJobIfOneWithResultExists(self): |
| 140 master_name = 'm' | 196 master_name = 'm' |
| 141 builder_name = 'b' | 197 builder_name = 'b' |
| 142 build_number = 223 | 198 build_number = 223 |
| 143 failed_steps = { | 199 failed_steps = { |
| 144 'compile': { | 200 'compile': { |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 } | 416 } |
| 361 }, | 417 }, |
| 362 'failure_type': failure_type.COMPILE | 418 'failure_type': failure_type.COMPILE |
| 363 } | 419 } |
| 364 | 420 |
| 365 self.mock( | 421 self.mock( |
| 366 try_job_util.swarming_tasks_to_try_job_pipeline, | 422 try_job_util.swarming_tasks_to_try_job_pipeline, |
| 367 'SwarmingTasksToTryJobPipeline', _MockRootPipeline) | 423 'SwarmingTasksToTryJobPipeline', _MockRootPipeline) |
| 368 _MockRootPipeline.STARTED = False | 424 _MockRootPipeline.STARTED = False |
| 369 | 425 |
| 426 def _MockShouldBailOutForOutdatedBuild(*_): |
| 427 return False |
| 428 self.mock( |
| 429 try_job_util, '_ShouldBailOutForOutdatedBuild', |
| 430 _MockShouldBailOutForOutdatedBuild) |
| 431 |
| 370 try_job_util.ScheduleTryJobIfNeeded(failure_info, None, None) | 432 try_job_util.ScheduleTryJobIfNeeded(failure_info, None, None) |
| 371 | 433 |
| 372 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 434 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 373 | 435 |
| 374 self.assertTrue(_MockRootPipeline.STARTED) | 436 self.assertTrue(_MockRootPipeline.STARTED) |
| 375 self.assertIsNotNone(try_job) | 437 self.assertIsNotNone(try_job) |
| 376 | 438 |
| 377 def testUseFailedOutputNodesFromSignals(self): | 439 def testUseFailedOutputNodesFromSignals(self): |
| 378 signals = { | 440 signals = { |
| 379 'compile': { | 441 'compile': { |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 'revision': 'r3', | 530 'revision': 'r3', |
| 469 }, | 531 }, |
| 470 ], | 532 ], |
| 471 }, | 533 }, |
| 472 ] | 534 ] |
| 473 } | 535 } |
| 474 expected_suspected_revisions = ['r1', 'r2', 'r3'] | 536 expected_suspected_revisions = ['r1', 'r2', 'r3'] |
| 475 self.assertEqual( | 537 self.assertEqual( |
| 476 expected_suspected_revisions, | 538 expected_suspected_revisions, |
| 477 try_job_util._GetSuspectsFromHeuristicResult(heuristic_result)) | 539 try_job_util._GetSuspectsFromHeuristicResult(heuristic_result)) |
| 540 |
| 541 def testShouldBailOutforOutdatedBuild(self): |
| 542 yesterday = datetime.utcnow() - timedelta(days=1) |
| 543 build = WfBuild.Create('m', 'b', 1) |
| 544 build.start_time = yesterday |
| 545 self.assertTrue(try_job_util._ShouldBailOutForOutdatedBuild(build)) |
| 546 |
| 547 build.start_time = yesterday + timedelta(hours=1) |
| 548 self.assertFalse(try_job_util._ShouldBailOutForOutdatedBuild(build)) |
| OLD | NEW |