| 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 | |
| 6 | |
| 7 from model import wf_analysis_status | 5 from model import wf_analysis_status |
| 8 from model.wf_analysis import WfAnalysis | |
| 9 from model.wf_try_job import WfTryJob | 6 from model.wf_try_job import WfTryJob |
| 10 from waterfall import try_job_util | 7 from waterfall import try_job_util |
| 11 from waterfall import waterfall_config | 8 from waterfall.test import wf_testcase |
| 12 from waterfall.try_job_type import TryJobType | 9 from waterfall.try_job_type import TryJobType |
| 13 | 10 |
| 14 | 11 |
| 15 class _MockRootPipeline(object): | 12 class _MockRootPipeline(object): |
| 16 STARTED = False | 13 STARTED = False |
| 17 | 14 |
| 18 def __init__(self, *_): | 15 def __init__(self, *_): |
| 19 pass | 16 pass |
| 20 | 17 |
| 21 def start(self, *_, **__): | 18 def start(self, *_, **__): |
| 22 _MockRootPipeline.STARTED = True | 19 _MockRootPipeline.STARTED = True |
| 23 | 20 |
| 24 @property | 21 @property |
| 25 def pipeline_status_path(self): | 22 def pipeline_status_path(self): |
| 26 return 'path' | 23 return 'path' |
| 27 | 24 |
| 28 | 25 |
| 29 class TryJobUtilTest(testing.AppengineTestCase): | 26 class TryJobUtilTest(wf_testcase.WaterfallTestCase): |
| 30 | 27 |
| 31 def setUp(self): | 28 def setUp(self): |
| 32 super(TryJobUtilTest, self).setUp() | 29 super(TryJobUtilTest, self).setUp() |
| 33 | 30 |
| 34 def Mocked_GetTrybotForWaterfallBuilder(*_): | |
| 35 return 'tryserver.master', 'tryserver.builder' | |
| 36 self.mock(waterfall_config, 'GetTrybotForWaterfallBuilder', | |
| 37 Mocked_GetTrybotForWaterfallBuilder) | |
| 38 | |
| 39 def testNotNeedANewTryJobIfBuildIsNotCompletedYet(self): | 31 def testNotNeedANewTryJobIfBuildIsNotCompletedYet(self): |
| 40 self.mock( | 32 self.mock( |
| 41 try_job_util.swarming_tasks_to_try_job_pipeline, | 33 try_job_util.swarming_tasks_to_try_job_pipeline, |
| 42 'SwarmingTasksToTryJobPipeline', _MockRootPipeline) | 34 'SwarmingTasksToTryJobPipeline', _MockRootPipeline) |
| 43 _MockRootPipeline.STARTED = False | 35 _MockRootPipeline.STARTED = False |
| 44 | 36 |
| 45 failure_result_map = try_job_util.ScheduleTryJobIfNeeded( | 37 failure_result_map = try_job_util.ScheduleTryJobIfNeeded( |
| 46 {}, build_completed=False) | 38 {}, build_completed=False) |
| 47 | 39 |
| 48 self.assertFalse(_MockRootPipeline.STARTED) | 40 self.assertFalse(_MockRootPipeline.STARTED) |
| 49 self.assertEqual({}, failure_result_map) | 41 self.assertEqual({}, failure_result_map) |
| 50 | 42 |
| 51 def testNotNeedANewTryJobIfBuilderIsNotSupportedYet(self): | 43 def testNotNeedANewTryJobIfBuilderIsNotSupportedYet(self): |
| 52 def Mocked_GetTrybotForWaterfallBuilder(*_): | 44 master_name = 'master2' |
| 53 return None, None | 45 builder_name = 'builder2' |
| 54 self.mock(waterfall_config, 'GetTrybotForWaterfallBuilder', | |
| 55 Mocked_GetTrybotForWaterfallBuilder) | |
| 56 | |
| 57 master_name = 'm' | |
| 58 builder_name = 'b' | |
| 59 build_number = 223 | 46 build_number = 223 |
| 60 failure_info = { | 47 failure_info = { |
| 61 'master_name': master_name, | 48 'master_name': master_name, |
| 62 'builder_name': builder_name, | 49 'builder_name': builder_name, |
| 63 'build_number': build_number, | 50 'build_number': build_number, |
| 64 'failed_steps': { | 51 'failed_steps': { |
| 65 'compile': { | 52 'compile': { |
| 66 'current_failure': 221, | 53 'current_failure': 221, |
| 67 'first_failure': 221, | 54 'first_failure': 221, |
| 68 'last_pass': 220 | 55 'last_pass': 220 |
| (...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 394 {'target': 'a.exe'}, | 381 {'target': 'a.exe'}, |
| 395 {'source': 'b.cc', | 382 {'source': 'b.cc', |
| 396 'target': 'b.o'}] | 383 'target': 'b.o'}] |
| 397 } | 384 } |
| 398 } | 385 } |
| 399 | 386 |
| 400 self.assertEqual( | 387 self.assertEqual( |
| 401 try_job_util._GetFailedTargetsFromSignals(signals, 'm', 'b'), ['a.exe']) | 388 try_job_util._GetFailedTargetsFromSignals(signals, 'm', 'b'), ['a.exe']) |
| 402 | 389 |
| 403 def testUseObjectFilesAsFailedTargetIfStrictRegexUsed(self): | 390 def testUseObjectFilesAsFailedTargetIfStrictRegexUsed(self): |
| 404 def Mocked_EnableStrictRegexForCompileLinkFailures(*_): | |
| 405 return True | |
| 406 self.mock(waterfall_config, 'EnableStrictRegexForCompileLinkFailures', | |
| 407 Mocked_EnableStrictRegexForCompileLinkFailures) | |
| 408 | |
| 409 signals = { | 391 signals = { |
| 410 'compile': { | 392 'compile': { |
| 411 'failed_targets': [ | 393 'failed_targets': [ |
| 412 {'source': 'b.cc', 'target': 'b.o'}, | 394 {'source': 'b.cc', 'target': 'b.o'}, |
| 413 ] | 395 ] |
| 414 } | 396 } |
| 415 } | 397 } |
| 416 | 398 |
| 417 self.assertEqual( | 399 self.assertEqual( |
| 418 try_job_util._GetFailedTargetsFromSignals(signals, 'm', 'b'), ['b.o']) | 400 try_job_util._GetFailedTargetsFromSignals( |
| 401 signals, 'master1', 'builder1'), |
| 402 ['b.o']) |
| OLD | NEW |