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 |
11 from devil.android import apk_helper | 11 from devil.android import apk_helper |
12 from devil.android import md5sum | 12 from devil.android import md5sum |
13 from devil.utils import cmd_helper | |
14 from pylib import constants | 13 from pylib import constants |
15 from pylib import flag_changer | |
16 from pylib.base import base_test_result | 14 from pylib.base import base_test_result |
17 from pylib.base import test_instance | 15 from pylib.base import test_instance |
18 from pylib.instrumentation import test_result | 16 from pylib.instrumentation import test_result |
19 from pylib.instrumentation import instrumentation_parser | 17 from pylib.instrumentation import instrumentation_parser |
20 from pylib.utils import proguard | 18 from pylib.utils import proguard |
21 | 19 |
22 sys.path.append( | 20 sys.path.append( |
23 os.path.join(constants.DIR_SOURCE_ROOT, 'build', 'util', 'lib', 'common')) | 21 os.path.join(constants.DIR_SOURCE_ROOT, 'build', 'util', 'lib', 'common')) |
24 import unittest_util | 22 import unittest_util # pylint: disable=import-error |
25 | 23 |
26 # Ref: http://developer.android.com/reference/android/app/Activity.html | 24 # Ref: http://developer.android.com/reference/android/app/Activity.html |
27 _ACTIVITY_RESULT_CANCELED = 0 | 25 _ACTIVITY_RESULT_CANCELED = 0 |
28 _ACTIVITY_RESULT_OK = -1 | 26 _ACTIVITY_RESULT_OK = -1 |
29 | 27 |
30 _DEFAULT_ANNOTATIONS = [ | 28 _DEFAULT_ANNOTATIONS = [ |
31 'Smoke', 'SmallTest', 'MediumTest', 'LargeTest', | 29 'Smoke', 'SmallTest', 'MediumTest', 'LargeTest', |
32 'EnormousTest', 'IntegrationTest'] | 30 'EnormousTest', 'IntegrationTest'] |
33 _EXTRA_ENABLE_HTTP_SERVER = ( | 31 _EXTRA_ENABLE_HTTP_SERVER = ( |
34 'org.chromium.chrome.test.ChromeInstrumentationTestRunner.' | 32 'org.chromium.chrome.test.ChromeInstrumentationTestRunner.' |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
352 [None, 'chrome', 'test', 'data', device_rel_path])]) | 350 [None, 'chrome', 'test', 'data', device_rel_path])]) |
353 | 351 |
354 def GetDataDependencies(self): | 352 def GetDataDependencies(self): |
355 return self._data_deps | 353 return self._data_deps |
356 | 354 |
357 def GetTests(self): | 355 def GetTests(self): |
358 pickle_path = '%s-proguard.pickle' % self.test_jar | 356 pickle_path = '%s-proguard.pickle' % self.test_jar |
359 try: | 357 try: |
360 tests = self._GetTestsFromPickle(pickle_path, self.test_jar) | 358 tests = self._GetTestsFromPickle(pickle_path, self.test_jar) |
361 except self.ProguardPickleException as e: | 359 except self.ProguardPickleException as e: |
362 logging.info('Getting tests from JAR via proguard. (%s)' % str(e)) | 360 logging.info('Getting tests from JAR via proguard. (%s)', str(e)) |
363 tests = self._GetTestsFromProguard(self.test_jar) | 361 tests = self._GetTestsFromProguard(self.test_jar) |
364 self._SaveTestsToPickle(pickle_path, self.test_jar, tests) | 362 self._SaveTestsToPickle(pickle_path, self.test_jar, tests) |
365 return self._InflateTests(self._FilterTests(tests)) | 363 return self._InflateTests(self._FilterTests(tests)) |
366 | 364 |
367 class ProguardPickleException(Exception): | 365 class ProguardPickleException(Exception): |
368 pass | 366 pass |
369 | 367 |
370 def _GetTestsFromPickle(self, pickle_path, jar_path): | 368 def _GetTestsFromPickle(self, pickle_path, jar_path): |
371 if not os.path.exists(pickle_path): | 369 if not os.path.exists(pickle_path): |
372 raise self.ProguardPickleException('%s does not exist.' % pickle_path) | 370 raise self.ProguardPickleException('%s does not exist.' % pickle_path) |
373 if os.path.getmtime(pickle_path) <= os.path.getmtime(jar_path): | 371 if os.path.getmtime(pickle_path) <= os.path.getmtime(jar_path): |
374 raise self.ProguardPickleException( | 372 raise self.ProguardPickleException( |
375 '%s newer than %s.' % (jar_path, pickle_path)) | 373 '%s newer than %s.' % (jar_path, pickle_path)) |
376 | 374 |
377 with open(pickle_path, 'r') as pickle_file: | 375 with open(pickle_path, 'r') as pickle_file: |
378 pickle_data = pickle.loads(pickle_file.read()) | 376 pickle_data = pickle.loads(pickle_file.read()) |
379 jar_md5 = md5sum.CalculateHostMd5Sums(jar_path)[jar_path] | 377 jar_md5 = md5sum.CalculateHostMd5Sums(jar_path)[jar_path] |
380 | 378 |
381 try: | 379 try: |
382 if pickle_data['VERSION'] != _PICKLE_FORMAT_VERSION: | 380 if pickle_data['VERSION'] != _PICKLE_FORMAT_VERSION: |
383 raise self.ProguardPickleException('PICKLE_FORMAT_VERSION has changed.') | 381 raise self.ProguardPickleException('PICKLE_FORMAT_VERSION has changed.') |
384 if pickle_data['JAR_MD5SUM'] != jar_md5: | 382 if pickle_data['JAR_MD5SUM'] != jar_md5: |
385 raise self.ProguardPickleException('JAR file MD5 sum differs.') | 383 raise self.ProguardPickleException('JAR file MD5 sum differs.') |
386 return pickle_data['TEST_METHODS'] | 384 return pickle_data['TEST_METHODS'] |
387 except TypeError as e: | 385 except TypeError as e: |
388 logging.error(pickle_data) | 386 logging.error(pickle_data) |
389 raise self.ProguardPickleException(str(e)) | 387 raise self.ProguardPickleException(str(e)) |
390 | 388 |
| 389 # pylint: disable=no-self-use |
391 def _GetTestsFromProguard(self, jar_path): | 390 def _GetTestsFromProguard(self, jar_path): |
392 p = proguard.Dump(jar_path) | 391 p = proguard.Dump(jar_path) |
393 | 392 |
394 def is_test_class(c): | 393 def is_test_class(c): |
395 return c['class'].endswith('Test') | 394 return c['class'].endswith('Test') |
396 | 395 |
397 def is_test_method(m): | 396 def is_test_method(m): |
398 return m['method'].startswith('test') | 397 return m['method'].startswith('test') |
399 | 398 |
400 class_lookup = dict((c['class'], c) for c in p['classes']) | 399 class_lookup = dict((c['class'], c) for c in p['classes']) |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
516 def GenerateTestResults( | 515 def GenerateTestResults( |
517 result_code, result_bundle, statuses, start_ms, duration_ms): | 516 result_code, result_bundle, statuses, start_ms, duration_ms): |
518 return GenerateTestResults(result_code, result_bundle, statuses, | 517 return GenerateTestResults(result_code, result_bundle, statuses, |
519 start_ms, duration_ms) | 518 start_ms, duration_ms) |
520 | 519 |
521 #override | 520 #override |
522 def TearDown(self): | 521 def TearDown(self): |
523 if self._isolate_delegate: | 522 if self._isolate_delegate: |
524 self._isolate_delegate.Clear() | 523 self._isolate_delegate.Clear() |
525 | 524 |
OLD | NEW |