Index: build/android/pylib/local/device/local_device_test_run.py |
diff --git a/build/android/pylib/local/device/local_device_test_run.py b/build/android/pylib/local/device/local_device_test_run.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..242f89ccbcc76a2f99cf53bf6e1c5a87a7b3baad |
--- /dev/null |
+++ b/build/android/pylib/local/device/local_device_test_run.py |
@@ -0,0 +1,63 @@ |
+# Copyright 2014 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+ |
+from pylib.base import base_test_result |
+from pylib.base import test_run |
+from pylib.base import test_collection |
+ |
+ |
+class LocalDeviceTestRun(test_run.TestRun): |
+ |
+ #override |
+ def RunTests(self): |
+ tests = self._GetTests() |
+ |
+ def run_tests_on_device(dev, tests): |
+ r = base_test_result.TestRunResults() |
+ for test in tests: |
+ result = self._RunTest(dev, test) |
+ if isinstance(result, base_test_result.BaseTestResult): |
+ r.AddResult(result) |
+ elif isinstance(result, list): |
+ r.AddResults(result) |
+ else: |
+ raise Exception('Unexpected result type: %s' % type(result).__name__) |
+ if isinstance(tests, test_collection.TestCollection): |
klundberg
2014/12/09 02:30:47
Should this really be called for each test in test
jbudorick
2014/12/09 15:46:52
Yep, we have to tell the TestCollection each time
|
+ tests.test_completed() |
+ return r |
+ |
+ tries = 0 |
+ results = base_test_result.TestRunResults() |
+ while tries < self._env.max_tries and tests: |
+ if self._ShouldShard(): |
+ tests = test_collection.TestCollection(self._CreateShards(tests)) |
+ try_results = self._env.parallel_devices.pMap( |
+ run_tests_on_device, tests).pGet(None) |
+ fail_results = [] |
+ for tr in try_results: |
klundberg
2014/12/09 02:30:47
I know why you are using tr but I personally prefe
jbudorick
2014/12/09 15:46:51
expanded:
tr -> try_result
r -> result
|
+ for r in tr.GetAll(): |
+ if r.GetType() in (base_test_result.ResultType.PASS, |
+ base_test_result.ResultType.SKIP): |
+ results.AddResult(r) |
+ else: |
+ fail_results.append(r) |
+ tests = [f.GetName() for f in fail_results] |
+ tries += 1 |
+ |
+ if fail_results: |
+ results.AddTestResults(fail_results) |
+ return results |
+ |
+ def _CreateShards(self, tests): |
+ raise NotImplementedError |
+ |
+ def _GetTests(self): |
+ raise NotImplementedError |
+ |
+ def _RunTest(self, device, test): |
+ raise NotImplementedError |
+ |
+ def _ShouldShard(self): |
+ raise NotImplementedError |