# Copyright 2017 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import os
import mock
import shutil
import sys
import tempfile

from future.tests.base import unittest

from mobly.base_instrumentation_test import _InstrumentationBlock
from mobly.base_instrumentation_test import _InstrumentationKnownStatusKeys
from mobly.base_instrumentation_test import _InstrumentationStructurePrefixes
from mobly.base_instrumentation_test import BaseInstrumentationTestClass
from mobly import config_parser
from mobly import signals
from mobly.controllers import android_device
from mobly.controllers.android_device_lib import adb
from tests.lib import mock_instrumentation_test

# A random prefix to test that prefixes are added properly.
MOCK_PREFIX = 'my_prefix'
# A mock name for the instrumentation test subclass.
MOCK_INSTRUMENTATION_TEST_CLASS_NAME = 'MockInstrumentationTest'

MOCK_EMPTY_INSTRUMENTATION_TEST = """\
INSTRUMENTATION_RESULT: stream=

Time: 0.001

OK (0 tests)


INSTRUMENTATION_CODE: -1
"""


class InstrumentationResult(object):

  def __init__(self):
    self.error = None
    self.completed_and_passed = False
    self.executed = []
    self.skipped = []


class BaseInstrumentationTestTest(unittest.TestCase):

  def setUp(self):
    self.tmp_dir = tempfile.mkdtemp()

  def tearDown(self):
    shutil.rmtree(self.tmp_dir)

  def assert_parse_instrumentation_options(self, user_params,
                                           expected_instrumentation_options):
    mit = mock_instrumentation_test.MockInstrumentationTest(
        self.tmp_dir, user_params)
    instrumentation_options = mit.parse_instrumentation_options(mit.user_params)
    self.assertEqual(instrumentation_options, expected_instrumentation_options)

  def test_parse_instrumentation_options_with_no_user_params(self):
    self.assert_parse_instrumentation_options({}, {})

  def test_parse_instrumentation_options_with_no_instrumentation_params(self):
    self.assert_parse_instrumentation_options(
        {
            'param1': 'val1',
            'param2': 'val2',
        },
        {},
    )

  def test_parse_instrumentation_options_with_only_instrumentation_params(self):
    self.assert_parse_instrumentation_options(
        {
            'instrumentation_option_key1': 'value1',
            'instrumentation_option_key2': 'value2',
        },
        {
            'key1': 'value1',
            'key2': 'value2'
        },
    )

  def test_parse_instrumentation_options_with_mixed_user_params(self):
    self.assert_parse_instrumentation_options(
        {
            'param1': 'val1',
            'param2': 'val2',
            'instrumentation_option_key1': 'value1',
            'instrumentation_option_key2': 'value2',
        },
        {
            'key1': 'value1',
            'key2': 'value2'
        },
    )

  def run_instrumentation_test(self, instrumentation_output, prefix=None):
    mit = mock_instrumentation_test.MockInstrumentationTest(self.tmp_dir)
    result = InstrumentationResult()
    try:
      result.completed_and_passed = mit.run_mock_instrumentation_test(
          instrumentation_output, prefix=prefix)
    except signals.TestError as e:
      result.error = e
    result.executed = mit.results.executed
    result.skipped = mit.results.skipped
    return result

  def assert_equal_test(self, actual_test, expected_test):
    (expected_test_name, expected_signal) = expected_test
    self.assertEqual(actual_test.test_class,
                     MOCK_INSTRUMENTATION_TEST_CLASS_NAME)
    self.assertEqual(actual_test.test_name, expected_test_name)
    self.assertIsInstance(actual_test.termination_signal.exception,
                          expected_signal)

  def convert_to_raw_output(self, test_output):
    """Converts code-based strings into adb output strings.

    In python3, adb returns 'utf-8' encoded byte arrays, which do not work
    correctly with code-based unicode strings, so to simulate that, the raw
    instrumentation output should be converted accordingly.
    """
    if sys.version_info >= (3, 0):
      return bytes(test_output, 'utf-8')
    else:
      return bytes(test_output)

  def assert_run_instrumentation_test(self,
                                      instrumentation_output,
                                      expected_executed=[],
                                      expected_skipped=[],
                                      expected_completed_and_passed=False,
                                      expected_has_error=False,
                                      prefix=None,
                                      expected_executed_times=[]):
    result = self.run_instrumentation_test(
        self.convert_to_raw_output(instrumentation_output), prefix=prefix)
    if expected_has_error:
      self.assertIsInstance(result.error, signals.TestError)
    else:
      self.assertIsNone(result.error)
      self.assertEqual(result.completed_and_passed,
                       expected_completed_and_passed)
    self.assertEqual(len(result.executed), len(expected_executed))
    for actual_test, expected_test in zip(result.executed, expected_executed):
      self.assert_equal_test(actual_test, expected_test)
    self.assertEqual(len(result.skipped), len(expected_skipped))
    for actual_test, expected_test in zip(result.skipped, expected_skipped):
      self.assert_equal_test(actual_test, expected_test)
    if expected_executed_times:
      for actual_test, expected_time in zip(result.executed,
                                            expected_executed_times):
        (expected_begin_time, expected_end_time) = expected_time
        self.assertEqual(actual_test.begin_time, expected_begin_time)
        self.assertEqual(actual_test.end_time, expected_end_time)

  def test_run_instrumentation_test_with_invalid_syntax(self):
    instrumentation_output = """\
usage: am [subcommand] [options]
usage: am start [-D] [-N] [-W] [-P <FILE>] [--start-profiler <FILE>]
         [--sampling INTERVAL] [-R COUNT] [-S]

am start: start an Activity.  Options are:
  -D: enable debugging

am startservice: start a Service.  Options are:
  --user <USER_ID> | current: Specify which user to run as; if not
    specified then run as the current user.

am task lock: bring <TASK_ID> to the front and don't allow other tasks to run.

<INTENT> specifications include these flags and arguments:
  [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
  [-c <CATEGORY> [-c <CATEGORY>] ...]

Error: Bad component name: /
"""
    self.assert_run_instrumentation_test(instrumentation_output,
                                         expected_has_error=True)

  def test_run_instrumentation_test_with_no_output(self):
    instrumentation_output = """\
"""
    self.assert_run_instrumentation_test(instrumentation_output,
                                         expected_has_error=True)

  def test_run_instrumentation_test_with_missing_test_package(self):
    instrumentation_output = """\
android.util.AndroidException: INSTRUMENTATION_FAILED: com.my.package.test/com.my.package.test.runner.MyRunner
  at com.android.commands.am.Am.runInstrument(Am.java:897)
  at com.android.commands.am.Am.onRun(Am.java:405)
  at com.android.internal.os.BaseCommand.run(BaseCommand.java:51)
  at com.android.commands.am.Am.main(Am.java:124)
  at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
  at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:262)
INSTRUMENTATION_STATUS: id=ActivityManagerService
INSTRUMENTATION_STATUS: Error=Unable to find instrumentation info for: ComponentInfo{com.my.package.test/com.my.package.test.runner.MyRunner}
INSTRUMENTATION_STATUS_CODE: -1"""
    self.assert_run_instrumentation_test(instrumentation_output,
                                         expected_has_error=True)

  def test_run_instrumentation_test_with_missing_runner(self):
    instrumentation_output = """\
android.util.AndroidException: INSTRUMENTATION_FAILED: com.my.package.test/com.my.package.test.runner
INSTRUMENTATION_STATUS: id=ActivityManagerService
INSTRUMENTATION_STATUS: Error=Unable to find instrumentation info for: ComponentInfo{com.my.package.test/com.my.package.test.runner}
INSTRUMENTATION_STATUS_CODE: -1
  at com.android.commands.am.Am.runInstrument(Am.java:897)
  at com.android.commands.am.Am.onRun(Am.java:405)
  at com.android.internal.os.BaseCommand.run(BaseCommand.java:51)
  at com.android.commands.am.Am.main(Am.java:124)
  at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
  at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:262)"""
    self.assert_run_instrumentation_test(instrumentation_output,
                                         expected_has_error=True)

  def test_run_instrumentation_test_with_no_tests(self):
    instrumentation_output = MOCK_EMPTY_INSTRUMENTATION_TEST
    self.assert_run_instrumentation_test(instrumentation_output,
                                         expected_completed_and_passed=True)

  @unittest.skipUnless(
      sys.version_info >= (3, 0),
      'Only python3 displays different string types differently.')
  @mock.patch('logging.info')
  def test_run_instrumentation_test_logs_correctly(self, mock_info_logger):
    instrumentation_output = MOCK_EMPTY_INSTRUMENTATION_TEST
    self.assert_run_instrumentation_test(instrumentation_output,
                                         expected_completed_and_passed=True)
    for mock_call in mock_info_logger.mock_calls:
      logged_format = mock_call[1][0]
      self.assertIsInstance(logged_format, str)

  @mock.patch('mobly.utils.get_current_epoch_time')
  def test_run_instrumentation_test_with_passing_test(self, mock_get_time):
    instrumentation_output = """\
INSTRUMENTATION_STATUS: numtests=1
INSTRUMENTATION_STATUS: stream=
com.my.package.test.BasicTest:
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: test=basicTest
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS_CODE: 1
INSTRUMENTATION_STATUS: numtests=1
INSTRUMENTATION_STATUS: stream=.
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: test=basicTest
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS_CODE: 0
INSTRUMENTATION_RESULT: stream=

Time: 0.214

OK (1 test)


INSTRUMENTATION_CODE: -1
"""
    expected_executed = [
        ('com.my.package.test.BasicTest#basicTest', signals.TestPass),
    ]
    mock_get_time.side_effect = [13, 51]
    self.assert_run_instrumentation_test(instrumentation_output,
                                         expected_executed=expected_executed,
                                         expected_completed_and_passed=True,
                                         expected_executed_times=[(13, 51)])

  def test_run_instrumentation_test_with_random_whitespace(self):
    instrumentation_output = """\

INSTRUMENTATION_STATUS: numtests=1

INSTRUMENTATION_STATUS: stream=

com.my.package.test.BasicTest:

INSTRUMENTATION_STATUS: id=AndroidJUnitRunner

INSTRUMENTATION_STATUS: test=basicTest

INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest

INSTRUMENTATION_STATUS: current=1

INSTRUMENTATION_STATUS_CODE: 1

INSTRUMENTATION_STATUS: numtests=1

INSTRUMENTATION_STATUS: stream=.

INSTRUMENTATION_STATUS: id=AndroidJUnitRunner

INSTRUMENTATION_STATUS: test=basicTest

INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest

INSTRUMENTATION_STATUS: current=1

INSTRUMENTATION_STATUS_CODE: 0

INSTRUMENTATION_RESULT: stream=


Time: 0.214


OK (1 test)




INSTRUMENTATION_CODE: -1

"""
    expected_executed = [
        ('com.my.package.test.BasicTest#basicTest', signals.TestPass),
    ]
    self.assert_run_instrumentation_test(instrumentation_output,
                                         expected_executed=expected_executed,
                                         expected_completed_and_passed=True)

  def test_run_instrumentation_test_with_prefix_test(self):
    instrumentation_output = """\
INSTRUMENTATION_STATUS: numtests=1
INSTRUMENTATION_STATUS: stream=
com.my.package.test.BasicTest:
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: test=basicTest
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS_CODE: 1
INSTRUMENTATION_STATUS: numtests=1
INSTRUMENTATION_STATUS: stream=.
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: test=basicTest
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS_CODE: 0
INSTRUMENTATION_RESULT: stream=

Time: 0.214

OK (1 test)


INSTRUMENTATION_CODE: -1
"""
    expected_executed = [
        ('%s.com.my.package.test.BasicTest#basicTest' % MOCK_PREFIX,
         signals.TestPass),
    ]
    self.assert_run_instrumentation_test(instrumentation_output,
                                         expected_executed=expected_executed,
                                         expected_completed_and_passed=True,
                                         prefix=MOCK_PREFIX)

  def test_run_instrumentation_test_with_failing_test(self):
    instrumentation_output = """\
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: numtests=1
INSTRUMENTATION_STATUS: stream=
com.my.package.test.BasicTest:
INSTRUMENTATION_STATUS: test=failingTest
INSTRUMENTATION_STATUS_CODE: 1
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: numtests=1
INSTRUMENTATION_STATUS: stack=java.lang.UnsupportedOperationException: dummy failing test
  at com.my.package.test.BasicTest.failingTest(BasicTest.java:38)
  at java.lang.reflect.Method.invoke(Native Method)
  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
  at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
  at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
  at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
  at org.junit.runners.Suite.runChild(Suite.java:128)
  at org.junit.runners.Suite.runChild(Suite.java:27)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at org.junit.runners.Suite.runChild(Suite.java:128)
  at org.junit.runners.Suite.runChild(Suite.java:27)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
  at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
  at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
  at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)

INSTRUMENTATION_STATUS: stream=
Error in failingTest(com.my.package.test.BasicTest):
java.lang.UnsupportedOperationException: dummy failing test
  at com.my.package.test.BasicTest.failingTest(BasicTest.java:38)
  at java.lang.reflect.Method.invoke(Native Method)
  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
  at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
  at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
  at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
  at org.junit.runners.Suite.runChild(Suite.java:128)
  at org.junit.runners.Suite.runChild(Suite.java:27)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at org.junit.runners.Suite.runChild(Suite.java:128)
  at org.junit.runners.Suite.runChild(Suite.java:27)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
  at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
  at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
  at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)

INSTRUMENTATION_STATUS: test=failingTest
INSTRUMENTATION_STATUS_CODE: -2
INSTRUMENTATION_RESULT: stream=

Time: 1.92
There was 1 failure:
1) failingTest(com.my.package.test.BasicTest)
java.lang.UnsupportedOperationException: dummy failing test
  at com.my.package.test.BasicTest.failingTest(BasicTest.java:38)
  at java.lang.reflect.Method.invoke(Native Method)
  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
  at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
  at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
  at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
  at org.junit.runners.Suite.runChild(Suite.java:128)
  at org.junit.runners.Suite.runChild(Suite.java:27)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at org.junit.runners.Suite.runChild(Suite.java:128)
  at org.junit.runners.Suite.runChild(Suite.java:27)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
  at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
  at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
  at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)

FAILURES!!!
Tests run: 1,  Failures: 1


INSTRUMENTATION_CODE: -1"""
    expected_executed = [
        ('com.my.package.test.BasicTest#failingTest', signals.TestFailure),
    ]
    self.assert_run_instrumentation_test(instrumentation_output,
                                         expected_executed=expected_executed)

  def test_run_instrumentation_test_with_assumption_failure_test(self):
    instrumentation_output = """\
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: numtests=1
INSTRUMENTATION_STATUS: stream=
com.my.package.test.BasicTest:
INSTRUMENTATION_STATUS: test=assumptionFailureTest
INSTRUMENTATION_STATUS_CODE: 1
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: numtests=1
INSTRUMENTATION_STATUS: stack=org.junit.AssumptionViolatedException: Assumption failure reason
  at org.junit.Assume.assumeTrue(Assume.java:59)
  at org.junit.Assume.assumeFalse(Assume.java:66)
  at com.my.package.test.BasicTest.assumptionFailureTest(BasicTest.java:63)
  at java.lang.reflect.Method.invoke(Native Method)
  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
  at com.my.package.test.MyBaseTest$3.evaluate(MyBaseTest.java:96)
  at com.my.package.test.MyBaseTest$4.evaluate(MyBaseTest.java:109)
  at com.my.package.test.MyBaseTest$2.evaluate(MyBaseTest.java:77)
  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
  at org.junit.runners.Suite.runChild(Suite.java:128)
  at org.junit.runners.Suite.runChild(Suite.java:27)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at org.junit.runners.Suite.runChild(Suite.java:128)
  at org.junit.runners.Suite.runChild(Suite.java:27)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
  at com.my.package.test.runner.BaseRunner.runTests(BaseRunner.java:344)
  at com.my.package.test.runner.BaseRunner.onStart(BaseRunner.java:330)
  at com.my.package.test.runner.BaseRunner.onStart(BaseRunner.java:253)
  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)

INSTRUMENTATION_STATUS: stream=
com.my.package.test.BasicTest:
INSTRUMENTATION_STATUS: test=assumptionFailureTest
INSTRUMENTATION_STATUS_CODE: -4
INSTRUMENTATION_RESULT: stream=

Time: 3.139

OK (1 test)


INSTRUMENTATION_CODE: -1"""
    expected_skipped = [
        ('com.my.package.test.BasicTest#assumptionFailureTest',
         signals.TestSkip),
    ]
    self.assert_run_instrumentation_test(instrumentation_output,
                                         expected_skipped=expected_skipped,
                                         expected_completed_and_passed=True)

  def test_run_instrumentation_test_with_ignored_test(self):
    instrumentation_output = """\
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: numtests=1
INSTRUMENTATION_STATUS: stream=
com.my.package.test.BasicTest:
INSTRUMENTATION_STATUS: test=ignoredTest
INSTRUMENTATION_STATUS_CODE: 1
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: numtests=1
INSTRUMENTATION_STATUS: stream=
com.my.package.test.BasicTest:
INSTRUMENTATION_STATUS: test=ignoredTest
INSTRUMENTATION_STATUS_CODE: -3
INSTRUMENTATION_RESULT: stream=

Time: 0.007

OK (0 tests)


INSTRUMENTATION_CODE: -1"""
    expected_skipped = [
        ('com.my.package.test.BasicTest#ignoredTest', signals.TestSkip),
    ]
    self.assert_run_instrumentation_test(instrumentation_output,
                                         expected_skipped=expected_skipped,
                                         expected_completed_and_passed=True)

  @mock.patch('mobly.utils.get_current_epoch_time')
  def test_run_instrumentation_test_with_crashed_test(self, mock_get_time):
    instrumentation_output = """\
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: numtests=1
INSTRUMENTATION_STATUS: stream=
com.my.package.test.BasicTest:
INSTRUMENTATION_STATUS: test=crashTest
INSTRUMENTATION_STATUS_CODE: 1
INSTRUMENTATION_RESULT: shortMsg=Process crashed.
INSTRUMENTATION_CODE: 0"""
    expected_executed = [
        ('com.my.package.test.BasicTest#crashTest', signals.TestError),
    ]
    mock_get_time.side_effect = [67, 942]
    self.assert_run_instrumentation_test(instrumentation_output,
                                         expected_executed=expected_executed,
                                         expected_has_error=True,
                                         expected_executed_times=[(67, 942)])

  @mock.patch('mobly.utils.get_current_epoch_time')
  def test_run_instrumentation_test_with_crashing_test(self, mock_get_time):
    instrumentation_output = """\
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: numtests=2
INSTRUMENTATION_STATUS: stream=
com.my.package.test.BasicTest:
INSTRUMENTATION_STATUS: test=crashAndRecover1Test
INSTRUMENTATION_STATUS_CODE: 1
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=2
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: numtests=2
INSTRUMENTATION_STATUS: stream=
com.my.package.test.BasicTest:
INSTRUMENTATION_STATUS: test=crashAndRecover2Test
INSTRUMENTATION_STATUS_CODE: 1
INSTRUMENTATION_RESULT: stream=

Time: 6.342

OK (2 tests)


INSTRUMENTATION_CODE: -1"""
    expected_executed = [
        ('com.my.package.test.BasicTest#crashAndRecover1Test',
         signals.TestError),
        ('com.my.package.test.BasicTest#crashAndRecover2Test',
         signals.TestError),
    ]
    mock_get_time.side_effect = [16, 412, 4143, 6547]
    # TODO(winterfrosts): Fix this issue with overlapping timing
    self.assert_run_instrumentation_test(instrumentation_output,
                                         expected_executed=expected_executed,
                                         expected_completed_and_passed=True,
                                         expected_executed_times=[(16, 4143),
                                                                  (412, 6547)])

  def test_run_instrumentation_test_with_runner_setup_crash(self):
    instrumentation_output = """\
INSTRUMENTATION_RESULT: shortMsg=Process crashed.
INSTRUMENTATION_CODE: 0"""
    self.assert_run_instrumentation_test(instrumentation_output,
                                         expected_has_error=True)

  def test_run_instrumentation_test_with_runner_teardown_crash(self):
    instrumentation_output = """\
INSTRUMENTATION_STATUS: numtests=1
INSTRUMENTATION_STATUS: stream=
com.my.package.test.BasicTest:
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: test=basicTest
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS_CODE: 1
INSTRUMENTATION_STATUS: numtests=1
INSTRUMENTATION_STATUS: stream=.
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: test=basicTest
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS_CODE: 0
INSTRUMENTATION_RESULT: shortMsg=Process crashed.
INSTRUMENTATION_CODE: 0
"""
    expected_executed = [
        ('com.my.package.test.BasicTest#basicTest', signals.TestPass),
    ]
    self.assert_run_instrumentation_test(instrumentation_output,
                                         expected_executed=expected_executed,
                                         expected_has_error=True)

  @mock.patch('mobly.utils.get_current_epoch_time')
  def test_run_instrumentation_test_with_multiple_tests(self, mock_get_time):
    instrumentation_output = """\
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: numtests=4
INSTRUMENTATION_STATUS: stream=
com.my.package.test.BasicTest:
INSTRUMENTATION_STATUS: test=failingTest
INSTRUMENTATION_STATUS_CODE: 1
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: numtests=4
INSTRUMENTATION_STATUS: stack=java.lang.UnsupportedOperationException: dummy failing test
  at com.my.package.test.BasicTest.failingTest(BasicTest.java:40)
  at java.lang.reflect.Method.invoke(Native Method)
  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
  at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
  at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
  at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
  at org.junit.runners.Suite.runChild(Suite.java:128)
  at org.junit.runners.Suite.runChild(Suite.java:27)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at org.junit.runners.Suite.runChild(Suite.java:128)
  at org.junit.runners.Suite.runChild(Suite.java:27)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
  at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
  at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
  at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)

INSTRUMENTATION_STATUS: stream=
Error in failingTest(com.my.package.test.BasicTest):
java.lang.UnsupportedOperationException: dummy failing test
  at com.my.package.test.BasicTest.failingTest(BasicTest.java:40)
  at java.lang.reflect.Method.invoke(Native Method)
  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
  at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
  at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
  at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
  at org.junit.runners.Suite.runChild(Suite.java:128)
  at org.junit.runners.Suite.runChild(Suite.java:27)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at org.junit.runners.Suite.runChild(Suite.java:128)
  at org.junit.runners.Suite.runChild(Suite.java:27)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
  at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
  at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
  at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)

INSTRUMENTATION_STATUS: test=failingTest
INSTRUMENTATION_STATUS_CODE: -2
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=2
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: numtests=4
INSTRUMENTATION_STATUS: stream=
INSTRUMENTATION_STATUS: test=assumptionFailureTest
INSTRUMENTATION_STATUS_CODE: 1
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=2
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: numtests=4
INSTRUMENTATION_STATUS: stack=org.junit.AssumptionViolatedException: Assumption failure reason
  at org.junit.Assume.assumeTrue(Assume.java:59)
  at com.my.package.test.BasicTest.assumptionFailureTest(BasicTest.java:61)
  at java.lang.reflect.Method.invoke(Native Method)
  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
  at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
  at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
  at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
  at org.junit.runners.Suite.runChild(Suite.java:128)
  at org.junit.runners.Suite.runChild(Suite.java:27)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at org.junit.runners.Suite.runChild(Suite.java:128)
  at org.junit.runners.Suite.runChild(Suite.java:27)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
  at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
  at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
  at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)

INSTRUMENTATION_STATUS: stream=
INSTRUMENTATION_STATUS: test=assumptionFailureTest
INSTRUMENTATION_STATUS_CODE: -4
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=3
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: numtests=4
INSTRUMENTATION_STATUS: stream=
INSTRUMENTATION_STATUS: test=ignoredTest
INSTRUMENTATION_STATUS_CODE: 1
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=3
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: numtests=4
INSTRUMENTATION_STATUS: stream=
INSTRUMENTATION_STATUS: test=ignoredTest
INSTRUMENTATION_STATUS_CODE: -3
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=4
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: numtests=4
INSTRUMENTATION_STATUS: stream=
INSTRUMENTATION_STATUS: test=passingTest
INSTRUMENTATION_STATUS_CODE: 1
INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
INSTRUMENTATION_STATUS: current=4
INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
INSTRUMENTATION_STATUS: numtests=4
INSTRUMENTATION_STATUS: stream=.
INSTRUMENTATION_STATUS: test=passingTest
INSTRUMENTATION_STATUS_CODE: 0
INSTRUMENTATION_RESULT: stream=

Time: 4.131
There was 1 failure:
1) failingTest(com.my.package.test.BasicTest)
java.lang.UnsupportedOperationException: dummy failing test
  at com.my.package.test.BasicTest.failingTest(BasicTest.java:40)
  at java.lang.reflect.Method.invoke(Native Method)
  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
  at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
  at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
  at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
  at org.junit.runners.Suite.runChild(Suite.java:128)
  at org.junit.runners.Suite.runChild(Suite.java:27)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at org.junit.runners.Suite.runChild(Suite.java:128)
  at org.junit.runners.Suite.runChild(Suite.java:27)
  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
  at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
  at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
  at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)

FAILURES!!!
Tests run: 3,  Failures: 1


INSTRUMENTATION_CODE: -1"""
    expected_executed = [
        ('com.my.package.test.BasicTest#failingTest', signals.TestFailure),
        ('com.my.package.test.BasicTest#passingTest', signals.TestPass),
    ]
    expected_skipped = [
        ('com.my.package.test.BasicTest#assumptionFailureTest',
         signals.TestSkip),
        ('com.my.package.test.BasicTest#ignoredTest', signals.TestSkip),
    ]
    mock_get_time.side_effect = [54, 64, -1, -1, -1, -1, 89, 94]
    self.assert_run_instrumentation_test(instrumentation_output,
                                         expected_executed=expected_executed,
                                         expected_skipped=expected_skipped,
                                         expected_executed_times=[(54, 64),
                                                                  (89, 94)])

  def test__Instrumentation_block_set_key_on_multiple_equals_sign(self):
    value = "blah=blah, blah2=blah2, blah=2=1=2"
    parsed_line = "INSTRUMENTATION_STATUS: stack=%s" % value
    block = _InstrumentationBlock()
    block.set_key(_InstrumentationStructurePrefixes.STATUS, parsed_line)
    self.assertIn(value,
                  block.known_keys[_InstrumentationKnownStatusKeys.STACK])


if __name__ == '__main__':
  unittest.main()
