| OLD | NEW |
| 1 # Copyright 2016 The Chromium Authors. All rights reserved. | 1 # Copyright 2016 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 import time | |
| 6 | |
| 7 from model import analysis_status | |
| 8 from model.wf_swarming_task import WfSwarmingTask | 5 from model.wf_swarming_task import WfSwarmingTask |
| 9 from waterfall import swarming_util | |
| 10 from waterfall import trigger_swarming_task_pipeline | |
| 11 from waterfall import waterfall_config | |
| 12 from waterfall.swarming_task_request import SwarmingTaskRequest | |
| 13 from waterfall.test import wf_testcase | 6 from waterfall.test import wf_testcase |
| 14 from waterfall.trigger_swarming_task_pipeline import TriggerSwarmingTaskPipeline | 7 from waterfall.trigger_swarming_task_pipeline import TriggerSwarmingTaskPipeline |
| 15 | 8 |
| 16 | 9 |
| 17 class TriggerSwarmingTaskPipelineTest(wf_testcase.WaterfallTestCase): | 10 class TriggerSwarmingTaskPipelineTest(wf_testcase.WaterfallTestCase): |
| 18 | 11 |
| 19 def testNoNewSwarmingTaskIsNeeded(self): | 12 def testGetArgs(self): |
| 20 master_name = 'm' | 13 master_name = 'm' |
| 21 builder_name = 'b' | 14 builder_name = 'b' |
| 22 build_number = 1 | 15 build_number = 123 |
| 23 step_name = 's' | 16 step_name = 's' |
| 24 tests = ['a.b'] | 17 tests = [] |
| 25 | 18 |
| 26 def MockedListSwarmingTasksDataByTags(*_): | 19 self.assertEqual( |
| 27 raise Exception('Fail.') # pragma: no cover. Should never be reached. | 20 (master_name, builder_name, build_number, step_name), |
| 28 self.mock(swarming_util, 'ListSwarmingTasksDataByTags', | 21 TriggerSwarmingTaskPipeline()._GetArgs( |
| 29 MockedListSwarmingTasksDataByTags) | 22 master_name, builder_name, build_number, step_name, tests)) |
| 30 swarming_task = WfSwarmingTask.Create( | |
| 31 master_name, builder_name, build_number, step_name) | |
| 32 swarming_task.status = analysis_status.RUNNING | |
| 33 swarming_task.task_id = 'task_id' | |
| 34 swarming_task.put() | |
| 35 | 23 |
| 36 pipeline = TriggerSwarmingTaskPipeline() | 24 def testGetSwarmingTask(self): |
| 37 task_id = pipeline.run( | |
| 38 master_name, builder_name, build_number, step_name, tests) | |
| 39 self.assertEqual('task_id', task_id) | |
| 40 | |
| 41 def testWaitingForTheTaskId(self): | |
| 42 master_name = 'm' | 25 master_name = 'm' |
| 43 builder_name = 'b' | 26 builder_name = 'b' |
| 44 build_number = 1 | 27 build_number = 123 |
| 45 step_name = 's' | 28 step_name = 's' |
| 46 tests = ['a.b'] | |
| 47 | 29 |
| 48 swarming_task = WfSwarmingTask.Create( | 30 WfSwarmingTask.Create( |
| 31 master_name, builder_name, build_number, step_name).put() |
| 32 |
| 33 task = TriggerSwarmingTaskPipeline()._GetSwarmingTask( |
| 49 master_name, builder_name, build_number, step_name) | 34 master_name, builder_name, build_number, step_name) |
| 50 swarming_task.status = analysis_status.PENDING | |
| 51 swarming_task.put() | |
| 52 | 35 |
| 53 def MockedSleep(*_): | 36 self.assertEqual(master_name, task.master_name) |
| 54 swarming_task = WfSwarmingTask.Get( | 37 self.assertEqual(builder_name, task.builder_name) |
| 55 master_name, builder_name, build_number, step_name) | 38 self.assertEqual(build_number, task.build_number) |
| 56 self.assertEqual(analysis_status.PENDING, swarming_task.status) | 39 self.assertEqual(step_name, task.step_name) |
| 57 swarming_task.status = analysis_status.RUNNING | |
| 58 swarming_task.task_id = 'task_id' | |
| 59 swarming_task.put() | |
| 60 self.mock(time, 'sleep', MockedSleep) | |
| 61 | 40 |
| 62 pipeline = TriggerSwarmingTaskPipeline() | 41 def testCreateSwarmingTask(self): |
| 63 task_id = pipeline.run( | |
| 64 master_name, builder_name, build_number, step_name, tests) | |
| 65 self.assertEqual('task_id', task_id) | |
| 66 | |
| 67 def testTriggerANewSwarmingTask(self): | |
| 68 def MockedDownloadSwarmingTaskData(*_): | |
| 69 return [{'task_id': '1'}, {'task_id': '2'}] | |
| 70 self.mock(swarming_util, 'ListSwarmingTasksDataByTags', | |
| 71 MockedDownloadSwarmingTaskData) | |
| 72 | |
| 73 def MockedGetSwarmingTaskRequest(ref_task_id, *_): | |
| 74 self.assertEqual('1', ref_task_id) | |
| 75 return SwarmingTaskRequest.Deserialize({ | |
| 76 'expiration_secs': 3600, | |
| 77 'name': 'ref_task_request', | |
| 78 'parent_task_id': 'pti', | |
| 79 'priority': 25, | |
| 80 'properties': { | |
| 81 'command': 'cmd', | |
| 82 'dimensions': [{'key': 'k', 'value': 'v'}], | |
| 83 'env': [ | |
| 84 {'key': 'a', 'value': '1'}, | |
| 85 {'key': 'GTEST_SHARD_INDEX', 'value': '1'}, | |
| 86 {'key': 'GTEST_TOTAL_SHARDS', 'value': '5'}, | |
| 87 ], | |
| 88 'execution_timeout_secs': 3600, | |
| 89 'extra_args': ['--flag=value', '--gtest_filter=d.f'], | |
| 90 'grace_period_secs': 30, | |
| 91 'idempotent': True, | |
| 92 'inputs_ref': {'a': 1}, | |
| 93 'io_timeout_secs': 1200, | |
| 94 }, | |
| 95 'tags': ['master:a', 'buildername:b', 'name:a_tests'], | |
| 96 'user': 'user', | |
| 97 }) | |
| 98 self.mock(swarming_util, 'GetSwarmingTaskRequest', | |
| 99 MockedGetSwarmingTaskRequest) | |
| 100 | |
| 101 new_request_json = {} | |
| 102 def MockedTriggerSwarmingTask(new_request, *_): | |
| 103 new_request_json.update(new_request.Serialize()) | |
| 104 return 'new_task_id' | |
| 105 self.mock(swarming_util, 'TriggerSwarmingTask', MockedTriggerSwarmingTask) | |
| 106 | |
| 107 def MockedGetSwarmingTaskName(*_): | |
| 108 return 'new_task_name' | |
| 109 self.mock(trigger_swarming_task_pipeline, '_GetSwarmingTaskName', | |
| 110 MockedGetSwarmingTaskName) | |
| 111 | |
| 112 master_name = 'm' | 42 master_name = 'm' |
| 113 builder_name = 'b' | 43 builder_name = 'b' |
| 114 build_number = 234 | 44 build_number = 123 |
| 115 step_name = 'a_tests on platform' | 45 step_name = 's' |
| 116 tests = ['a.b', 'a.c'] | |
| 117 | 46 |
| 118 expected_new_request_json = { | 47 task = TriggerSwarmingTaskPipeline()._CreateSwarmingTask( |
| 119 'expiration_secs': 3600, | 48 master_name, builder_name, build_number, step_name) |
| 120 'name': 'new_task_name', | 49 self.assertEqual(master_name, task.master_name) |
| 121 'parent_task_id': '', | 50 self.assertEqual(builder_name, task.builder_name) |
| 122 'priority': 25, | 51 self.assertEqual(build_number, task.build_number) |
| 123 'properties': { | 52 self.assertEqual(step_name, task.step_name) |
| 124 'command': 'cmd', | |
| 125 'dimensions': [{'key': 'k', 'value': 'v'}], | |
| 126 'env': [ | |
| 127 {'key': 'a', 'value': '1'}, | |
| 128 ], | |
| 129 'execution_timeout_secs': 3600, | |
| 130 'extra_args': [ | |
| 131 '--flag=value', '--gtest_repeat=10', | |
| 132 '--test-launcher-retry-limit=0', | |
| 133 '--gtest_filter=a.b:a.c'], | |
| 134 'grace_period_secs': 30, | |
| 135 'idempotent': False, | |
| 136 'inputs_ref': {'a': 1}, | |
| 137 'io_timeout_secs': 1200, | |
| 138 }, | |
| 139 'tags': ['purpose:deflake', 'ref_master:%s' % master_name, | |
| 140 'ref_buildername:%s' % builder_name, | |
| 141 'ref_buildnumber:%s' % build_number, | |
| 142 'ref_stepname:%s' % step_name, | |
| 143 'ref_task_id:1', | |
| 144 'ref_name:a_tests'], | |
| 145 'user': '', | |
| 146 } | |
| 147 | 53 |
| 148 pipeline = TriggerSwarmingTaskPipeline() | 54 def testGetIterationsToRerun(self): |
| 149 new_task_id = pipeline.run( | 55 expected_iterations = 50 |
| 150 master_name, builder_name, build_number, step_name, tests) | 56 self.UpdateUnitTestConfigSettings( |
| 151 self.assertEqual('new_task_id', new_task_id) | 57 config_property='swarming_settings', |
| 152 self.assertEqual(expected_new_request_json, new_request_json) | 58 override_data={'iterations_to_rerun': expected_iterations}) |
| 59 self.assertEqual( |
| 60 expected_iterations, |
| 61 TriggerSwarmingTaskPipeline()._GetIterationsToRerun()) |
| 153 | 62 |
| 154 swarming_task = WfSwarmingTask.Get( | 63 |
| 155 master_name, builder_name, build_number, step_name) | 64 |
| 156 self.assertIsNotNone(swarming_task) | |
| 157 self.assertEqual('new_task_id', swarming_task.task_id) | |
| 158 self.assertEqual(tests, swarming_task.parameters['tests']) | |
| 159 self.assertEqual( | |
| 160 waterfall_config.GetSwarmingSettings()['iterations_to_rerun'], | |
| 161 swarming_task.parameters['iterations_to_rerun']) | |
| OLD | NEW |