OLD | NEW |
1 # Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2013 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 """Implements test sharding logic.""" | 5 """Implements test sharding logic.""" |
6 | 6 |
7 import logging | 7 import logging |
8 import threading | 8 import threading |
9 | 9 |
10 from pylib import android_commands | 10 from pylib import android_commands |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 msg = 'Device %s is unresponsive.' % runner.device | 136 msg = 'Device %s is unresponsive.' % runner.device |
137 logging.warning(msg) | 137 logging.warning(msg) |
138 raise android_commands.errors.DeviceUnresponsiveError(msg) | 138 raise android_commands.errors.DeviceUnresponsiveError(msg) |
139 result, retry = runner.RunTest(test.test) | 139 result, retry = runner.RunTest(test.test) |
140 test.tries += 1 | 140 test.tries += 1 |
141 if retry and test.tries <= 3: | 141 if retry and test.tries <= 3: |
142 # Retry non-passing results, only record passing results. | 142 # Retry non-passing results, only record passing results. |
143 pass_results = base_test_result.TestRunResults() | 143 pass_results = base_test_result.TestRunResults() |
144 pass_results.AddResults(result.GetPass()) | 144 pass_results.AddResults(result.GetPass()) |
145 out_results.append(pass_results) | 145 out_results.append(pass_results) |
146 logging.warning('****Will retry test, try #%s.' % test.tries) | 146 logging.warning('Will retry test, try #%s.' % test.tries) |
147 test_collection.add(_Test(test=retry, tries=test.tries)) | 147 test_collection.add(_Test(test=retry, tries=test.tries)) |
148 else: | 148 else: |
149 # All tests passed or retry limit reached. Either way, record results. | 149 # All tests passed or retry limit reached. Either way, record results. |
150 out_results.append(result) | 150 out_results.append(result) |
151 except android_commands.errors.DeviceUnresponsiveError: | 151 except android_commands.errors.DeviceUnresponsiveError: |
152 # Device is unresponsive, stop handling tests on this device and ensure | 152 # Device is unresponsive, stop handling tests on this device and ensure |
153 # current test gets runs by another device. Don't reraise this exception | 153 # current test gets runs by another device. Don't reraise this exception |
154 # on the main thread. | 154 # on the main thread. |
155 test_collection.add(test) | 155 test_collection.add(test) |
156 return | 156 return |
(...skipping 15 matching lines...) Expand all Loading... |
172 | 172 |
173 Args: | 173 Args: |
174 runner_factory: callable that takes a device and index and returns a | 174 runner_factory: callable that takes a device and index and returns a |
175 TestRunner object. | 175 TestRunner object. |
176 device: the device serial number to set up. | 176 device: the device serial number to set up. |
177 out_runners: list to add the successfully set up TestRunner object. | 177 out_runners: list to add the successfully set up TestRunner object. |
178 threadsafe_counter: a _ThreadSafeCounter object used to get shard indices. | 178 threadsafe_counter: a _ThreadSafeCounter object used to get shard indices. |
179 """ | 179 """ |
180 try: | 180 try: |
181 index = threadsafe_counter.GetAndIncrement() | 181 index = threadsafe_counter.GetAndIncrement() |
182 logging.warning('*****Creating shard %s for device %s.', index, device) | 182 logging.warning('Creating shard %s for device %s.', index, device) |
183 runner = runner_factory(device, index) | 183 runner = runner_factory(device, index) |
184 runner.SetUp() | 184 runner.SetUp() |
185 out_runners.append(runner) | 185 out_runners.append(runner) |
186 except android_commands.errors.DeviceUnresponsiveError as e: | 186 except android_commands.errors.DeviceUnresponsiveError as e: |
187 logging.warning('****Failed to create shard for %s: [%s]', device, e) | 187 logging.warning('Failed to create shard for %s: [%s]', device, e) |
188 | 188 |
189 | 189 |
190 def _RunAllTests(runners, tests, timeout=None): | 190 def _RunAllTests(runners, tests, timeout=None): |
191 """Run all tests using the given TestRunners. | 191 """Run all tests using the given TestRunners. |
192 | 192 |
193 Args: | 193 Args: |
194 runners: a list of TestRunner objects. | 194 runners: a list of TestRunner objects. |
195 tests: a list of Tests to run using the given TestRunners. | 195 tests: a list of Tests to run using the given TestRunners. |
196 timeout: watchdog timeout in seconds, defaults to the default timeout. | 196 timeout: watchdog timeout in seconds, defaults to the default timeout. |
197 | 197 |
198 Returns: | 198 Returns: |
199 A TestRunResults object. | 199 A TestRunResults object. |
200 """ | 200 """ |
201 logging.warning('****Running %s tests with %s test runners.' % | 201 logging.warning('Running %s tests with %s test runners.' % |
202 (len(tests), len(runners))) | 202 (len(tests), len(runners))) |
203 tests_collection = _TestCollection([_Test(t) for t in tests]) | 203 tests_collection = _TestCollection([_Test(t) for t in tests]) |
204 results = [] | 204 results = [] |
205 watcher = watchdog_timer.WatchdogTimer(timeout) | 205 watcher = watchdog_timer.WatchdogTimer(timeout) |
206 workers = reraiser_thread.ReraiserThreadGroup( | 206 workers = reraiser_thread.ReraiserThreadGroup( |
207 [reraiser_thread.ReraiserThread(_RunTestsFromQueue, | 207 [reraiser_thread.ReraiserThread(_RunTestsFromQueue, |
208 [r, tests_collection, results, watcher], | 208 [r, tests_collection, results, watcher], |
209 name=r.device[-4:]) | 209 name=r.device[-4:]) |
210 for r in runners]) | 210 for r in runners]) |
211 workers.StartAll() | 211 workers.StartAll() |
(...skipping 12 matching lines...) Expand all Loading... |
224 | 224 |
225 Args: | 225 Args: |
226 runner_factory: callable that takes a device and index and returns a | 226 runner_factory: callable that takes a device and index and returns a |
227 TestRunner object. | 227 TestRunner object. |
228 devices: list of device serial numbers as strings. | 228 devices: list of device serial numbers as strings. |
229 timeout: watchdog timeout in seconds, defaults to the default timeout. | 229 timeout: watchdog timeout in seconds, defaults to the default timeout. |
230 | 230 |
231 Returns: | 231 Returns: |
232 A list of TestRunner objects. | 232 A list of TestRunner objects. |
233 """ | 233 """ |
234 logging.warning('****Creating %s test runners.' % len(devices)) | 234 logging.warning('Creating %s test runners.' % len(devices)) |
235 runners = [] | 235 runners = [] |
236 counter = _ThreadSafeCounter() | 236 counter = _ThreadSafeCounter() |
237 threads = reraiser_thread.ReraiserThreadGroup( | 237 threads = reraiser_thread.ReraiserThreadGroup( |
238 [reraiser_thread.ReraiserThread(_SetUp, | 238 [reraiser_thread.ReraiserThread(_SetUp, |
239 [runner_factory, d, runners, counter], | 239 [runner_factory, d, runners, counter], |
240 name=d[-4:]) | 240 name=d[-4:]) |
241 for d in devices]) | 241 for d in devices]) |
242 threads.StartAll() | 242 threads.StartAll() |
243 threads.JoinAll(watchdog_timer.WatchdogTimer(timeout)) | 243 threads.JoinAll(watchdog_timer.WatchdogTimer(timeout)) |
244 return runners | 244 return runners |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 A base_test_result.TestRunResults object. | 277 A base_test_result.TestRunResults object. |
278 """ | 278 """ |
279 forwarder.Forwarder.KillHost(build_type) | 279 forwarder.Forwarder.KillHost(build_type) |
280 runners = _CreateRunners(runner_factory, devices, setup_timeout) | 280 runners = _CreateRunners(runner_factory, devices, setup_timeout) |
281 try: | 281 try: |
282 return _RunAllTests(runners, tests, test_timeout) | 282 return _RunAllTests(runners, tests, test_timeout) |
283 finally: | 283 finally: |
284 try: | 284 try: |
285 _TearDownRunners(runners, setup_timeout) | 285 _TearDownRunners(runners, setup_timeout) |
286 except android_commands.errors.DeviceUnresponsiveError as e: | 286 except android_commands.errors.DeviceUnresponsiveError as e: |
287 logging.warning('****Device unresponsive during TearDown: [%s]', e) | 287 logging.warning('Device unresponsive during TearDown: [%s]', e) |
288 finally: | 288 finally: |
289 forwarder.Forwarder.KillHost(build_type) | 289 forwarder.Forwarder.KillHost(build_type) |
OLD | NEW |