| Index: build/android/pylib/instrumentation/instrumentation_test_instance.py
 | 
| diff --git a/build/android/pylib/instrumentation/instrumentation_test_instance.py b/build/android/pylib/instrumentation/instrumentation_test_instance.py
 | 
| index 0c4f56678acaa27a21cefaa14fe257b50aad54e7..45e6ee4d77aed7c27ddd9eb082a93901aad2ff1a 100644
 | 
| --- a/build/android/pylib/instrumentation/instrumentation_test_instance.py
 | 
| +++ b/build/android/pylib/instrumentation/instrumentation_test_instance.py
 | 
| @@ -14,6 +14,7 @@ from pylib import flag_changer
 | 
|  from pylib.base import base_test_result
 | 
|  from pylib.base import test_instance
 | 
|  from pylib.instrumentation import test_result
 | 
| +from pylib.instrumentation import instrumentation_parser
 | 
|  from pylib.utils import apk_helper
 | 
|  from pylib.utils import md5sum
 | 
|  from pylib.utils import proguard
 | 
| @@ -47,48 +48,10 @@ def ParseAmInstrumentRawOutput(raw_output):
 | 
|          - 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)
 | 
| +  parser = instrumentation_parser.InstrumentationParser(raw_output)
 | 
| +  statuses = list(parser.IterStatus())
 | 
| +  code, bundle = parser.GetResult()
 | 
| +  return (code, bundle, statuses)
 | 
|  
 | 
|  
 | 
|  def GenerateTestResult(test_name, instr_statuses, start_ms, duration_ms):
 | 
| @@ -106,22 +69,15 @@ def GenerateTestResult(test_name, instr_statuses, start_ms, duration_ms):
 | 
|    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:
 | 
| +    if status_code == instrumentation_parser.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', ['']))
 | 
| +    elif status_code == instrumentation_parser.STATUS_CODE_OK:
 | 
| +      bundle_test = '%s#%s' % (bundle.get('class', ''), bundle.get('test', ''))
 | 
| +      skipped = bundle.get('test_skipped', '')
 | 
|  
 | 
|        if (test_name == bundle_test and
 | 
|            result_type == base_test_result.ResultType.UNKNOWN):
 | 
| @@ -130,13 +86,13 @@ def GenerateTestResult(test_name, instr_statuses, start_ms, duration_ms):
 | 
|          result_type = base_test_result.ResultType.SKIP
 | 
|          logging.info('Skipped ' + test_name)
 | 
|      else:
 | 
| -      if status_code not in (INSTR_STATUS_CODE_ERROR,
 | 
| -                             INSTR_STATUS_CODE_FAIL):
 | 
| +      if status_code not in (instrumentation_parser.STATUS_CODE_ERROR,
 | 
| +                             instrumentation_parser.STATUS_CODE_FAILURE):
 | 
|          logging.error('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'])
 | 
| +        log = bundle['stack']
 | 
|  
 | 
|    return test_result.InstrumentationTestResult(
 | 
|        test_name, result_type, start_ms, duration_ms, log=log)
 | 
| @@ -466,24 +422,22 @@ class InstrumentationTestInstance(test_instance.TestInstance):
 | 
|  
 | 
|    @staticmethod
 | 
|    def GenerateMultiTestResult(errors, statuses):
 | 
| -    INSTR_STATUS_CODE_START = 1
 | 
|      results = []
 | 
|      skip_counter = 1
 | 
|      for status_code, bundle in statuses:
 | 
| -      if status_code != INSTR_STATUS_CODE_START:
 | 
| +      if status_code != instrumentation_parser.STATUS_CODE_START:
 | 
|          # TODO(rnephew): Make skipped tests still output test name. This is only
 | 
|          # there to give skipped tests a unique name so they are counted
 | 
|          if 'test_skipped' in bundle:
 | 
|            test_name = str(skip_counter)
 | 
|            skip_counter += 1
 | 
|          else:
 | 
| -          test_name = '%s#%s' % (
 | 
| -              ''.join(bundle.get('class', [''])),
 | 
| -              ''.join(bundle.get('test', [''])))
 | 
| +          test_name = '%s#%s' % (bundle.get('class', ''),
 | 
| +                                 bundle.get('test', ''))
 | 
|  
 | 
|          results.append(
 | 
|              GenerateTestResult(test_name, [(status_code, bundle)], 0, 0))
 | 
| -    for error in errors:
 | 
| +    for error in errors.itervalues():
 | 
|        if _NATIVE_CRASH_RE.search(error):
 | 
|          results.append(
 | 
|              base_test_result.BaseTestResult(
 | 
| 
 |