Index: build/android/pylib/browsertests/setup.py |
diff --git a/build/android/pylib/browsertests/dispatch.py b/build/android/pylib/browsertests/setup.py |
similarity index 26% |
rename from build/android/pylib/browsertests/dispatch.py |
rename to build/android/pylib/browsertests/setup.py |
index 28ee318ddf89e9f53162bcbb0f3fae7740ccd90f..36316f062ac6b6b9c9669e40b38e38b5328422fb 100644 |
--- a/build/android/pylib/browsertests/dispatch.py |
+++ b/build/android/pylib/browsertests/setup.py |
@@ -2,11 +2,10 @@ |
# Use of this source code is governed by a BSD-style license that can be |
# found in the LICENSE file. |
-"""Dispatches content_browsertests.""" |
+"""Generate test runner factory and tests for content_browsertests.""" |
import logging |
import os |
-import shutil |
import sys |
from pylib import android_commands |
@@ -14,83 +13,78 @@ from pylib import cmd_helper |
from pylib import constants |
from pylib import ports |
from pylib.base import base_test_result |
-from pylib.base import shard |
-from pylib.gtest import dispatch as gtest_dispatch |
+from pylib.gtest import setup as gtest_setup |
from pylib.gtest import test_runner |
from pylib.utils import report_results |
-def Dispatch(options): |
- """Dispatches all content_browsertests. |
+def Setup(test_arguments, timeout, cleanup_test_files, tool, build_type, |
+ webkit, push_deps, gtest_filter): |
+ """Create the test runner factory and tests. |
Args: |
- options: optparse.Options object containing command-line options |
+ test_arguments: Additional arguments to pass to the test binary. |
+ timeout: Timeout for each test. |
+ cleanup_test_files: Whether or not to cleanup test files on device. |
+ tool: Name of the Valgrind tool. |
+ build_type: 'Release' or 'Debug'. |
+ webkit: Whether the suite is being run from a WebKit checkout. |
+ push_deps: If True, push all dependencies to the device. |
+ gtest_filter: filter for tests. |
+ |
Returns: |
- A tuple of (base_test_result.TestRunResults object, exit code). |
- Raises: |
- Exception: Failed to reset the test server port. |
+ A tuple of (TestRunnerFactory, tests). |
""" |
- attached_devices = [] |
- if options.test_device: |
- attached_devices = [options.test_device] |
- else: |
- attached_devices = android_commands.GetAttachedDevices() |
- |
- if not attached_devices: |
- logging.critical('A device must be attached and online.') |
- return (base_test_result.TestRunResults(), constants.ERROR_EXIT_CODE) |
- |
- # Reset the test port allocation. It's important to do it before starting |
- # to dispatch any tests. |
if not ports.ResetTestServerPortAllocation(): |
raise Exception('Failed to reset test server port.') |
- test_suite_dir = os.path.join(cmd_helper.OutDirectory.get(), |
- options.build_type) |
- options.test_suite = os.path.join(test_suite_dir, |
- 'apks', |
- constants.BROWSERTEST_SUITE_NAME + '.apk') |
+ suite_path = os.path.join(cmd_helper.OutDirectory.get(), build_type, 'apks', |
+ constants.BROWSERTEST_SUITE_NAME + '.apk') |
- gtest_dispatch._GenerateDepsDirUsingIsolate( |
- constants.BROWSERTEST_SUITE_NAME, options.build_type) |
+ gtest_setup._GenerateDepsDirUsingIsolate( |
+ constants.BROWSERTEST_SUITE_NAME, build_type) |
# Constructs a new TestRunner with the current options. |
- def RunnerFactory(device, shard_index): |
+ def TestRunnerFactory(device, shard_index): |
return test_runner.TestRunner( |
device, |
- options.test_suite, |
- options.test_arguments, |
- options.timeout, |
- options.cleanup_test_files, |
- options.tool, |
- options.build_type, |
- options.webkit, |
- options.push_deps, |
+ suite_path, |
+ test_arguments, |
+ timeout, |
+ cleanup_test_files, |
+ tool, |
+ build_type, |
+ webkit, |
+ push_deps, |
constants.BROWSERTEST_TEST_PACKAGE_NAME, |
constants.BROWSERTEST_TEST_ACTIVITY_NAME, |
constants.BROWSERTEST_COMMAND_LINE_FILE) |
- tests = gtest_dispatch.GetTestsFiltered( |
- constants.BROWSERTEST_SUITE_NAME, options.test_filter, RunnerFactory, |
+ # TODO(gkanwar): This breaks the abstraction of having test_dispatcher.py deal |
+ # entirely with the devices. Can we do this another way? |
+ attached_devices = android_commands.GetAttachedDevices() |
+ |
+ all_tests = gtest_setup.GetTestsFiltered( |
+ constants.BROWSERTEST_SUITE_NAME, gtest_filter, TestRunnerFactory, |
attached_devices) |
- # Run tests. |
- # TODO(nileshagrawal): remove this abnormally long setup timeout once fewer |
- # files are pushed to the devices for content_browsertests: crbug.com/138275 |
- setup_timeout = 20 * 60 # 20 minutes |
- test_results, exit_code = shard.ShardAndRunTests( |
- RunnerFactory, attached_devices, tests, options.build_type, |
- setup_timeout=setup_timeout, test_timeout=None, |
- num_retries=options.num_retries) |
- report_results.LogFull( |
- results=test_results, |
- test_type='Unit test', |
- test_package=constants.BROWSERTEST_SUITE_NAME, |
- build_type=options.build_type, |
- flakiness_server=options.flakiness_dashboard_server) |
- |
- if os.path.isdir(constants.ISOLATE_DEPS_DIR): |
- shutil.rmtree(constants.ISOLATE_DEPS_DIR) |
- |
- return (test_results, exit_code) |
+ return (TestRunnerFactory, all_tests) |
+ |
+ |
+def _FilterTests(all_enabled_tests): |
+ """Filters out tests and fixtures starting with PRE_ and MANUAL_.""" |
+ return [t for t in all_enabled_tests if _ShouldRunOnBot(t)] |
+ |
+ |
+def _ShouldRunOnBot(test): |
+ fixture, case = test.split('.', 1) |
+ if _StartsWith(fixture, case, 'PRE_'): |
+ return False |
+ if _StartsWith(fixture, case, 'MANUAL_'): |
+ return False |
+ return True |
+ |
+ |
+def _StartsWith(a, b, prefix): |
+ return a.startswith(prefix) or b.startswith(prefix) |