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 itertools | 5 import itertools |
6 import logging | |
7 import os | 6 import os |
8 import posixpath | 7 import posixpath |
9 | 8 |
10 from devil.android import device_errors | 9 from devil.android import device_errors |
11 from devil.android import device_temp_file | 10 from devil.android import device_temp_file |
12 from devil.android import ports | 11 from devil.android import ports |
13 from pylib import constants | 12 from pylib import constants |
14 from pylib.gtest import gtest_test_instance | 13 from pylib.gtest import gtest_test_instance |
15 from pylib.local import local_test_server_spawner | 14 from pylib.local import local_test_server_spawner |
16 from pylib.local.device import local_device_environment | 15 from pylib.local.device import local_device_environment |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 | 100 |
102 def Install(self, device): | 101 def Install(self, device): |
103 # TODO(jbudorick): Look into merging this with normal data deps pushing if | 102 # TODO(jbudorick): Look into merging this with normal data deps pushing if |
104 # executables become supported on nonlocal environments. | 103 # executables become supported on nonlocal environments. |
105 host_device_tuples = [(self._exe_host_path, self._exe_device_path)] | 104 host_device_tuples = [(self._exe_host_path, self._exe_device_path)] |
106 if self._deps_host_path: | 105 if self._deps_host_path: |
107 host_device_tuples.append((self._deps_host_path, self._deps_device_path)) | 106 host_device_tuples.append((self._deps_host_path, self._deps_device_path)) |
108 device.PushChangedFiles(host_device_tuples) | 107 device.PushChangedFiles(host_device_tuples) |
109 | 108 |
110 def Run(self, test, device, flags=None, **kwargs): | 109 def Run(self, test, device, flags=None, **kwargs): |
111 cmd = [ | 110 tool = self._test_run.GetTool(device).GetTestWrapper() |
112 self._test_run.GetTool(device).GetTestWrapper(), | 111 if tool: |
113 self._exe_device_path, | 112 cmd = [tool] |
114 ] | 113 else: |
| 114 cmd = [] |
| 115 cmd.append(self._exe_device_path) |
| 116 |
115 if test: | 117 if test: |
116 cmd.append('--gtest_filter=%s' % ':'.join(test)) | 118 cmd.append('--gtest_filter=%s' % ':'.join(test)) |
117 if flags: | 119 if flags: |
118 cmd.append(flags) | 120 cmd.append(flags) |
119 cwd = constants.TEST_EXECUTABLE_DIR | 121 cwd = constants.TEST_EXECUTABLE_DIR |
120 | 122 |
121 env = { | 123 env = { |
122 'LD_LIBRARY_PATH': | 124 'LD_LIBRARY_PATH': |
123 '%s/%s_deps' % (constants.TEST_EXECUTABLE_DIR, self._exe_file_name), | 125 '%s/%s_deps' % (constants.TEST_EXECUTABLE_DIR, self._exe_file_name), |
124 } | 126 } |
125 try: | 127 try: |
126 gcov_strip_depth = os.environ['NATIVE_COVERAGE_DEPTH_STRIP'] | 128 gcov_strip_depth = os.environ['NATIVE_COVERAGE_DEPTH_STRIP'] |
127 external = device.GetExternalStoragePath() | 129 external = device.GetExternalStoragePath() |
128 env['GCOV_PREFIX'] = '%s/gcov' % external | 130 env['GCOV_PREFIX'] = '%s/gcov' % external |
129 env['GCOV_PREFIX_STRIP'] = gcov_strip_depth | 131 env['GCOV_PREFIX_STRIP'] = gcov_strip_depth |
130 except (device_errors.CommandFailedError, KeyError): | 132 except (device_errors.CommandFailedError, KeyError): |
131 pass | 133 pass |
132 | 134 |
133 # TODO(jbudorick): Switch to just RunShellCommand once perezju@'s CL | 135 output = device.RunShellCommand( |
134 # for long shell commands lands. | 136 cmd, cwd=cwd, env=env, check_return=True, large_output=True, **kwargs) |
135 with device_temp_file.DeviceTempFile(device.adb) as script_file: | |
136 script_contents = ' '.join(cmd) | |
137 logging.info('script contents: %r', script_contents) | |
138 device.WriteFile(script_file.name, script_contents) | |
139 output = device.RunShellCommand(['sh', script_file.name], cwd=cwd, | |
140 env=env, **kwargs) | |
141 return output | 137 return output |
142 | 138 |
143 def PullAppFiles(self, device, files, directory): | 139 def PullAppFiles(self, device, files, directory): |
144 pass | 140 pass |
145 | 141 |
146 def Clear(self, device): | 142 def Clear(self, device): |
147 device.KillAll(self._exe_file_name, blocking=True, timeout=30, quiet=True) | 143 device.KillAll(self._exe_file_name, blocking=True, timeout=30, quiet=True) |
148 | 144 |
149 | 145 |
150 class LocalDeviceGtestRun(local_device_test_run.LocalDeviceTestRun): | 146 class LocalDeviceGtestRun(local_device_test_run.LocalDeviceTestRun): |
(...skipping 10 matching lines...) Expand all Loading... |
161 | 157 |
162 self._servers = {} | 158 self._servers = {} |
163 | 159 |
164 #override | 160 #override |
165 def TestPackage(self): | 161 def TestPackage(self): |
166 return self._test_instance.suite | 162 return self._test_instance.suite |
167 | 163 |
168 #override | 164 #override |
169 def SetUp(self): | 165 def SetUp(self): |
170 | 166 |
| 167 @local_device_test_run.handle_shard_failures |
171 def individual_device_set_up(dev, host_device_tuples): | 168 def individual_device_set_up(dev, host_device_tuples): |
172 # Install test APK. | 169 # Install test APK. |
173 self._delegate.Install(dev) | 170 self._delegate.Install(dev) |
174 | 171 |
175 # Push data dependencies. | 172 # Push data dependencies. |
176 external_storage = dev.GetExternalStoragePath() | 173 external_storage = dev.GetExternalStoragePath() |
177 host_device_tuples = [ | 174 host_device_tuples = [ |
178 (h, d if d is not None else external_storage) | 175 (h, d if d is not None else external_storage) |
179 for h, d in host_device_tuples] | 176 for h, d in host_device_tuples] |
180 dev.PushChangedFiles(host_device_tuples) | 177 dev.PushChangedFiles(host_device_tuples) |
(...skipping 19 matching lines...) Expand all Loading... |
200 device_count = len(self._env.devices) | 197 device_count = len(self._env.devices) |
201 shards = [] | 198 shards = [] |
202 for i in xrange(0, device_count): | 199 for i in xrange(0, device_count): |
203 unbounded_shard = tests[i::device_count] | 200 unbounded_shard = tests[i::device_count] |
204 shards += [unbounded_shard[j:j+_MAX_SHARD_SIZE] | 201 shards += [unbounded_shard[j:j+_MAX_SHARD_SIZE] |
205 for j in xrange(0, len(unbounded_shard), _MAX_SHARD_SIZE)] | 202 for j in xrange(0, len(unbounded_shard), _MAX_SHARD_SIZE)] |
206 return shards | 203 return shards |
207 | 204 |
208 #override | 205 #override |
209 def _GetTests(self): | 206 def _GetTests(self): |
210 tests = self._delegate.Run( | 207 @local_device_test_run.handle_shard_failures |
211 None, self._env.devices[0], flags='--gtest_list_tests') | 208 def list_tests(dev): |
212 tests = gtest_test_instance.ParseGTestListTests(tests) | 209 tests = self._delegate.Run( |
213 tests = self._test_instance.FilterTests(tests) | 210 None, dev, flags='--gtest_list_tests', timeout=10) |
| 211 tests = gtest_test_instance.ParseGTestListTests(tests) |
| 212 tests = self._test_instance.FilterTests(tests) |
| 213 return tests |
| 214 |
| 215 test_lists = self._env.parallel_devices.pMap(list_tests).pGet(None) |
| 216 tests = list(sorted(set().union(*[set(tl) for tl in test_lists if tl]))) |
214 return tests | 217 return tests |
215 | 218 |
216 #override | 219 #override |
217 def _RunTest(self, device, test): | 220 def _RunTest(self, device, test): |
218 # Run the test. | 221 # Run the test. |
219 timeout = 900 * self.GetTool(device).GetTimeoutScale() | 222 timeout = 900 * self.GetTool(device).GetTimeoutScale() |
220 output = self._delegate.Run( | 223 output = self._delegate.Run( |
221 test, device, timeout=timeout, retries=0) | 224 test, device, timeout=timeout, retries=0) |
222 for s in self._servers[str(device)]: | 225 for s in self._servers[str(device)]: |
223 s.Reset() | 226 s.Reset() |
224 if self._test_instance.app_files: | 227 if self._test_instance.app_files: |
225 self._delegate.PullAppFiles(device, self._test_instance.app_files, | 228 self._delegate.PullAppFiles(device, self._test_instance.app_files, |
226 self._test_instance.app_file_dir) | 229 self._test_instance.app_file_dir) |
227 self._delegate.Clear(device) | 230 self._delegate.Clear(device) |
228 | 231 |
229 # Parse the output. | 232 # Parse the output. |
230 # TODO(jbudorick): Transition test scripts away from parsing stdout. | 233 # TODO(jbudorick): Transition test scripts away from parsing stdout. |
231 results = self._test_instance.ParseGTestOutput(output) | 234 results = self._test_instance.ParseGTestOutput(output) |
232 return results | 235 return results |
233 | 236 |
234 #override | 237 #override |
235 def TearDown(self): | 238 def TearDown(self): |
| 239 @local_device_test_run.handle_shard_failures |
236 def individual_device_tear_down(dev): | 240 def individual_device_tear_down(dev): |
237 for s in self._servers[str(dev)]: | 241 for s in self._servers[str(dev)]: |
238 s.TearDown() | 242 s.TearDown() |
239 | 243 |
240 self._env.parallel_devices.pMap(individual_device_tear_down) | 244 self._env.parallel_devices.pMap(individual_device_tear_down) |
241 | 245 |
OLD | NEW |