| OLD | NEW |
| 1 # Copyright 2015 The Chromium Authors. All rights reserved. | 1 # Copyright 2015 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 re | 6 import re |
| 7 import time | 7 import time |
| 8 | 8 |
| 9 from devil.android import device_errors | 9 from devil.android import device_errors |
| 10 from pylib import flag_changer | 10 from pylib import flag_changer |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 logging.info('instrumentation data deps:') | 78 logging.info('instrumentation data deps:') |
| 79 for h, d in host_device_tuples: | 79 for h, d in host_device_tuples: |
| 80 logging.info('%r -> %r', h, d) | 80 logging.info('%r -> %r', h, d) |
| 81 dev.PushChangedFiles(host_device_tuples) | 81 dev.PushChangedFiles(host_device_tuples) |
| 82 if self._test_instance.flags: | 82 if self._test_instance.flags: |
| 83 if not self._test_instance.package_info: | 83 if not self._test_instance.package_info: |
| 84 logging.error("Couldn't set flags: no package info") | 84 logging.error("Couldn't set flags: no package info") |
| 85 elif not self._test_instance.package_info.cmdline_file: | 85 elif not self._test_instance.package_info.cmdline_file: |
| 86 logging.error("Couldn't set flags: no cmdline_file") | 86 logging.error("Couldn't set flags: no cmdline_file") |
| 87 else: | 87 else: |
| 88 self._flag_changers[str(dev)] = flag_changer.FlagChanger( | 88 self._CreateFlagChangerIfNeeded(dev) |
| 89 dev, self._test_instance.package_info.cmdline_file) | |
| 90 logging.debug('Attempting to set flags: %r', | 89 logging.debug('Attempting to set flags: %r', |
| 91 self._test_instance.flags) | 90 self._test_instance.flags) |
| 92 self._flag_changers[str(dev)].AddFlags(self._test_instance.flags) | 91 self._flag_changers[str(dev)].AddFlags(self._test_instance.flags) |
| 93 | 92 |
| 94 self._env.parallel_devices.pMap( | 93 self._env.parallel_devices.pMap( |
| 95 individual_device_set_up, | 94 individual_device_set_up, |
| 96 self._test_instance.GetDataDependencies()) | 95 self._test_instance.GetDataDependencies()) |
| 97 | 96 |
| 98 def TearDown(self): | 97 def TearDown(self): |
| 99 def individual_device_tear_down(dev): | 98 def individual_device_tear_down(dev): |
| 100 if str(dev) in self._flag_changers: | 99 if str(dev) in self._flag_changers: |
| 101 self._flag_changers[str(dev)].Restore() | 100 self._flag_changers[str(dev)].Restore() |
| 102 | 101 |
| 103 self._env.parallel_devices.pMap(individual_device_tear_down) | 102 self._env.parallel_devices.pMap(individual_device_tear_down) |
| 104 | 103 |
| 104 def _CreateFlagChangerIfNeeded(self, device): |
| 105 if not str(device) in self._flag_changers: |
| 106 self._flag_changers[str(device)] = flag_changer.FlagChanger( |
| 107 device, self._test_instance.package_info.cmdline_file) |
| 108 |
| 105 #override | 109 #override |
| 106 def _CreateShards(self, tests): | 110 def _CreateShards(self, tests): |
| 107 return tests | 111 return tests |
| 108 | 112 |
| 109 #override | 113 #override |
| 110 def _GetTests(self): | 114 def _GetTests(self): |
| 111 return self._test_instance.GetTests() | 115 return self._test_instance.GetTests() |
| 112 | 116 |
| 113 #override | 117 #override |
| 114 def _GetTestName(self, test): | 118 def _GetTestName(self, test): |
| 115 return '%s#%s' % (test['class'], test['method']) | 119 return '%s#%s' % (test['class'], test['method']) |
| 116 | 120 |
| 121 def _GetTestNameForDisplay(self, test): |
| 122 display_name = self._GetTestName(test) |
| 123 flags = test['flags'] |
| 124 if flags.add: |
| 125 display_name = '%s with {%s}' % (display_name, ' '.join(flags.add)) |
| 126 if flags.remove: |
| 127 display_name = '%s without {%s}' % (display_name, ' '.join(flags.remove)) |
| 128 return display_name |
| 129 |
| 117 #override | 130 #override |
| 118 def _RunTest(self, device, test): | 131 def _RunTest(self, device, test): |
| 119 extras = self._test_instance.GetHttpServerEnvironmentVars() | 132 extras = self._test_instance.GetHttpServerEnvironmentVars() |
| 120 | 133 |
| 134 flags = None |
| 121 if isinstance(test, list): | 135 if isinstance(test, list): |
| 122 if not self._test_instance.driver_apk: | 136 if not self._test_instance.driver_apk: |
| 123 raise Exception('driver_apk does not exist. ' | 137 raise Exception('driver_apk does not exist. ' |
| 124 'Please build it and try again.') | 138 'Please build it and try again.') |
| 125 | 139 |
| 126 def name_and_timeout(t): | 140 def name_and_timeout(t): |
| 127 n = self._GetTestName(t) | 141 n = self._GetTestName(t) |
| 128 i = self._GetTimeoutFromAnnotations(t['annotations'], n) | 142 i = self._GetTimeoutFromAnnotations(t['annotations'], n) |
| 129 return (n, i) | 143 return (n, i) |
| 130 | 144 |
| 131 test_names, timeouts = zip(*(name_and_timeout(t) for t in test)) | 145 test_names, timeouts = zip(*(name_and_timeout(t) for t in test)) |
| 132 | 146 |
| 133 test_name = ','.join(test_names) | 147 test_name = ','.join(test_names) |
| 148 test_display_name = test_name |
| 134 target = '%s/%s' % ( | 149 target = '%s/%s' % ( |
| 135 self._test_instance.driver_package, | 150 self._test_instance.driver_package, |
| 136 self._test_instance.driver_name) | 151 self._test_instance.driver_name) |
| 137 extras.update( | 152 extras.update( |
| 138 self._test_instance.GetDriverEnvironmentVars( | 153 self._test_instance.GetDriverEnvironmentVars( |
| 139 test_list=test_names)) | 154 test_list=test_names)) |
| 140 timeout = sum(timeouts) | 155 timeout = sum(timeouts) |
| 141 else: | 156 else: |
| 142 test_name = self._GetTestName(test) | 157 test_name = self._GetTestName(test) |
| 158 test_display_name = test_name |
| 143 target = '%s/%s' % ( | 159 target = '%s/%s' % ( |
| 144 self._test_instance.test_package, self._test_instance.test_runner) | 160 self._test_instance.test_package, self._test_instance.test_runner) |
| 145 extras['class'] = test_name | 161 extras['class'] = test_name |
| 146 timeout = self._GetTimeoutFromAnnotations(test['annotations'], test_name) | 162 if 'flags' in test: |
| 163 flags = test['flags'] |
| 164 test_display_name = self._GetTestNameForDisplay(test) |
| 165 timeout = self._GetTimeoutFromAnnotations( |
| 166 test['annotations'], test_display_name) |
| 147 | 167 |
| 148 logging.info('preparing to run %s: %s', test_name, test) | 168 logging.info('preparing to run %s: %s', test_display_name, test) |
| 149 | 169 |
| 150 time_ms = lambda: int(time.time() * 1e3) | 170 if flags: |
| 151 start_ms = time_ms() | 171 self._CreateFlagChangerIfNeeded(device) |
| 152 output = device.StartInstrumentation( | 172 self._flag_changers[str(device)].PushFlags( |
| 153 target, raw=True, extras=extras, timeout=timeout, retries=0) | 173 add=flags.add, remove=flags.remove) |
| 154 duration_ms = time_ms() - start_ms | 174 |
| 175 try: |
| 176 time_ms = lambda: int(time.time() * 1e3) |
| 177 start_ms = time_ms() |
| 178 output = device.StartInstrumentation( |
| 179 target, raw=True, extras=extras, timeout=timeout, retries=0) |
| 180 duration_ms = time_ms() - start_ms |
| 181 finally: |
| 182 if flags: |
| 183 self._flag_changers[str(device)].Restore() |
| 155 | 184 |
| 156 # TODO(jbudorick): Make instrumentation tests output a JSON so this | 185 # TODO(jbudorick): Make instrumentation tests output a JSON so this |
| 157 # doesn't have to parse the output. | 186 # doesn't have to parse the output. |
| 158 logging.debug('output from %s:', test_name) | 187 logging.debug('output from %s:', test_display_name) |
| 159 for l in output: | 188 for l in output: |
| 160 logging.debug(' %s', l) | 189 logging.debug(' %s', l) |
| 161 | 190 |
| 162 result_code, result_bundle, statuses = ( | 191 result_code, result_bundle, statuses = ( |
| 163 self._test_instance.ParseAmInstrumentRawOutput(output)) | 192 self._test_instance.ParseAmInstrumentRawOutput(output)) |
| 164 results = self._test_instance.GenerateTestResults( | 193 results = self._test_instance.GenerateTestResults( |
| 165 result_code, result_bundle, statuses, start_ms, duration_ms) | 194 result_code, result_bundle, statuses, start_ms, duration_ms) |
| 195 if flags: |
| 196 for r in results: |
| 197 if r.GetName() == test_name: |
| 198 r.SetName(test_display_name) |
| 166 if DidPackageCrashOnDevice(self._test_instance.test_package, device): | 199 if DidPackageCrashOnDevice(self._test_instance.test_package, device): |
| 167 for r in results: | 200 for r in results: |
| 168 if r.GetType() == base_test_result.ResultType.UNKNOWN: | 201 if r.GetType() == base_test_result.ResultType.UNKNOWN: |
| 169 r.SetType(base_test_result.ResultType.CRASH) | 202 r.SetType(base_test_result.ResultType.CRASH) |
| 170 # TODO(jbudorick): ClearApplicationState on failure before switching | 203 # TODO(jbudorick): ClearApplicationState on failure before switching |
| 171 # instrumentation tests to platform mode. | 204 # instrumentation tests to platform mode. |
| 172 return results | 205 return results |
| 173 | 206 |
| 174 #override | 207 #override |
| 175 def _ShouldShard(self): | 208 def _ShouldShard(self): |
| (...skipping 11 matching lines...) Expand all Loading... |
| 187 | 220 |
| 188 try: | 221 try: |
| 189 scale = int(annotations.get('TimeoutScale', 1)) | 222 scale = int(annotations.get('TimeoutScale', 1)) |
| 190 except ValueError as e: | 223 except ValueError as e: |
| 191 logging.warning("Non-integer value of TimeoutScale ignored. (%s)", str(e)) | 224 logging.warning("Non-integer value of TimeoutScale ignored. (%s)", str(e)) |
| 192 scale = 1 | 225 scale = 1 |
| 193 timeout *= scale | 226 timeout *= scale |
| 194 | 227 |
| 195 return timeout | 228 return timeout |
| 196 | 229 |
| OLD | NEW |