| Index: build/android/pylib/base/shard.py
|
| diff --git a/build/android/pylib/base/shard.py b/build/android/pylib/base/shard.py
|
| index 89b84f6f92bbc692a664389ded150ac5b60b39c4..8c429f7d3d01a9df148d25089260e9f085f50724 100644
|
| --- a/build/android/pylib/base/shard.py
|
| +++ b/build/android/pylib/base/shard.py
|
| @@ -8,6 +8,7 @@ import logging
|
| import threading
|
|
|
| from pylib import android_commands
|
| +from pylib import constants
|
| from pylib import forwarder
|
| from pylib.utils import reraiser_thread
|
| from pylib.utils import watchdog_timer
|
| @@ -92,7 +93,7 @@ class _TestCollection(object):
|
| """Add an test to the collection.
|
|
|
| Args:
|
| - item: A test to add.
|
| + test: A test to add.
|
| """
|
| with self._lock:
|
| self._tests.append(test)
|
| @@ -117,7 +118,7 @@ class _TestCollection(object):
|
|
|
|
|
| def _RunTestsFromQueue(runner, test_collection, out_results, watcher,
|
| - num_retries):
|
| + num_retries):
|
| """Runs tests from the test_collection until empty using the given runner.
|
|
|
| Adds TestRunResults objects to the out_results list and may add tests to the
|
| @@ -150,12 +151,6 @@ def _RunTestsFromQueue(runner, test_collection, out_results, watcher,
|
| else:
|
| # All tests passed or retry limit reached. Either way, record results.
|
| out_results.append(result)
|
| - except android_commands.errors.DeviceUnresponsiveError:
|
| - # Device is unresponsive, stop handling tests on this device and ensure
|
| - # current test gets runs by another device. Don't reraise this exception
|
| - # on the main thread.
|
| - test_collection.add(test)
|
| - return
|
| except:
|
| # An unhandleable exception, ensure tests get run by another device and
|
| # reraise this exception on the main thread.
|
| @@ -199,12 +194,13 @@ def _RunAllTests(runners, tests, num_retries, timeout=None):
|
| timeout: watchdog timeout in seconds, defaults to the default timeout.
|
|
|
| Returns:
|
| - A TestRunResults object.
|
| + A tuple of (TestRunResults object, exit code)
|
| """
|
| logging.warning('Running %s tests with %s test runners.' %
|
| (len(tests), len(runners)))
|
| tests_collection = _TestCollection([_Test(t) for t in tests])
|
| results = []
|
| + exit_code = 0
|
| watcher = watchdog_timer.WatchdogTimer(timeout)
|
| workers = reraiser_thread.ReraiserThreadGroup(
|
| [reraiser_thread.ReraiserThread(
|
| @@ -212,12 +208,21 @@ def _RunAllTests(runners, tests, num_retries, timeout=None):
|
| [r, tests_collection, results, watcher, num_retries],
|
| name=r.device[-4:])
|
| for r in runners])
|
| - workers.StartAll()
|
| - workers.JoinAll(watcher)
|
| run_results = base_test_result.TestRunResults()
|
| + workers.StartAll()
|
| +
|
| + # Catch DeviceUnresponsiveErrors and set a warning exit code
|
| + try:
|
| + workers.JoinAll(watcher)
|
| + except android_commands.errors.DeviceUnresponsiveError as e:
|
| + logging.error(e)
|
| + exit_code = constants.WARNING_EXIT_CODE
|
| +
|
| for r in results:
|
| run_results.AddTestRunResults(r)
|
| - return run_results
|
| + if not run_results.DidRunPass():
|
| + exit_code = constants.ERROR_EXIT_CODE
|
| + return (run_results, exit_code)
|
|
|
|
|
| def _CreateRunners(runner_factory, devices, timeout=None):
|
| @@ -250,6 +255,7 @@ def _CreateRunners(runner_factory, devices, timeout=None):
|
|
|
| def _TearDownRunners(runners, timeout=None):
|
| """Calls TearDown() for each test runner in parallel.
|
| +
|
| Args:
|
| runners: a list of TestRunner objects.
|
| timeout: watchdog timeout in seconds, defaults to the default timeout.
|
| @@ -280,11 +286,11 @@ def ShardAndRunTests(runner_factory, devices, tests, build_type='Debug',
|
| num_retries: number of retries for a test.
|
|
|
| Returns:
|
| - A base_test_result.TestRunResults object.
|
| + A tuple of (base_test_result.TestRunResults object, exit code).
|
| """
|
| if not tests:
|
| - logging.warning('No tests to run.')
|
| - return base_test_result.TestRunResults()
|
| + logging.error('No tests to run.')
|
| + return (base_test_result.TestRunResults(), constants.ERROR_EXIT_CODE)
|
|
|
| logging.info('Will run %d tests: %s', len(tests), str(tests))
|
| forwarder.Forwarder.KillHost(build_type)
|
|
|