| OLD | NEW |
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import logging | 5 import logging |
| 6 import os | 6 import os |
| 7 import re | 7 import re |
| 8 | 8 |
| 9 from pylib import android_commands | 9 from pylib import android_commands |
| 10 from pylib import constants | 10 from pylib import constants |
| 11 from pylib import pexpect | 11 from pylib import pexpect |
| 12 from pylib.base import base_test_result | 12 from pylib.base import base_test_result |
| 13 from pylib.base import base_test_runner | 13 from pylib.base import base_test_runner |
| 14 from pylib.utils import run_tests_helper | 14 from pylib.utils import run_tests_helper |
| 15 | 15 |
| 16 import test_package_apk | 16 import test_package_apk |
| 17 import test_package_exe | 17 import test_package_exe |
| 18 | 18 |
| 19 | 19 |
| 20 def _TestSuiteRequiresMockTestServer(test_suite_basename): | 20 def _TestSuiteRequiresMockTestServer(suite_basename): |
| 21 """Returns True if the test suite requires mock test server.""" | 21 """Returns True if the test suite requires mock test server.""" |
| 22 tests_require_net_test_server = ['unit_tests', 'net_unittests', | 22 tests_require_net_test_server = ['unit_tests', 'net_unittests', |
| 23 'content_unittests', | 23 'content_unittests', |
| 24 'content_browsertests'] | 24 'content_browsertests'] |
| 25 return (test_suite_basename in | 25 return (suite_basename in |
| 26 tests_require_net_test_server) | 26 tests_require_net_test_server) |
| 27 | 27 |
| 28 | 28 |
| 29 class TestRunner(base_test_runner.BaseTestRunner): | 29 class TestRunner(base_test_runner.BaseTestRunner): |
| 30 def __init__(self, device, test_suite, test_arguments, timeout, | 30 def __init__(self, device, suite_name, test_arguments, timeout, |
| 31 cleanup_test_files, tool_name, build_type, | 31 cleanup_test_files, tool_name, build_type, |
| 32 in_webkit_checkout, push_deps, test_apk_package_name=None, | 32 in_webkit_checkout, push_deps, test_apk_package_name=None, |
| 33 test_activity_name=None, command_line_file=None): | 33 test_activity_name=None, command_line_file=None): |
| 34 """Single test suite attached to a single device. | 34 """Single test suite attached to a single device. |
| 35 | 35 |
| 36 Args: | 36 Args: |
| 37 device: Device to run the tests. | 37 device: Device to run the tests. |
| 38 test_suite: A specific test suite to run, empty to run all. | 38 suite_name: A specific test suite to run, empty to run all. |
| 39 test_arguments: Additional arguments to pass to the test binary. | 39 test_arguments: Additional arguments to pass to the test binary. |
| 40 timeout: Timeout for each test. | 40 timeout: Timeout for each test. |
| 41 cleanup_test_files: Whether or not to cleanup test files on device. | 41 cleanup_test_files: Whether or not to cleanup test files on device. |
| 42 tool_name: Name of the Valgrind tool. | 42 tool_name: Name of the Valgrind tool. |
| 43 build_type: 'Release' or 'Debug'. | 43 build_type: 'Release' or 'Debug'. |
| 44 in_webkit_checkout: Whether the suite is being run from a WebKit checkout. | 44 in_webkit_checkout: Whether the suite is being run from a WebKit checkout. |
| 45 push_deps: If True, push all dependencies to the device. | 45 push_deps: If True, push all dependencies to the device. |
| 46 test_apk_package_name: Apk package name for tests running in APKs. | 46 test_apk_package_name: Apk package name for tests running in APKs. |
| 47 test_activity_name: Test activity to invoke for APK tests. | 47 test_activity_name: Test activity to invoke for APK tests. |
| 48 command_line_file: Filename to use to pass arguments to tests. | 48 command_line_file: Filename to use to pass arguments to tests. |
| 49 """ | 49 """ |
| 50 super(TestRunner, self).__init__(device, tool_name, build_type, push_deps, | 50 super(TestRunner, self).__init__(device, tool_name, build_type, push_deps, |
| 51 cleanup_test_files) | 51 cleanup_test_files) |
| 52 self._test_arguments = test_arguments | 52 self._test_arguments = test_arguments |
| 53 self.in_webkit_checkout = in_webkit_checkout | 53 self.in_webkit_checkout = in_webkit_checkout |
| 54 if timeout == 0: | 54 if timeout == 0: |
| 55 timeout = 60 | 55 timeout = 60 |
| 56 # On a VM (e.g. chromium buildbots), this timeout is way too small. | 56 # On a VM (e.g. chromium buildbots), this timeout is way too small. |
| 57 if os.environ.get('BUILDBOT_SLAVENAME'): | 57 if os.environ.get('BUILDBOT_SLAVENAME'): |
| 58 timeout = timeout * 2 | 58 timeout = timeout * 2 |
| 59 self.timeout = timeout * self.tool.GetTimeoutScale() | 59 self.timeout = timeout * self.tool.GetTimeoutScale() |
| 60 | 60 |
| 61 logging.warning('Test suite: ' + test_suite) | 61 logging.warning('Test suite: ' + str(suite_name)) |
| 62 if os.path.splitext(test_suite)[1] == '.apk': | 62 if os.path.splitext(suite_name)[1] == '.apk': |
| 63 self.test_package = test_package_apk.TestPackageApk( | 63 self.test_package = test_package_apk.TestPackageApk( |
| 64 self.adb, | 64 self.adb, |
| 65 device, | 65 device, |
| 66 test_suite, | 66 suite_name, |
| 67 self.tool, | 67 self.tool, |
| 68 test_apk_package_name, | 68 test_apk_package_name, |
| 69 test_activity_name, | 69 test_activity_name, |
| 70 command_line_file) | 70 command_line_file) |
| 71 else: | 71 else: |
| 72 # Put a copy into the android out/target directory, to allow stack trace | 72 # Put a copy into the android out/target directory, to allow stack trace |
| 73 # generation. | 73 # generation. |
| 74 symbols_dir = os.path.join(constants.DIR_SOURCE_ROOT, 'out', build_type, | 74 symbols_dir = os.path.join(constants.DIR_SOURCE_ROOT, 'out', build_type, |
| 75 'lib.target') | 75 'lib.target') |
| 76 self.test_package = test_package_exe.TestPackageExecutable( | 76 self.test_package = test_package_exe.TestPackageExecutable( |
| 77 self.adb, | 77 self.adb, |
| 78 device, | 78 device, |
| 79 test_suite, | 79 suite_name, |
| 80 self.tool, | 80 self.tool, |
| 81 symbols_dir) | 81 symbols_dir) |
| 82 | 82 |
| 83 #override | 83 #override |
| 84 def InstallTestPackage(self): | 84 def InstallTestPackage(self): |
| 85 self.test_package.Install() | 85 self.test_package.Install() |
| 86 | 86 |
| 87 #override | 87 #override |
| 88 def PushDataDeps(self): | 88 def PushDataDeps(self): |
| 89 self.adb.WaitForSdCardReady(20) | 89 self.adb.WaitForSdCardReady(20) |
| 90 self.tool.CopyFiles() | 90 self.tool.CopyFiles() |
| 91 if self.test_package.test_suite_basename == 'webkit_unit_tests': | 91 if self.test_package.suite_basename == 'webkit_unit_tests': |
| 92 self.PushWebKitUnitTestsData() | 92 self.PushWebKitUnitTestsData() |
| 93 return | 93 return |
| 94 | 94 |
| 95 if os.path.exists(constants.ISOLATE_DEPS_DIR): | 95 if os.path.exists(constants.ISOLATE_DEPS_DIR): |
| 96 device_dir = self.adb.GetExternalStorage() | 96 device_dir = self.adb.GetExternalStorage() |
| 97 # TODO(frankf): linux_dumper_unittest_helper needs to be in the same dir | 97 # TODO(frankf): linux_dumper_unittest_helper needs to be in the same dir |
| 98 # as breakpad_unittests exe. Find a better way to do this. | 98 # as breakpad_unittests exe. Find a better way to do this. |
| 99 if self.test_package.test_suite_basename == 'breakpad_unittests': | 99 if self.test_package.suite_basename == 'breakpad_unittests': |
| 100 device_dir = constants.TEST_EXECUTABLE_DIR | 100 device_dir = constants.TEST_EXECUTABLE_DIR |
| 101 for p in os.listdir(constants.ISOLATE_DEPS_DIR): | 101 for p in os.listdir(constants.ISOLATE_DEPS_DIR): |
| 102 self.adb.PushIfNeeded( | 102 self.adb.PushIfNeeded( |
| 103 os.path.join(constants.ISOLATE_DEPS_DIR, p), | 103 os.path.join(constants.ISOLATE_DEPS_DIR, p), |
| 104 os.path.join(device_dir, p)) | 104 os.path.join(device_dir, p)) |
| 105 | 105 |
| 106 def PushWebKitUnitTestsData(self): | 106 def PushWebKitUnitTestsData(self): |
| 107 """Pushes the webkit_unit_tests data files to the device. | 107 """Pushes the webkit_unit_tests data files to the device. |
| 108 | 108 |
| 109 The path of this directory is different when the suite is being run as | 109 The path of this directory is different when the suite is being run as |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 test_results.AddResults( | 224 test_results.AddResults( |
| 225 [base_test_result.BaseTestResult(t, base_test_result.ResultType.UNKNOWN) | 225 [base_test_result.BaseTestResult(t, base_test_result.ResultType.UNKNOWN) |
| 226 for t in unknown_tests]) | 226 for t in unknown_tests]) |
| 227 retry = ':'.join([t.GetName() for t in test_results.GetNotPass()]) | 227 retry = ':'.join([t.GetName() for t in test_results.GetNotPass()]) |
| 228 return test_results, retry | 228 return test_results, retry |
| 229 | 229 |
| 230 #override | 230 #override |
| 231 def SetUp(self): | 231 def SetUp(self): |
| 232 """Sets up necessary test enviroment for the test suite.""" | 232 """Sets up necessary test enviroment for the test suite.""" |
| 233 super(TestRunner, self).SetUp() | 233 super(TestRunner, self).SetUp() |
| 234 if _TestSuiteRequiresMockTestServer(self.test_package.test_suite_basename): | 234 if _TestSuiteRequiresMockTestServer(self.test_package.suite_basename): |
| 235 self.LaunchChromeTestServerSpawner() | 235 self.LaunchChromeTestServerSpawner() |
| 236 self.tool.SetupEnvironment() | 236 self.tool.SetupEnvironment() |
| 237 | 237 |
| 238 #override | 238 #override |
| 239 def TearDown(self): | 239 def TearDown(self): |
| 240 """Cleans up the test enviroment for the test suite.""" | 240 """Cleans up the test enviroment for the test suite.""" |
| 241 self.tool.CleanUpEnvironment() | 241 self.tool.CleanUpEnvironment() |
| 242 super(TestRunner, self).TearDown() | 242 super(TestRunner, self).TearDown() |
| OLD | NEW |