| 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 | 
|---|