Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2579)

Unified Diff: build/android/pylib/gtest/dispatch.py

Issue 12278020: [Android] Re-write the gtest TestRunner and introduce a new generic sharder. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: more frank nits Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « build/android/pylib/base/shard_unittest.py ('k') | build/android/pylib/gtest/test_runner.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: build/android/pylib/gtest/dispatch.py
diff --git a/build/android/pylib/gtest/dispatch.py b/build/android/pylib/gtest/dispatch.py
index 80bbacd3518699be18c1aefe1503d2b2937d1192..6fa2dbc0ee454896f8faa041bf9c1b634e9eb2f6 100644
--- a/build/android/pylib/gtest/dispatch.py
+++ b/build/android/pylib/gtest/dispatch.py
@@ -3,17 +3,20 @@
# found in the LICENSE file.
import copy
+import fnmatch
import logging
import os
from pylib import android_commands
from pylib import cmd_helper
from pylib import ports
+from pylib.base import shard
+from pylib.base import test_result
from pylib.utils import emulator
from pylib.utils import xvfb
import gtest_config
-import test_sharder
+import test_runner
def _FullyQualifiedTestSuites(exe, option_test_suite, build_type):
@@ -54,6 +57,48 @@ def _FullyQualifiedTestSuites(exe, option_test_suite, build_type):
return zip(all_test_suites, qualified_test_suites)
+def _GetTestsFromDevice(runner):
+ """Get a list of tests from a device, excluding disabled tests.
+
+ Args:
+ runner: a TestRunner.
+ """
+ # The executable/apk needs to be copied before we can call GetAllTests.
+ runner.test_package.StripAndCopyExecutable()
+ all_tests = runner.test_package.GetAllTests()
+ # Only includes tests that do not have any match in the disabled list.
+ disabled_list = runner.GetDisabledTests()
+ return filter(lambda t: not any([fnmatch.fnmatch(t, disabled_pattern)
+ for disabled_pattern in disabled_list]),
+ all_tests)
+
+
+def _GetAllEnabledTests(runner_factory, devices):
+ """Get all enabled tests.
+
+ Obtains a list of enabled tests from the test package on the device,
+ then filters it again using the disabled list on the host.
+
+ Args:
+ runner_factory: callable that takes a devices and returns a TestRunner.
+ devices: list of devices.
+
+ Returns:
+ List of all enabled tests.
+
+ Raises Exception if all devices failed.
+ """
+ for device in devices:
+ try:
+ logging.info('Obtaining tests from %s', device)
+ runner = runner_factory(device)
+ return _GetTestsFromDevice(runner)
+ except Exception as e:
+ logging.warning('Failed obtaining tests from %s with exception: %s',
+ device, e)
+ raise Exception('No device available to get the list of tests.')
+
+
def _RunATestSuite(options, suite_name):
"""Run a single test suite.
@@ -90,22 +135,31 @@ def _RunATestSuite(options, suite_name):
if not ports.ResetTestServerPortAllocation():
raise Exception('Failed to reset test server port.')
+ # Constructs a new TestRunner with the current options.
+ def RunnerFactory(device):
+ return test_runner.TestRunner(
+ device,
+ options.test_suite,
+ options.test_arguments,
+ options.timeout,
+ options.cleanup_test_files,
+ options.tool,
+ options.build_type,
+ options.webkit)
+
+ # Get tests and split them up based on the number of devices.
if options.gtest_filter:
- logging.warning('Sharding is not possible with these configurations.')
- attached_devices = [attached_devices[0]]
-
- sharder = test_sharder.TestSharder(
- attached_devices,
- options.test_suite,
- options.gtest_filter,
- options.test_arguments,
- options.timeout,
- options.cleanup_test_files,
- options.tool,
- options.build_type,
- options.webkit)
-
- test_results = sharder.RunShardedTests()
+ all_tests = [t for t in options.gtest_filter.split(':') if t]
+ else:
+ all_tests = _GetAllEnabledTests(RunnerFactory, attached_devices)
+ num_devices = len(attached_devices)
+ tests = [':'.join(all_tests[i::num_devices]) for i in xrange(num_devices)]
+ tests = [t for t in tests if t]
+
+ # Run tests.
+ test_results = shard.ShardAndRunTests(RunnerFactory, attached_devices, tests,
+ options.build_type)
+
test_results.LogFull(
test_type='Unit test',
test_package=suite_name,
« no previous file with comments | « build/android/pylib/base/shard_unittest.py ('k') | build/android/pylib/gtest/test_runner.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698