Chromium Code Reviews| 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 build = WfBuild.Create(master_name, builder_name, build_number) | |
| 74 build.start_time = datetime.utcnow() | |
|
stgao
2016/05/21 04:26:41
This might make the test flaky as it depends on th
| |
| 75 build.put() | |
| 76 | |
| 69 failure_result_map = try_job_util.ScheduleTryJobIfNeeded( | 77 failure_result_map = try_job_util.ScheduleTryJobIfNeeded( |
| 70 failure_info, None, None) | 78 failure_info, None, None) |
| 71 | 79 |
| 72 self.assertFalse(_MockRootPipeline.STARTED) | 80 self.assertFalse(_MockRootPipeline.STARTED) |
| 73 self.assertEqual({}, failure_result_map) | 81 self.assertEqual({}, failure_result_map) |
| 74 | 82 |
| 75 def testBailOutForTestTryJob(self): | 83 def testBailOutForTestTryJob(self): |
| 76 master_name = 'master2' | 84 master_name = 'master2' |
| 77 builder_name = 'builder2' | 85 builder_name = 'builder2' |
| 78 build_number = 223 | 86 build_number = 223 |
| 79 failure_info = { | 87 failure_info = { |
| 80 'master_name': master_name, | 88 'master_name': master_name, |
| 81 'builder_name': builder_name, | 89 'builder_name': builder_name, |
| 82 'build_number': build_number, | 90 'build_number': build_number, |
| 83 'failed_steps': { | 91 'failed_steps': { |
| 84 'a_test': {} | 92 'a_test': {} |
| 85 }, | 93 }, |
| 86 'failure_type': failure_type.TEST | 94 'failure_type': failure_type.TEST |
| 87 } | 95 } |
| 88 | 96 |
| 97 build = WfBuild.Create(master_name, builder_name, build_number) | |
| 98 build.start_time = datetime.utcnow() | |
| 99 build.put() | |
| 100 | |
| 89 failure_result_map = try_job_util.ScheduleTryJobIfNeeded( | 101 failure_result_map = try_job_util.ScheduleTryJobIfNeeded( |
| 90 failure_info, None, None) | 102 failure_info, None, None) |
| 91 | 103 |
| 92 self.assertEqual({}, failure_result_map) | 104 self.assertEqual({}, failure_result_map) |
| 93 | 105 |
| 106 def testBailOutForTryJobWithOutdatedTimestamp(self): | |
| 107 master_name = 'master3' | |
| 108 builder_name = 'builder3' | |
| 109 build_number = 223 | |
| 110 failure_info = { | |
| 111 'master_name': master_name, | |
| 112 'builder_name': builder_name, | |
| 113 'build_number': build_number, | |
| 114 'failed_steps': { | |
| 115 'compile': { | |
| 116 'current_failure': 221, | |
| 117 'first_failure': 221, | |
| 118 'last_pass': 220 | |
| 119 } | |
| 120 }, | |
| 121 } | |
| 122 | |
| 123 self.mock( | |
| 124 try_job_util.swarming_tasks_to_try_job_pipeline, | |
| 125 'SwarmingTasksToTryJobPipeline', _MockRootPipeline) | |
| 126 _MockRootPipeline.STARTED = False | |
| 127 | |
| 128 yesterday = datetime.utcnow() - timedelta(days=1) | |
| 129 build = WfBuild.Create(master_name, builder_name, build_number) | |
| 130 build.start_time = yesterday | |
| 131 build.put() | |
| 132 | |
| 133 failure_result_map = try_job_util.ScheduleTryJobIfNeeded( | |
| 134 failure_info, None, None) | |
| 135 | |
| 136 self.assertFalse(_MockRootPipeline.STARTED) | |
| 137 self.assertEqual({}, failure_result_map) | |
| 138 | |
| 94 def testNotNeedANewTryJobIfNotFirstTimeFailure(self): | 139 def testNotNeedANewTryJobIfNotFirstTimeFailure(self): |
| 95 master_name = 'm' | 140 master_name = 'm' |
| 96 builder_name = 'b' | 141 builder_name = 'b' |
| 97 build_number = 223 | 142 build_number = 223 |
| 98 failure_info = { | 143 failure_info = { |
| 99 'master_name': master_name, | 144 'master_name': master_name, |
| 100 'builder_name': builder_name, | 145 'builder_name': builder_name, |
| 101 'build_number': build_number, | 146 'build_number': build_number, |
| 102 'failed_steps': { | 147 'failed_steps': { |
| 103 'compile': { | 148 'compile': { |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 125 } | 170 } |
| 126 }, | 171 }, |
| 127 'failure_type': failure_type.COMPILE | 172 'failure_type': failure_type.COMPILE |
| 128 } | 173 } |
| 129 | 174 |
| 130 self.mock( | 175 self.mock( |
| 131 try_job_util.swarming_tasks_to_try_job_pipeline, | 176 try_job_util.swarming_tasks_to_try_job_pipeline, |
| 132 'SwarmingTasksToTryJobPipeline', _MockRootPipeline) | 177 'SwarmingTasksToTryJobPipeline', _MockRootPipeline) |
| 133 _MockRootPipeline.STARTED = False | 178 _MockRootPipeline.STARTED = False |
| 134 | 179 |
| 180 build = WfBuild.Create(master_name, builder_name, build_number) | |
| 181 build.start_time = datetime.utcnow() | |
| 182 build.put() | |
| 183 | |
| 135 try_job_util.ScheduleTryJobIfNeeded(failure_info, None, None) | 184 try_job_util.ScheduleTryJobIfNeeded(failure_info, None, None) |
| 136 | 185 |
| 137 self.assertFalse(_MockRootPipeline.STARTED) | 186 self.assertFalse(_MockRootPipeline.STARTED) |
| 138 | 187 |
| 139 def testNotNeedANewTryJobIfOneWithResultExists(self): | 188 def testNotNeedANewTryJobIfOneWithResultExists(self): |
| 140 master_name = 'm' | 189 master_name = 'm' |
| 141 builder_name = 'b' | 190 builder_name = 'b' |
| 142 build_number = 223 | 191 build_number = 223 |
| 143 failed_steps = { | 192 failed_steps = { |
| 144 'compile': { | 193 'compile': { |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 360 } | 409 } |
| 361 }, | 410 }, |
| 362 'failure_type': failure_type.COMPILE | 411 'failure_type': failure_type.COMPILE |
| 363 } | 412 } |
| 364 | 413 |
| 365 self.mock( | 414 self.mock( |
| 366 try_job_util.swarming_tasks_to_try_job_pipeline, | 415 try_job_util.swarming_tasks_to_try_job_pipeline, |
| 367 'SwarmingTasksToTryJobPipeline', _MockRootPipeline) | 416 'SwarmingTasksToTryJobPipeline', _MockRootPipeline) |
| 368 _MockRootPipeline.STARTED = False | 417 _MockRootPipeline.STARTED = False |
| 369 | 418 |
| 419 build = WfBuild.Create(master_name, builder_name, build_number) | |
| 420 build.start_time = datetime.utcnow() | |
| 421 build.put() | |
| 422 | |
| 370 try_job_util.ScheduleTryJobIfNeeded(failure_info, None, None) | 423 try_job_util.ScheduleTryJobIfNeeded(failure_info, None, None) |
| 371 | 424 |
| 372 try_job = WfTryJob.Get(master_name, builder_name, build_number) | 425 try_job = WfTryJob.Get(master_name, builder_name, build_number) |
| 373 | 426 |
| 374 self.assertTrue(_MockRootPipeline.STARTED) | 427 self.assertTrue(_MockRootPipeline.STARTED) |
| 375 self.assertIsNotNone(try_job) | 428 self.assertIsNotNone(try_job) |
| 376 | 429 |
| 377 def testUseFailedOutputNodesFromSignals(self): | 430 def testUseFailedOutputNodesFromSignals(self): |
| 378 signals = { | 431 signals = { |
| 379 'compile': { | 432 'compile': { |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 468 'revision': 'r3', | 521 'revision': 'r3', |
| 469 }, | 522 }, |
| 470 ], | 523 ], |
| 471 }, | 524 }, |
| 472 ] | 525 ] |
| 473 } | 526 } |
| 474 expected_suspected_revisions = ['r1', 'r2', 'r3'] | 527 expected_suspected_revisions = ['r1', 'r2', 'r3'] |
| 475 self.assertEqual( | 528 self.assertEqual( |
| 476 expected_suspected_revisions, | 529 expected_suspected_revisions, |
| 477 try_job_util._GetSuspectsFromHeuristicResult(heuristic_result)) | 530 try_job_util._GetSuspectsFromHeuristicResult(heuristic_result)) |
| OLD | NEW |