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