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

Unified Diff: build/android/pylib/gtest/test_runner.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/gtest/dispatch.py ('k') | build/android/pylib/gtest/test_sharder.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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()
« no previous file with comments | « build/android/pylib/gtest/dispatch.py ('k') | build/android/pylib/gtest/test_sharder.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698