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 os | 6 import os |
7 import pickle | 7 import pickle |
8 import re | 8 import re |
9 import sys | 9 import sys |
10 | 10 |
(...skipping 12 matching lines...) Expand all Loading... |
23 os.path.join(constants.DIR_SOURCE_ROOT, 'build', 'util', 'lib', 'common')) | 23 os.path.join(constants.DIR_SOURCE_ROOT, 'build', 'util', 'lib', 'common')) |
24 import unittest_util | 24 import unittest_util |
25 | 25 |
26 # Ref: http://developer.android.com/reference/android/app/Activity.html | 26 # Ref: http://developer.android.com/reference/android/app/Activity.html |
27 _ACTIVITY_RESULT_CANCELED = 0 | 27 _ACTIVITY_RESULT_CANCELED = 0 |
28 _ACTIVITY_RESULT_OK = -1 | 28 _ACTIVITY_RESULT_OK = -1 |
29 | 29 |
30 _DEFAULT_ANNOTATIONS = [ | 30 _DEFAULT_ANNOTATIONS = [ |
31 'Smoke', 'SmallTest', 'MediumTest', 'LargeTest', | 31 'Smoke', 'SmallTest', 'MediumTest', 'LargeTest', |
32 'EnormousTest', 'IntegrationTest'] | 32 'EnormousTest', 'IntegrationTest'] |
| 33 _EXTRA_ENABLE_HTTP_SERVER = ( |
| 34 'org.chromium.chrome.test.ChromeInstrumentationTestRunner.' |
| 35 + 'EnableTestHttpServer') |
| 36 _EXTRA_DRIVER_TEST_LIST = ( |
| 37 'org.chromium.test.driver.OnDeviceInstrumentationDriver.TestList') |
| 38 _EXTRA_DRIVER_TEST_LIST_FILE = ( |
| 39 'org.chromium.test.driver.OnDeviceInstrumentationDriver.TestListFile') |
| 40 _EXTRA_DRIVER_TARGET_PACKAGE = ( |
| 41 'org.chromium.test.driver.OnDeviceInstrumentationDriver.TargetPackage') |
| 42 _EXTRA_DRIVER_TARGET_CLASS = ( |
| 43 'org.chromium.test.driver.OnDeviceInstrumentationDriver.TargetClass') |
33 _NATIVE_CRASH_RE = re.compile('native crash', re.IGNORECASE) | 44 _NATIVE_CRASH_RE = re.compile('native crash', re.IGNORECASE) |
34 _PICKLE_FORMAT_VERSION = 10 | 45 _PICKLE_FORMAT_VERSION = 10 |
35 | 46 |
36 | 47 |
37 # TODO(jbudorick): Make these private class methods of | 48 # TODO(jbudorick): Make these private class methods of |
38 # InstrumentationTestInstance once the instrumentation test_runner is | 49 # InstrumentationTestInstance once the instrumentation test_runner is |
39 # deprecated. | 50 # deprecated. |
40 def ParseAmInstrumentRawOutput(raw_output): | 51 def ParseAmInstrumentRawOutput(raw_output): |
41 """Parses the output of an |am instrument -r| call. | 52 """Parses the output of an |am instrument -r| call. |
42 | 53 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 return results | 134 return results |
124 | 135 |
125 | 136 |
126 class InstrumentationTestInstance(test_instance.TestInstance): | 137 class InstrumentationTestInstance(test_instance.TestInstance): |
127 | 138 |
128 def __init__(self, args, isolate_delegate, error_func): | 139 def __init__(self, args, isolate_delegate, error_func): |
129 super(InstrumentationTestInstance, self).__init__() | 140 super(InstrumentationTestInstance, self).__init__() |
130 | 141 |
131 self._apk_under_test = None | 142 self._apk_under_test = None |
132 self._package_info = None | 143 self._package_info = None |
| 144 self._suite = None |
133 self._test_apk = None | 145 self._test_apk = None |
134 self._test_jar = None | 146 self._test_jar = None |
135 self._test_package = None | 147 self._test_package = None |
136 self._test_runner = None | 148 self._test_runner = None |
137 self._test_support_apk = None | 149 self._test_support_apk = None |
138 self.__initializeApkAttributes(args, error_func) | 150 self._initializeApkAttributes(args, error_func) |
139 | 151 |
140 self._data_deps = None | 152 self._data_deps = None |
141 self._isolate_abs_path = None | 153 self._isolate_abs_path = None |
142 self._isolate_delegate = None | 154 self._isolate_delegate = None |
143 self._isolated_abs_path = None | 155 self._isolated_abs_path = None |
144 self._test_data = None | 156 self._test_data = None |
145 self.__initializeDataDependencyAttributes(args, isolate_delegate) | 157 self._initializeDataDependencyAttributes(args, isolate_delegate) |
146 | 158 |
147 self._annotations = None | 159 self._annotations = None |
148 self._excluded_annotations = None | 160 self._excluded_annotations = None |
149 self._test_filter = None | 161 self._test_filter = None |
150 self.__initializeTestFilterAttributes(args) | 162 self._initializeTestFilterAttributes(args) |
151 | 163 |
152 self._flags = None | 164 self._flags = None |
153 self.__initializeFlagAttributes(args) | 165 self._initializeFlagAttributes(args) |
154 | 166 |
155 def __initializeApkAttributes(self, args, error_func): | 167 self._driver_apk = None |
| 168 self._driver_package = None |
| 169 self._driver_name = None |
| 170 self._initializeDriverAttributes() |
| 171 |
| 172 def _initializeApkAttributes(self, args, error_func): |
156 if args.apk_under_test.endswith('.apk'): | 173 if args.apk_under_test.endswith('.apk'): |
157 self._apk_under_test = args.apk_under_test | 174 self._apk_under_test = args.apk_under_test |
158 else: | 175 else: |
159 self._apk_under_test = os.path.join( | 176 self._apk_under_test = os.path.join( |
160 constants.GetOutDirectory(), constants.SDK_BUILD_APKS_DIR, | 177 constants.GetOutDirectory(), constants.SDK_BUILD_APKS_DIR, |
161 '%s.apk' % args.apk_under_test) | 178 '%s.apk' % args.apk_under_test) |
162 | 179 |
163 if not os.path.exists(self._apk_under_test): | 180 if not os.path.exists(self._apk_under_test): |
164 error_func('Unable to find APK under test: %s' % self._apk_under_test) | 181 error_func('Unable to find APK under test: %s' % self._apk_under_test) |
165 | 182 |
166 if args.test_apk.endswith('.apk'): | 183 if args.test_apk.endswith('.apk'): |
167 test_apk_root = os.path.splitext(os.path.basename(args.test_apk))[0] | 184 self._suite = os.path.splitext(os.path.basename(args.test_apk))[0] |
168 self._test_apk = args.test_apk | 185 self._test_apk = args.test_apk |
169 else: | 186 else: |
170 test_apk_root = args.test_apk | 187 self._suite = args.test_apk |
171 self._test_apk = os.path.join( | 188 self._test_apk = os.path.join( |
172 constants.GetOutDirectory(), constants.SDK_BUILD_APKS_DIR, | 189 constants.GetOutDirectory(), constants.SDK_BUILD_APKS_DIR, |
173 '%s.apk' % args.test_apk) | 190 '%s.apk' % args.test_apk) |
174 | 191 |
175 self._test_jar = os.path.join( | 192 self._test_jar = os.path.join( |
176 constants.GetOutDirectory(), constants.SDK_BUILD_TEST_JAVALIB_DIR, | 193 constants.GetOutDirectory(), constants.SDK_BUILD_TEST_JAVALIB_DIR, |
177 '%s.jar' % test_apk_root) | 194 '%s.jar' % self._suite) |
178 self._test_support_apk = os.path.join( | 195 self._test_support_apk = os.path.join( |
179 constants.GetOutDirectory(), constants.SDK_BUILD_TEST_JAVALIB_DIR, | 196 constants.GetOutDirectory(), constants.SDK_BUILD_TEST_JAVALIB_DIR, |
180 '%sSupport.apk' % test_apk_root) | 197 '%sSupport.apk' % self._suite) |
181 | 198 |
182 if not os.path.exists(self._test_apk): | 199 if not os.path.exists(self._test_apk): |
183 error_func('Unable to find test APK: %s' % self._test_apk) | 200 error_func('Unable to find test APK: %s' % self._test_apk) |
184 if not os.path.exists(self._test_jar): | 201 if not os.path.exists(self._test_jar): |
185 error_func('Unable to find test JAR: %s' % self._test_jar) | 202 error_func('Unable to find test JAR: %s' % self._test_jar) |
186 | 203 |
187 self._test_package = apk_helper.GetPackageName(self.test_apk) | 204 self._test_package = apk_helper.GetPackageName(self.test_apk) |
188 self._test_runner = apk_helper.GetInstrumentationName(self.test_apk) | 205 self._test_runner = apk_helper.GetInstrumentationName(self.test_apk) |
189 | 206 |
190 self._package_info = None | 207 self._package_info = None |
191 for package_info in constants.PACKAGE_INFO.itervalues(): | 208 for package_info in constants.PACKAGE_INFO.itervalues(): |
192 if self._test_package == package_info.test_package: | 209 if self._test_package == package_info.test_package: |
193 self._package_info = package_info | 210 self._package_info = package_info |
194 if not self._package_info: | 211 if not self._package_info: |
195 logging.warning('Unable to find package info for %s', self._test_package) | 212 logging.warning('Unable to find package info for %s', self._test_package) |
196 | 213 |
197 def __initializeDataDependencyAttributes(self, args, isolate_delegate): | 214 def _initializeDataDependencyAttributes(self, args, isolate_delegate): |
198 self._data_deps = [] | 215 self._data_deps = [] |
199 if args.isolate_file_path: | 216 if args.isolate_file_path: |
200 self._isolate_abs_path = os.path.abspath(args.isolate_file_path) | 217 self._isolate_abs_path = os.path.abspath(args.isolate_file_path) |
201 self._isolate_delegate = isolate_delegate | 218 self._isolate_delegate = isolate_delegate |
202 self._isolated_abs_path = os.path.join( | 219 self._isolated_abs_path = os.path.join( |
203 constants.GetOutDirectory(), '%s.isolated' % self._test_package) | 220 constants.GetOutDirectory(), '%s.isolated' % self._test_package) |
204 else: | 221 else: |
205 self._isolate_delegate = None | 222 self._isolate_delegate = None |
206 | 223 |
207 # TODO(jbudorick): Deprecate and remove --test-data once data dependencies | 224 # TODO(jbudorick): Deprecate and remove --test-data once data dependencies |
208 # are fully converted to isolate. | 225 # are fully converted to isolate. |
209 if args.test_data: | 226 if args.test_data: |
210 logging.info('Data dependencies specified via --test-data') | 227 logging.info('Data dependencies specified via --test-data') |
211 self._test_data = args.test_data | 228 self._test_data = args.test_data |
212 else: | 229 else: |
213 self._test_data = None | 230 self._test_data = None |
214 | 231 |
215 if not self._isolate_delegate and not self._test_data: | 232 if not self._isolate_delegate and not self._test_data: |
216 logging.warning('No data dependencies will be pushed.') | 233 logging.warning('No data dependencies will be pushed.') |
217 | 234 |
218 def __initializeTestFilterAttributes(self, args): | 235 def _initializeTestFilterAttributes(self, args): |
219 self._test_filter = args.test_filter | 236 self._test_filter = args.test_filter |
220 | 237 |
221 def annotation_dict_element(a): | 238 def annotation_dict_element(a): |
222 a = a.split('=') | 239 a = a.split('=') |
223 return (a[0], a[1] if len(a) == 2 else None) | 240 return (a[0], a[1] if len(a) == 2 else None) |
224 | 241 |
225 if args.annotation_str: | 242 if args.annotation_str: |
226 self._annotations = dict( | 243 self._annotations = dict( |
227 annotation_dict_element(a) | 244 annotation_dict_element(a) |
228 for a in args.annotation_str.split(',')) | 245 for a in args.annotation_str.split(',')) |
229 elif not self._test_filter: | 246 elif not self._test_filter: |
230 self._annotations = dict( | 247 self._annotations = dict( |
231 annotation_dict_element(a) | 248 annotation_dict_element(a) |
232 for a in _DEFAULT_ANNOTATIONS) | 249 for a in _DEFAULT_ANNOTATIONS) |
233 else: | 250 else: |
234 self._annotations = {} | 251 self._annotations = {} |
235 | 252 |
236 if args.exclude_annotation_str: | 253 if args.exclude_annotation_str: |
237 self._excluded_annotations = dict( | 254 self._excluded_annotations = dict( |
238 annotation_dict_element(a) | 255 annotation_dict_element(a) |
239 for a in args.exclude_annotation_str.split(',')) | 256 for a in args.exclude_annotation_str.split(',')) |
240 else: | 257 else: |
241 self._excluded_annotations = {} | 258 self._excluded_annotations = {} |
242 | 259 |
243 def __initializeFlagAttributes(self, args): | 260 def _initializeFlagAttributes(self, args): |
244 self._flags = ['--disable-fre', '--enable-test-intents'] | 261 self._flags = ['--disable-fre', '--enable-test-intents'] |
245 # TODO(jbudorick): Transition "--device-flags" to "--device-flags-file" | 262 # TODO(jbudorick): Transition "--device-flags" to "--device-flags-file" |
246 if hasattr(args, 'device_flags') and args.device_flags: | 263 if hasattr(args, 'device_flags') and args.device_flags: |
247 with open(args.device_flags) as device_flags_file: | 264 with open(args.device_flags) as device_flags_file: |
248 stripped_lines = (l.strip() for l in device_flags_file) | 265 stripped_lines = (l.strip() for l in device_flags_file) |
249 self._flags.extend([flag for flag in stripped_lines if flag]) | 266 self._flags.extend([flag for flag in stripped_lines if flag]) |
250 if hasattr(args, 'device_flags_file') and args.device_flags_file: | 267 if hasattr(args, 'device_flags_file') and args.device_flags_file: |
251 with open(args.device_flags_file) as device_flags_file: | 268 with open(args.device_flags_file) as device_flags_file: |
252 stripped_lines = (l.strip() for l in device_flags_file) | 269 stripped_lines = (l.strip() for l in device_flags_file) |
253 self._flags.extend([flag for flag in stripped_lines if flag]) | 270 self._flags.extend([flag for flag in stripped_lines if flag]) |
254 | 271 |
255 @property | 272 def _initializeDriverAttributes(self): |
256 def suite(self): | 273 self._driver_apk = os.path.join( |
257 return 'instrumentation' | 274 constants.GetOutDirectory(), constants.SDK_BUILD_APKS_DIR, |
| 275 'OnDeviceInstrumentationDriver.apk') |
| 276 if os.path.exists(self._driver_apk): |
| 277 self._driver_package = apk_helper.GetPackageName( |
| 278 self._driver_apk) |
| 279 self._driver_name = apk_helper.GetInstrumentationName( |
| 280 self._driver_apk) |
| 281 else: |
| 282 self._driver_apk = None |
258 | 283 |
259 @property | 284 @property |
260 def apk_under_test(self): | 285 def apk_under_test(self): |
261 return self._apk_under_test | 286 return self._apk_under_test |
262 | 287 |
263 @property | 288 @property |
264 def flags(self): | 289 def flags(self): |
265 return self._flags | 290 return self._flags |
266 | 291 |
267 @property | 292 @property |
| 293 def driver_apk(self): |
| 294 return self._driver_apk |
| 295 |
| 296 @property |
| 297 def driver_package(self): |
| 298 return self._driver_package |
| 299 |
| 300 @property |
| 301 def driver_name(self): |
| 302 return self._driver_name |
| 303 |
| 304 @property |
268 def package_info(self): | 305 def package_info(self): |
269 return self._package_info | 306 return self._package_info |
270 | 307 |
271 @property | 308 @property |
| 309 def suite(self): |
| 310 return self._suite |
| 311 |
| 312 @property |
272 def test_apk(self): | 313 def test_apk(self): |
273 return self._test_apk | 314 return self._test_apk |
274 | 315 |
275 @property | 316 @property |
276 def test_jar(self): | 317 def test_jar(self): |
277 return self._test_jar | 318 return self._test_jar |
278 | 319 |
279 @property | 320 @property |
280 def test_support_apk(self): | 321 def test_support_apk(self): |
281 return self._test_support_apk | 322 return self._test_support_apk |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
439 a = dict(c['annotations']) | 480 a = dict(c['annotations']) |
440 a.update(m['annotations']) | 481 a.update(m['annotations']) |
441 inflated_tests.append({ | 482 inflated_tests.append({ |
442 'class': c['class'], | 483 'class': c['class'], |
443 'method': m['method'], | 484 'method': m['method'], |
444 'annotations': a, | 485 'annotations': a, |
445 }) | 486 }) |
446 return inflated_tests | 487 return inflated_tests |
447 | 488 |
448 @staticmethod | 489 @staticmethod |
| 490 def GetHttpServerEnvironmentVars(): |
| 491 return { |
| 492 _EXTRA_ENABLE_HTTP_SERVER: None, |
| 493 } |
| 494 |
| 495 def GetDriverEnvironmentVars( |
| 496 self, test_list=None, test_list_file_path=None): |
| 497 env = { |
| 498 _EXTRA_DRIVER_TARGET_PACKAGE: self.test_package, |
| 499 _EXTRA_DRIVER_TARGET_CLASS: self.test_runner, |
| 500 } |
| 501 |
| 502 if test_list: |
| 503 env[_EXTRA_DRIVER_TEST_LIST] = ','.join(test_list) |
| 504 |
| 505 if test_list_file_path: |
| 506 env[_EXTRA_DRIVER_TEST_LIST_FILE] = ( |
| 507 os.path.basename(test_list_file_path)) |
| 508 |
| 509 return env |
| 510 |
| 511 @staticmethod |
449 def ParseAmInstrumentRawOutput(raw_output): | 512 def ParseAmInstrumentRawOutput(raw_output): |
450 return ParseAmInstrumentRawOutput(raw_output) | 513 return ParseAmInstrumentRawOutput(raw_output) |
451 | 514 |
452 @staticmethod | 515 @staticmethod |
453 def GenerateTestResults( | 516 def GenerateTestResults( |
454 result_code, result_bundle, statuses, start_ms, duration_ms): | 517 result_code, result_bundle, statuses, start_ms, duration_ms): |
455 return GenerateTestResults(result_code, result_bundle, statuses, | 518 return GenerateTestResults(result_code, result_bundle, statuses, |
456 start_ms, duration_ms) | 519 start_ms, duration_ms) |
457 | 520 |
458 #override | 521 #override |
459 def TearDown(self): | 522 def TearDown(self): |
460 if self._isolate_delegate: | 523 if self._isolate_delegate: |
461 self._isolate_delegate.Clear() | 524 self._isolate_delegate.Clear() |
462 | 525 |
OLD | NEW |