Index: build/android/pylib/gtest/test_runner.py |
diff --git a/build/android/pylib/gtest/test_runner.py b/build/android/pylib/gtest/test_runner.py |
index 479a907a48b9544b2554ea9edb7f2285cfdb992b..3ac50e214227837006c3c4c426ae341c617c5dbe 100644 |
--- a/build/android/pylib/gtest/test_runner.py |
+++ b/build/android/pylib/gtest/test_runner.py |
@@ -5,21 +5,17 @@ |
import glob |
import logging |
import os |
-import sys |
from pylib import android_commands |
from pylib import constants |
from pylib import perf_tests_helper |
from pylib.android_commands import errors |
-from pylib.base.base_test_runner import BaseTestRunner |
-from pylib.base.test_result import BaseTestResult, TestResults |
+from pylib.base import new_base_test_runner as base_test_runner |
+from pylib.base import test_result |
from pylib.utils import run_tests_helper |
-from test_package_apk import TestPackageApk |
-from test_package_executable import TestPackageExecutable |
- |
- |
-CURFILE_PATH = os.path.abspath(os.path.dirname(__file__)) |
+import test_package_apk |
+import test_package_executable |
def _GetDataFilesForTestSuite(test_suite_basename): |
@@ -34,9 +30,7 @@ def _GetDataFilesForTestSuite(test_suite_basename): |
# Ideally, we'd just push all test data. However, it has >100MB, and a lot |
# of the files are not relevant (some are used for browser_tests, others for |
# features not supported, etc..). |
- if test_suite_basename in ['base_unittests', |
- 'sql_unittests', |
- 'unit_tests']: |
+ if test_suite_basename in ['base_unittests', 'sql_unittests', 'unit_tests']: |
test_files = [ |
'base/data/file_util_unittest', |
'base/data/json/bom_feff.json', |
@@ -130,85 +124,60 @@ def _GetDataFilesForTestSuite(test_suite_basename): |
return [] |
-class TestRunner(BaseTestRunner): |
+def _TestSuiteRequiresMockTestServer(test_suite_basename): |
+ """Returns True if the test suite requires mock test server.""" |
+ tests_require_net_test_server = ['unit_tests', 'net_unittests', |
+ 'content_unittests'] |
+ return (test_suite_basename in |
+ tests_require_net_test_server) |
+ |
+ |
+class TestRunner(base_test_runner.BaseTestRunner): |
"""Single test suite attached to a single device. |
Args: |
device: Device to run the tests. |
test_suite: A specific test suite to run, empty to run all. |
- gtest_filter: A gtest_filter flag. |
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. |
- shard_index: index number of the shard on which the test suite will run. |
+ tool_name: Name of the Valgrind tool. |
build_type: 'Release' or 'Debug'. |
in_webkit_checkout: Whether the suite is being run from a WebKit checkout. |
""" |
- def __init__(self, device, test_suite, gtest_filter, test_arguments, timeout, |
- cleanup_test_files, tool_name, shard_index, build_type, |
+ def __init__(self, device, test_suite, test_arguments, timeout, |
+ cleanup_test_files, tool_name, build_type, |
in_webkit_checkout): |
- BaseTestRunner.__init__(self, device, tool_name, shard_index, build_type) |
+ super(TestRunner, self).__init__(device, tool_name, build_type) |
self._running_on_emulator = self.device.startswith('emulator') |
- self._gtest_filter = gtest_filter |
self._test_arguments = test_arguments |
- self.test_results = TestResults() |
self.in_webkit_checkout = in_webkit_checkout |
+ self._cleanup_test_files = cleanup_test_files |
logging.warning('Test suite: ' + test_suite) |
if os.path.splitext(test_suite)[1] == '.apk': |
- self.test_package = TestPackageApk( |
+ self.test_package = test_package_apk.TestPackageApk( |
self.adb, |
device, |
test_suite, |
timeout, |
- cleanup_test_files, |
+ self._cleanup_test_files, |
self.tool) |
else: |
# Put a copy into the android out/target directory, to allow stack trace |
# generation. |
symbols_dir = os.path.join(constants.CHROME_DIR, 'out', build_type, |
'lib.target') |
- self.test_package = TestPackageExecutable( |
+ self.test_package = test_package_executable.TestPackageExecutable( |
self.adb, |
device, |
- test_suite, timeout, |
- cleanup_test_files, |
+ test_suite, |
+ timeout, |
+ self._cleanup_test_files, |
self.tool, |
symbols_dir) |
- def _TestSuiteRequiresMockTestServer(self): |
- """Returns True if the test suite requires mock test server.""" |
- tests_require_net_test_server = ['unit_tests', 'net_unittests', |
- 'content_unittests'] |
- return (self.test_package.test_suite_basename in |
- tests_require_net_test_server) |
- |
- def GetDisabledTests(self): |
- """Returns a list of disabled tests. |
- |
- Returns: |
- A list of disabled tests obtained from 'filter' subdirectory. |
- """ |
- gtest_filter_base_path = os.path.join( |
- CURFILE_PATH, 'filter', self.test_package.test_suite_basename) |
- disabled_tests = run_tests_helper.GetExpectations( |
- gtest_filter_base_path + '_disabled') |
- if self._running_on_emulator: |
- # Append emulator's filter file. |
- disabled_tests.extend(run_tests_helper.GetExpectations( |
- gtest_filter_base_path + '_emulator_additional_disabled')) |
- return disabled_tests |
- |
- def LaunchHelperToolsForTestSuite(self): |
- """Launches helper tools for the test suite. |
- |
- Sometimes one test may need to run some helper tools first in order to |
- successfully complete the test. |
- """ |
- if self._TestSuiteRequiresMockTestServer(): |
- self.LaunchChromeTestServerSpawner() |
def StripAndCopyFiles(self): |
"""Strips and copies the required data files for the test suite.""" |
@@ -240,44 +209,69 @@ class TestRunner(BaseTestRunner): |
self.adb.GetExternalStorage(), |
'third_party/WebKit/Source/WebKit/chromium/tests/data')) |
- def RunTests(self): |
- """Runs tests on a single device. |
+ # TODO(craigdh): There is no reason for this to be part of TestRunner. |
+ def GetDisabledTests(self): |
+ """Returns a list of disabled tests. |
Returns: |
- A TestResults object. |
+ A list of disabled tests obtained from 'filter' subdirectory. |
""" |
- if self._gtest_filter: |
- try: |
- self.test_package.CreateTestRunnerScript(self._gtest_filter, |
- self._test_arguments) |
- self.test_results = self.test_package.RunTestsAndListResults() |
- except errors.DeviceUnresponsiveError as e: |
- # Make sure this device is not attached |
- logging.warning(e) |
- if android_commands.IsDeviceAttached(self.device): |
- raise e |
- self.test_results.device_exception = device_exception |
- # Calculate unknown test results. |
- finally: |
- # TODO(frankf): Do not break TestResults encapsulation. |
- all_tests = set(self._gtest_filter.split(':')) |
- all_tests_ran = set([t.name for t in self.test_results.GetAll()]) |
- unknown_tests = all_tests - all_tests_ran |
- self.test_results.unknown = [BaseTestResult(t, '') for t in |
- unknown_tests] |
- return self.test_results |
+ gtest_filter_base_path = os.path.join( |
+ os.path.abspath(os.path.dirname(__file__)), |
+ 'filter', |
+ self.test_package.test_suite_basename) |
+ disabled_tests = run_tests_helper.GetExpectations( |
+ gtest_filter_base_path + '_disabled') |
+ if self._running_on_emulator: |
+ # Append emulator's filter file. |
+ disabled_tests.extend(run_tests_helper.GetExpectations( |
+ gtest_filter_base_path + '_emulator_additional_disabled')) |
+ return disabled_tests |
+ |
+ def RunTest(self, test): |
+ """Runs a test on a single device. |
+ |
+ Args: |
+ test: a gtest filter string to run. |
+ |
+ Returns: |
+ Tuple: (TestResults, test to retry or None) |
+ """ |
+ test_results = test_result.TestResults() |
+ if not test: |
+ return test_results, None |
+ |
+ try: |
+ self.test_package.CreateTestRunnerScript(test, self._test_arguments) |
+ test_results = self.test_package.RunTestsAndListResults() |
+ except errors.DeviceUnresponsiveError as e: |
+ # Make sure this device is not attached |
+ logging.warning(e) |
+ if android_commands.IsDeviceAttached(self.device): |
+ raise |
+ test_results.device_exception = device_exception |
+ # Calculate unknown test results. |
+ # TODO(frankf): Do not break TestResults encapsulation. |
+ all_tests = set(test.split(':')) |
+ all_tests_ran = set([t.name for t in test_results.GetAll()]) |
+ unknown_tests = all_tests - all_tests_ran |
+ test_results.unknown = [test_result.BaseTestResult(t, '') for t in |
+ unknown_tests] |
+ retry = ':'.join([t.name for t in test_results.GetAllBroken()]) |
+ return test_results, retry |
def SetUp(self): |
"""Sets up necessary test enviroment for the test suite.""" |
super(TestRunner, self).SetUp() |
self.adb.ClearApplicationState(constants.CHROME_PACKAGE) |
self.StripAndCopyFiles() |
- self.LaunchHelperToolsForTestSuite() |
+ if _TestSuiteRequiresMockTestServer(self.test_package.test_suite_basename): |
+ self.LaunchChromeTestServerSpawner() |
self.tool.SetupEnvironment() |
def TearDown(self): |
"""Cleans up the test enviroment for the test suite.""" |
self.tool.CleanUpEnvironment() |
- if self.test_package.cleanup_test_files: |
+ if self._cleanup_test_files: |
self.adb.RemovePushedFiles() |
super(TestRunner, self).TearDown() |