Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(98)

Side by Side Diff: build/android/pylib/local/device/local_device_instrumentation_test_run.py

Issue 1414403002: Add CommandLineArgumentParameter and use it for WebView tests (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@fix-cr-526885-read-nested-annotations
Patch Set: Comments addressed Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698