| # 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 |
| |
| # A mock test package for instrumentation. |
| MOCK_TEST_PACKAGE = 'com.my.package.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 MockInstrumentationTest(BaseInstrumentationTestClass): |
| def __init__(self, tmp_dir, user_params={}): |
| mock_test_run_configs = config_parser.TestRunConfig() |
| mock_test_run_configs.summary_writer = mock.Mock() |
| mock_test_run_configs.log_path = tmp_dir |
| mock_test_run_configs.user_params = user_params |
| mock_test_run_configs.reporter = mock.MagicMock() |
| super(MockInstrumentationTest, self).__init__(mock_test_run_configs) |
| |
| def run_mock_instrumentation_test(self, instrumentation_output, prefix): |
| def fake_instrument(package, options=None, runner=None, handler=None): |
| for line in instrumentation_output.splitlines(): |
| handler(line) |
| return instrumentation_output |
| |
| mock_device = mock.Mock(spec=android_device.AndroidDevice) |
| mock_device.adb = mock.Mock(spec=adb.AdbProxy) |
| mock_device.adb.instrument = fake_instrument |
| return self.run_instrumentation_test( |
| mock_device, MOCK_TEST_PACKAGE, prefix=prefix) |
| |
| |
| 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 = 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 = 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.assertEquals(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.assertEquals(actual_test.begin_time, expected_begin_time) |
| self.assertEquals(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() |