Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 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 imp | 5 import imp |
| 6 import itertools | 6 import itertools |
| 7 import os | 7 import os |
| 8 import posixpath | 8 import posixpath |
| 9 | 9 |
| 10 from devil.android import device_errors | 10 from devil.android import device_errors |
| 11 from devil.android import device_temp_file | 11 from devil.android import device_temp_file |
| 12 from devil.android import ports | 12 from devil.android import ports |
| 13 from incremental_install import installer | 13 from incremental_install import installer |
| 14 from pylib import constants | 14 from pylib import constants |
| 15 from pylib.gtest import gtest_test_instance | 15 from pylib.gtest import gtest_test_instance |
| 16 from pylib.local import local_test_server_spawner | 16 from pylib.local import local_test_server_spawner |
| 17 from pylib.local.device import local_device_environment | 17 from pylib.local.device import local_device_environment |
| 18 from pylib.local.device import local_device_test_run | 18 from pylib.local.device import local_device_test_run |
| 19 | 19 |
| 20 _COMMAND_LINE_FLAGS_SUPPORTED = True | 20 _COMMAND_LINE_FLAGS_SUPPORTED = True |
| 21 | 21 |
| 22 _MAX_INLINE_FLAGS_LENGTH = 50 # Arbitrarily chosen. | |
| 22 _EXTRA_COMMAND_LINE_FILE = ( | 23 _EXTRA_COMMAND_LINE_FILE = ( |
| 23 'org.chromium.native_test.NativeTestActivity.CommandLineFile') | 24 'org.chromium.native_test.NativeTestActivity.CommandLineFile') |
| 24 _EXTRA_COMMAND_LINE_FLAGS = ( | 25 _EXTRA_COMMAND_LINE_FLAGS = ( |
| 25 'org.chromium.native_test.NativeTestActivity.CommandLineFlags') | 26 'org.chromium.native_test.NativeTestActivity.CommandLineFlags') |
| 26 _EXTRA_TEST_LIST = ( | 27 _EXTRA_TEST_LIST = ( |
| 27 'org.chromium.native_test.NativeTestInstrumentationTestRunner' | 28 'org.chromium.native_test.NativeTestInstrumentationTestRunner' |
| 28 '.TestList') | 29 '.TestList') |
| 30 _EXTRA_TEST = ( | |
| 31 'org.chromium.native_test.NativeTestInstrumentationTestRunner' | |
| 32 '.Test') | |
| 29 | 33 |
| 30 _MAX_SHARD_SIZE = 256 | 34 _MAX_SHARD_SIZE = 256 |
| 31 _SECONDS_TO_NANOS = int(1e9) | 35 _SECONDS_TO_NANOS = int(1e9) |
| 32 | 36 |
| 33 # The amount of time a test executable may run before it gets killed. | 37 # The amount of time a test executable may run before it gets killed. |
| 34 _TEST_TIMEOUT_SECONDS = 30*60 | 38 _TEST_TIMEOUT_SECONDS = 30*60 |
| 35 | 39 |
| 36 # TODO(jbudorick): Move this up to the test instance if the net test server is | 40 # TODO(jbudorick): Move this up to the test instance if the net test server is |
| 37 # handled outside of the APK for the remote_device environment. | 41 # handled outside of the APK for the remote_device environment. |
| 38 _SUITE_REQUIRES_TEST_SERVER_SPAWNER = [ | 42 _SUITE_REQUIRES_TEST_SERVER_SPAWNER = [ |
| 39 'components_browsertests', 'content_unittests', 'content_browsertests', | 43 'components_browsertests', 'content_unittests', 'content_browsertests', |
| 40 'net_unittests', 'unit_tests' | 44 'net_unittests', 'unit_tests' |
| 41 ] | 45 ] |
| 42 | 46 |
| 47 # No-op context manager. If we used Python 3, we could change this to | |
| 48 # contextlib.ExitStack() | |
| 49 class _NullContextManager(object): | |
|
jbudorick
2015/10/20 21:17:29
I may wind up extracting this at some point should
| |
| 50 def __enter__(self): | |
| 51 pass | |
| 52 def __exit__(self, *args): | |
| 53 pass | |
| 54 | |
| 55 | |
| 43 # TODO(jbudorick): Move this inside _ApkDelegate once TestPackageApk is gone. | 56 # TODO(jbudorick): Move this inside _ApkDelegate once TestPackageApk is gone. |
| 44 def PullAppFilesImpl(device, package, files, directory): | 57 def PullAppFilesImpl(device, package, files, directory): |
| 45 device_dir = device.GetApplicationDataDirectory(package) | 58 device_dir = device.GetApplicationDataDirectory(package) |
| 46 host_dir = os.path.join(directory, str(device)) | 59 host_dir = os.path.join(directory, str(device)) |
| 47 for f in files: | 60 for f in files: |
| 48 device_file = posixpath.join(device_dir, f) | 61 device_file = posixpath.join(device_dir, f) |
| 49 host_file = os.path.join(host_dir, *f.split(posixpath.sep)) | 62 host_file = os.path.join(host_dir, *f.split(posixpath.sep)) |
| 50 host_file_base, ext = os.path.splitext(host_file) | 63 host_file_base, ext = os.path.splitext(host_file) |
| 51 for i in itertools.count(): | 64 for i in itertools.count(): |
| 52 host_file = '%s_%d%s' % (host_file_base, i, ext) | 65 host_file = '%s_%d%s' % (host_file_base, i, ext) |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 114 | 127 |
| 115 if ('timeout' in kwargs | 128 if ('timeout' in kwargs |
| 116 and gtest_test_instance.EXTRA_SHARD_NANO_TIMEOUT not in extras): | 129 and gtest_test_instance.EXTRA_SHARD_NANO_TIMEOUT not in extras): |
| 117 # Make sure the instrumentation doesn't kill the test before the | 130 # Make sure the instrumentation doesn't kill the test before the |
| 118 # scripts do. The provided timeout value is in seconds, but the | 131 # scripts do. The provided timeout value is in seconds, but the |
| 119 # instrumentation deals with nanoseconds because that's how Android | 132 # instrumentation deals with nanoseconds because that's how Android |
| 120 # handles time. | 133 # handles time. |
| 121 extras[gtest_test_instance.EXTRA_SHARD_NANO_TIMEOUT] = int( | 134 extras[gtest_test_instance.EXTRA_SHARD_NANO_TIMEOUT] = int( |
| 122 kwargs['timeout'] * _SECONDS_TO_NANOS) | 135 kwargs['timeout'] * _SECONDS_TO_NANOS) |
| 123 | 136 |
| 124 with device_temp_file.DeviceTempFile(device.adb) as command_line_file: | 137 command_line_file = _NullContextManager() |
|
jbudorick
2015/10/20 21:17:29
hm, not quite what I had in mind but this is fine
| |
| 125 device.WriteFile(command_line_file.name, '_ %s' % flags if flags else '_') | 138 if flags: |
| 126 extras[_EXTRA_COMMAND_LINE_FILE] = command_line_file.name | 139 if len(flags) > _MAX_INLINE_FLAGS_LENGTH: |
| 140 command_line_file = device_temp_file.DeviceTempFile(device.adb) | |
| 141 device.WriteFile(command_line_file.name, '_ %s' % flags) | |
| 142 extras[_EXTRA_COMMAND_LINE_FILE] = command_line_file.name | |
| 143 else: | |
| 144 extras[_EXTRA_COMMAND_LINE_FLAGS] = flags | |
| 127 | 145 |
| 128 with device_temp_file.DeviceTempFile(device.adb) as test_list_file: | 146 test_list_file = _NullContextManager() |
| 129 if test: | 147 if test: |
| 130 device.WriteFile(test_list_file.name, '\n'.join(test)) | 148 if len(test) > 1: |
| 131 extras[_EXTRA_TEST_LIST] = test_list_file.name | 149 test_list_file = device_temp_file.DeviceTempFile(device.adb) |
| 150 device.WriteFile(test_list_file.name, '\n'.join(test)) | |
| 151 extras[_EXTRA_TEST_LIST] = test_list_file.name | |
| 152 else: | |
| 153 extras[_EXTRA_TEST] = test[0] | |
| 132 | 154 |
| 133 try: | 155 with command_line_file, test_list_file: |
| 134 return device.StartInstrumentation( | 156 try: |
| 135 self._component, extras=extras, raw=False, **kwargs) | 157 return device.StartInstrumentation( |
| 136 except Exception: | 158 self._component, extras=extras, raw=False, **kwargs) |
| 137 device.ForceStop(self._package) | 159 except Exception: |
| 138 raise | 160 device.ForceStop(self._package) |
| 161 raise | |
| 139 | 162 |
| 140 def PullAppFiles(self, device, files, directory): | 163 def PullAppFiles(self, device, files, directory): |
| 141 PullAppFilesImpl(device, self._package, files, directory) | 164 PullAppFilesImpl(device, self._package, files, directory) |
| 142 | 165 |
| 143 def Clear(self, device): | 166 def Clear(self, device): |
| 144 device.ClearApplicationState(self._package, permissions=self._permissions) | 167 device.ClearApplicationState(self._package, permissions=self._permissions) |
| 145 | 168 |
| 146 | 169 |
| 147 class _ExeDelegate(object): | 170 class _ExeDelegate(object): |
| 148 def __init__(self, tr, exe): | 171 def __init__(self, tr, exe): |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 317 def TearDown(self): | 340 def TearDown(self): |
| 318 @local_device_test_run.handle_shard_failures | 341 @local_device_test_run.handle_shard_failures |
| 319 def individual_device_tear_down(dev): | 342 def individual_device_tear_down(dev): |
| 320 for s in self._servers.get(str(dev), []): | 343 for s in self._servers.get(str(dev), []): |
| 321 s.TearDown() | 344 s.TearDown() |
| 322 | 345 |
| 323 tool = self.GetTool(dev) | 346 tool = self.GetTool(dev) |
| 324 tool.CleanUpEnvironment() | 347 tool.CleanUpEnvironment() |
| 325 | 348 |
| 326 self._env.parallel_devices.pMap(individual_device_tear_down) | 349 self._env.parallel_devices.pMap(individual_device_tear_down) |
| OLD | NEW |