Index: build/android/pylib/browsertests/test_runner.py |
diff --git a/build/android/pylib/browsertests/test_runner.py b/build/android/pylib/browsertests/test_runner.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fe6931ae4519c3e54c4c2fe7855b7b65173a9498 |
--- /dev/null |
+++ b/build/android/pylib/browsertests/test_runner.py |
@@ -0,0 +1,124 @@ |
+# Copyright (c) 2013 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+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.gtest.test_package_apk import TestPackageApk |
+from pylib.utils import run_tests_helper |
+ |
+CURFILE_PATH = os.path.abspath(os.path.dirname(__file__)) |
+ |
+ |
+def _GetDataFilesForTestSuite(): |
+ return ['content/test/data',] |
+ |
+ |
+class TestRunner(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: Name of the Valgrind tool. |
+ shard_index: index number of the shard on which the test suite will run. |
+ build_type: 'Release' or 'Debug'. |
+ """ |
+ |
+ def __init__(self, device, test_suite, gtest_filter, test_arguments, timeout, |
+ cleanup_test_files, tool_name, shard_index, build_type,): |
+ BaseTestRunner.__init__(self, device, tool_name, shard_index, build_type) |
+ self._gtest_filter = gtest_filter |
+ self._test_arguments = '--single_process %s' % test_arguments |
+ self.test_results = TestResults() |
+ |
+ logging.warning('Test suite: ' + test_suite) |
+ self.test_package = TestPackageApk( |
+ self.adb, |
+ device, |
+ test_suite, |
+ timeout, |
+ cleanup_test_files, |
+ self.tool, |
+ 'org.chromium.content_browsertests_apk', |
+ 'org.chromium.content_browsertests_apk.ContentBrowserTestsActivity', |
+ 'content-browser-tests-command-line') |
+ |
+ 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') |
+ return disabled_tests |
+ |
+ def LaunchHelperToolsForTestSuite(self): |
+ """Launches helper tools for the test suite.""" |
+ self.LaunchChromeTestServerSpawner() |
+ |
+ def StripAndCopyFiles(self): |
+ """Strips and copies the required data files for the test suite.""" |
+ self.test_package.StripAndCopyExecutable() |
+ self.test_package.PushDataAndPakFiles() |
+ self.tool.CopyFiles() |
+ test_data = _GetDataFilesForTestSuite() |
+ if test_data: |
+ # Make sure SD card is ready. |
+ self.adb.WaitForSdCardReady(20) |
+ for data in test_data: |
+ self.CopyTestData([data], self.adb.GetExternalStorage()) |
+ |
+ def RunTests(self): |
+ """Runs a single test on a single device. |
+ |
+ Returns: |
+ A TestResults object. |
+ """ |
+ if not self._gtest_filter: |
+ raise Exception('Cannot run browser tests without a test 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 |
+ finally: |
+ # TODO(frankf): Do not break TestResults encapsulation. |
+ all_tests = self._gtest_filter |
+ all_tests_ran = set([t.name for t in self.test_results.GetAll()]) |
+ self.test_results.unknown = [] |
+ return self.test_results |
+ |
+ def SetUp(self): |
+ """Sets up necessary test enviroment for the test suite.""" |
+ super(TestRunner, self).SetUp() |
+ self.StripAndCopyFiles() |
+ self.LaunchHelperToolsForTestSuite() |
+ 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: |
+ self.adb.RemovePushedFiles() |
+ super(TestRunner, self).TearDown() |