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

Unified Diff: build/android/pylib/instrumentation/test_runner.py

Issue 794923003: [Android] Implement instrumentation tests in platform mode. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 months 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 side-by-side diff with in-line comments
Download patch
Index: build/android/pylib/instrumentation/test_runner.py
diff --git a/build/android/pylib/instrumentation/test_runner.py b/build/android/pylib/instrumentation/test_runner.py
index a86b5ceae419ea3ad1be528364217220c7cb912b..74898c2c366c34130fd15dd2f416575a7bfe959e 100644
--- a/build/android/pylib/instrumentation/test_runner.py
+++ b/build/android/pylib/instrumentation/test_runner.py
@@ -16,8 +16,10 @@ from pylib import valgrind_tools
from pylib.base import base_test_result
from pylib.base import base_test_runner
from pylib.device import device_errors
+from pylib.instrumentation import instrumentation_test_instance
from pylib.instrumentation import json_perf_parser
from pylib.instrumentation import test_result
+from pylib.local.device import local_device_instrumentation_test_run
sys.path.append(os.path.join(constants.DIR_SOURCE_ROOT, 'build', 'util', 'lib',
'common'))
@@ -319,124 +321,6 @@ class TestRunner(base_test_runner.BaseTestRunner):
'%s/%s' % (self.test_pkg.GetPackageName(), self.options.test_runner),
raw=True, extras=extras, timeout=timeout, retries=0)
- @staticmethod
- def _ParseAmInstrumentRawOutput(raw_output):
- """Parses the output of an |am instrument -r| call.
-
- Args:
- raw_output: the output of an |am instrument -r| call as a list of lines
- Returns:
- A 3-tuple containing:
- - the instrumentation code as an integer
- - the instrumentation result as a list of lines
- - the instrumentation statuses received as a list of 2-tuples
- containing:
- - the status code as an integer
- - the bundle dump as a dict mapping string keys to a list of
- strings, one for each line.
- """
- INSTR_STATUS = 'INSTRUMENTATION_STATUS: '
- INSTR_STATUS_CODE = 'INSTRUMENTATION_STATUS_CODE: '
- INSTR_RESULT = 'INSTRUMENTATION_RESULT: '
- INSTR_CODE = 'INSTRUMENTATION_CODE: '
-
- last = None
- instr_code = None
- instr_result = []
- instr_statuses = []
- bundle = {}
- for line in raw_output:
- if line.startswith(INSTR_STATUS):
- instr_var = line[len(INSTR_STATUS):]
- if '=' in instr_var:
- k, v = instr_var.split('=', 1)
- bundle[k] = [v]
- last = INSTR_STATUS
- last_key = k
- else:
- logging.debug('Unknown "%s" line: %s' % (INSTR_STATUS, line))
-
- elif line.startswith(INSTR_STATUS_CODE):
- instr_status = line[len(INSTR_STATUS_CODE):]
- instr_statuses.append((int(instr_status), bundle))
- bundle = {}
- last = INSTR_STATUS_CODE
-
- elif line.startswith(INSTR_RESULT):
- instr_result.append(line[len(INSTR_RESULT):])
- last = INSTR_RESULT
-
- elif line.startswith(INSTR_CODE):
- instr_code = int(line[len(INSTR_CODE):])
- last = INSTR_CODE
-
- elif last == INSTR_STATUS:
- bundle[last_key].append(line)
-
- elif last == INSTR_RESULT:
- instr_result.append(line)
-
- return (instr_code, instr_result, instr_statuses)
-
- def _GenerateTestResult(self, test, instr_statuses, start_ms, duration_ms):
- """Generate the result of |test| from |instr_statuses|.
-
- Args:
- instr_statuses: A list of 2-tuples containing:
- - the status code as an integer
- - the bundle dump as a dict mapping string keys to string values
- Note that this is the same as the third item in the 3-tuple returned by
- |_ParseAmInstrumentRawOutput|.
- start_ms: The start time of the test in milliseconds.
- duration_ms: The duration of the test in milliseconds.
- Returns:
- An InstrumentationTestResult object.
- """
- INSTR_STATUS_CODE_START = 1
- INSTR_STATUS_CODE_OK = 0
- INSTR_STATUS_CODE_ERROR = -1
- INSTR_STATUS_CODE_FAIL = -2
-
- log = ''
- result_type = base_test_result.ResultType.UNKNOWN
-
- for status_code, bundle in instr_statuses:
- if status_code == INSTR_STATUS_CODE_START:
- pass
- elif status_code == INSTR_STATUS_CODE_OK:
- bundle_test = '%s#%s' % (
- ''.join(bundle.get('class', [''])),
- ''.join(bundle.get('test', [''])))
- skipped = ''.join(bundle.get('test_skipped', ['']))
-
- if (test == bundle_test and
- result_type == base_test_result.ResultType.UNKNOWN):
- result_type = base_test_result.ResultType.PASS
- elif skipped.lower() in ('true', '1', 'yes'):
- result_type = base_test_result.ResultType.SKIP
- logging.info('Skipped ' + test)
- else:
- if status_code not in (INSTR_STATUS_CODE_ERROR,
- INSTR_STATUS_CODE_FAIL):
- logging.info('Unrecognized status code %d. Handling as an error.',
- status_code)
- result_type = base_test_result.ResultType.FAIL
- if 'stack' in bundle:
- log = '\n'.join(bundle['stack'])
- # Dismiss any error dialogs. Limit the number in case we have an error
- # loop or we are failing to dismiss.
- for _ in xrange(10):
- package = self.device.old_interface.DismissCrashDialogIfNeeded()
- if not package:
- break
- # Assume test package convention of ".test" suffix
- if package in self.test_pkg.GetPackageName():
- result_type = base_test_result.ResultType.CRASH
- break
-
- return test_result.InstrumentationTestResult(
- test, result_type, start_ms, duration_ms, log=log)
-
#override
def RunTest(self, test):
results = base_test_result.TestRunResults()
@@ -458,8 +342,13 @@ class TestRunner(base_test_runner.BaseTestRunner):
duration_ms = time_ms() - start_ms
# Parse the test output
- _, _, statuses = self._ParseAmInstrumentRawOutput(raw_output)
- result = self._GenerateTestResult(test, statuses, start_ms, duration_ms)
+ _, _, statuses = (
+ instrumentation_test_instance.ParseAmInstrumentRawOutput(raw_output))
+ result = instrumentation_test_instance.GenerateTestResult(
+ test, statuses, start_ms, duration_ms)
+ if local_device_instrumentation_test_run.DidPackageCrashOnDevice(
+ self.test_pkg.GetPackageName(), self.device):
+ result.SetType(base_test_result.ResultType.CRASH)
results.AddResult(result)
except device_errors.CommandTimeoutError as e:
results.AddResult(test_result.InstrumentationTestResult(

Powered by Google App Engine
This is Rietveld 408576698