| 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 sys | 9 import sys |
| 9 | 10 |
| 10 from pylib import cmd_helper | 11 from pylib import cmd_helper |
| 11 from pylib import constants | 12 from pylib import constants |
| 12 from pylib import flag_changer | 13 from pylib import flag_changer |
| 13 from pylib.base import base_test_result | 14 from pylib.base import base_test_result |
| 14 from pylib.base import test_instance | 15 from pylib.base import test_instance |
| 15 from pylib.instrumentation import test_result | 16 from pylib.instrumentation import test_result |
| 16 from pylib.utils import apk_helper | 17 from pylib.utils import apk_helper |
| 17 from pylib.utils import md5sum | 18 from pylib.utils import md5sum |
| 18 from pylib.utils import proguard | 19 from pylib.utils import proguard |
| 19 | 20 |
| 20 sys.path.append( | 21 sys.path.append( |
| 21 os.path.join(constants.DIR_SOURCE_ROOT, 'build', 'util', 'lib', 'common')) | 22 os.path.join(constants.DIR_SOURCE_ROOT, 'build', 'util', 'lib', 'common')) |
| 22 import unittest_util | 23 import unittest_util |
| 23 | 24 |
| 24 _DEFAULT_ANNOTATIONS = [ | 25 _DEFAULT_ANNOTATIONS = [ |
| 25 'Smoke', 'SmallTest', 'MediumTest', 'LargeTest', | 26 'Smoke', 'SmallTest', 'MediumTest', 'LargeTest', |
| 26 'EnormousTest', 'IntegrationTest'] | 27 'EnormousTest', 'IntegrationTest'] |
| 28 _NATIVE_CRASH_RE = re.compile('native crash', re.IGNORECASE) |
| 27 _PICKLE_FORMAT_VERSION = 10 | 29 _PICKLE_FORMAT_VERSION = 10 |
| 28 | 30 |
| 29 | 31 |
| 30 # TODO(jbudorick): Make these private class methods of | 32 # TODO(jbudorick): Make these private class methods of |
| 31 # InstrumentationTestInstance once the instrumentation test_runner is | 33 # InstrumentationTestInstance once the instrumentation test_runner is |
| 32 # deprecated. | 34 # deprecated. |
| 33 def ParseAmInstrumentRawOutput(raw_output): | 35 def ParseAmInstrumentRawOutput(raw_output): |
| 34 """Parses the output of an |am instrument -r| call. | 36 """Parses the output of an |am instrument -r| call. |
| 35 | 37 |
| 36 Args: | 38 Args: |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 263 if hasattr(args, 'device_flags') and args.device_flags: | 265 if hasattr(args, 'device_flags') and args.device_flags: |
| 264 with open(args.device_flags) as device_flags_file: | 266 with open(args.device_flags) as device_flags_file: |
| 265 stripped_lines = (l.strip() for l in device_flags_file) | 267 stripped_lines = (l.strip() for l in device_flags_file) |
| 266 self._flags.extend([flag for flag in stripped_lines if flag]) | 268 self._flags.extend([flag for flag in stripped_lines if flag]) |
| 267 if hasattr(args, 'device_flags_file') and args.device_flags_file: | 269 if hasattr(args, 'device_flags_file') and args.device_flags_file: |
| 268 with open(args.device_flags_file) as device_flags_file: | 270 with open(args.device_flags_file) as device_flags_file: |
| 269 stripped_lines = (l.strip() for l in device_flags_file) | 271 stripped_lines = (l.strip() for l in device_flags_file) |
| 270 self._flags.extend([flag for flag in stripped_lines if flag]) | 272 self._flags.extend([flag for flag in stripped_lines if flag]) |
| 271 | 273 |
| 272 @property | 274 @property |
| 275 def suite(self): |
| 276 return 'instrumentation' |
| 277 |
| 278 @property |
| 273 def apk_under_test(self): | 279 def apk_under_test(self): |
| 274 return self._apk_under_test | 280 return self._apk_under_test |
| 275 | 281 |
| 276 @property | 282 @property |
| 277 def flags(self): | 283 def flags(self): |
| 278 return self._flags | 284 return self._flags |
| 279 | 285 |
| 280 @property | 286 @property |
| 281 def package_info(self): | 287 def package_info(self): |
| 282 return self._package_info | 288 return self._package_info |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 452 a = dict(c['annotations']) | 458 a = dict(c['annotations']) |
| 453 a.update(m['annotations']) | 459 a.update(m['annotations']) |
| 454 inflated_tests.append({ | 460 inflated_tests.append({ |
| 455 'class': c['class'], | 461 'class': c['class'], |
| 456 'method': m['method'], | 462 'method': m['method'], |
| 457 'annotations': a, | 463 'annotations': a, |
| 458 }) | 464 }) |
| 459 return inflated_tests | 465 return inflated_tests |
| 460 | 466 |
| 461 @staticmethod | 467 @staticmethod |
| 468 def GenerateMultiTestResult(errors, statuses): |
| 469 INSTR_STATUS_CODE_START = 1 |
| 470 results = [] |
| 471 skip_counter = 1 |
| 472 for status_code, bundle in statuses: |
| 473 if status_code != INSTR_STATUS_CODE_START: |
| 474 # TODO(rnephew): Make skipped tests still output test name. This is only |
| 475 # there to give skipped tests a unique name so they are counted |
| 476 if 'test_skipped' in bundle: |
| 477 test_name = str(skip_counter) |
| 478 skip_counter += 1 |
| 479 else: |
| 480 test_name = '%s#%s' % ( |
| 481 ''.join(bundle.get('class', [''])), |
| 482 ''.join(bundle.get('test', ['']))) |
| 483 |
| 484 results.append( |
| 485 GenerateTestResult(test_name, [(status_code, bundle)], 0, 0)) |
| 486 for error in errors: |
| 487 if _NATIVE_CRASH_RE.search(error): |
| 488 results.append( |
| 489 base_test_result.BaseTestResult( |
| 490 'Crash detected', base_test_result.ResultType.CRASH)) |
| 491 |
| 492 return results |
| 493 |
| 494 @staticmethod |
| 462 def ParseAmInstrumentRawOutput(raw_output): | 495 def ParseAmInstrumentRawOutput(raw_output): |
| 463 return ParseAmInstrumentRawOutput(raw_output) | 496 return ParseAmInstrumentRawOutput(raw_output) |
| 464 | 497 |
| 465 @staticmethod | 498 @staticmethod |
| 466 def GenerateTestResult(test_name, instr_statuses, start_ms, duration_ms): | 499 def GenerateTestResult(test_name, instr_statuses, start_ms, duration_ms): |
| 467 return GenerateTestResult(test_name, instr_statuses, start_ms, duration_ms) | 500 return GenerateTestResult(test_name, instr_statuses, start_ms, duration_ms) |
| 468 | 501 |
| 469 #override | 502 #override |
| 470 def TearDown(self): | 503 def TearDown(self): |
| 471 if self._isolate_delegate: | 504 if self._isolate_delegate: |
| 472 self._isolate_delegate.Clear() | 505 self._isolate_delegate.Clear() |
| 473 | 506 |
| OLD | NEW |