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