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

Unified Diff: build/android/pylib/browsertests/setup.py

Issue 18770008: [Android] Redesigns the sharder to allow replicated vs distributed tests (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Re-adds -f short form to gtest_filter switch Created 7 years, 5 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/browsertests/dispatch.py ('k') | build/android/pylib/gtest/dispatch.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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)
« no previous file with comments | « build/android/pylib/browsertests/dispatch.py ('k') | build/android/pylib/gtest/dispatch.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698