1# Copyright 2017 Google Inc.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#     http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15import shutil
16import tempfile
17import unittest
18from unittest import mock
19
20from mobly import signals
21from mobly.base_instrumentation_test import _InstrumentationBlock
22from mobly.base_instrumentation_test import _InstrumentationKnownStatusKeys
23from mobly.base_instrumentation_test import _InstrumentationStructurePrefixes
24from tests.lib import mock_instrumentation_test
25
26# A random prefix to test that prefixes are added properly.
27MOCK_PREFIX = 'my_prefix'
28# A mock name for the instrumentation test subclass.
29MOCK_INSTRUMENTATION_TEST_CLASS_NAME = 'MockInstrumentationTest'
30
31MOCK_EMPTY_INSTRUMENTATION_TEST = """\
32INSTRUMENTATION_RESULT: stream=
33
34Time: 0.001
35
36OK (0 tests)
37
38
39INSTRUMENTATION_CODE: -1
40"""
41
42
43class InstrumentationResult:
44
45  def __init__(self):
46    self.error = None
47    self.completed_and_passed = False
48    self.executed = []
49    self.skipped = []
50
51
52class BaseInstrumentationTestTest(unittest.TestCase):
53
54  def setUp(self):
55    self.tmp_dir = tempfile.mkdtemp()
56
57  def tearDown(self):
58    shutil.rmtree(self.tmp_dir)
59
60  def assert_parse_instrumentation_options(
61      self, user_params, expected_instrumentation_options
62  ):
63    mit = mock_instrumentation_test.MockInstrumentationTest(
64        self.tmp_dir, user_params
65    )
66    instrumentation_options = mit.parse_instrumentation_options(mit.user_params)
67    self.assertEqual(instrumentation_options, expected_instrumentation_options)
68
69  def test_parse_instrumentation_options_with_no_user_params(self):
70    self.assert_parse_instrumentation_options({}, {})
71
72  def test_parse_instrumentation_options_with_no_instrumentation_params(self):
73    self.assert_parse_instrumentation_options(
74        {
75            'param1': 'val1',
76            'param2': 'val2',
77        },
78        {},
79    )
80
81  def test_parse_instrumentation_options_with_only_instrumentation_params(self):
82    self.assert_parse_instrumentation_options(
83        {
84            'instrumentation_option_key1': 'value1',
85            'instrumentation_option_key2': 'value2',
86        },
87        {'key1': 'value1', 'key2': 'value2'},
88    )
89
90  def test_parse_instrumentation_options_with_mixed_user_params(self):
91    self.assert_parse_instrumentation_options(
92        {
93            'param1': 'val1',
94            'param2': 'val2',
95            'instrumentation_option_key1': 'value1',
96            'instrumentation_option_key2': 'value2',
97        },
98        {'key1': 'value1', 'key2': 'value2'},
99    )
100
101  def run_instrumentation_test(self, instrumentation_output, prefix=None):
102    mit = mock_instrumentation_test.MockInstrumentationTest(self.tmp_dir)
103    result = InstrumentationResult()
104    try:
105      result.completed_and_passed = mit.run_mock_instrumentation_test(
106          instrumentation_output, prefix=prefix
107      )
108    except signals.TestError as e:
109      result.error = e
110    result.executed = mit.results.executed
111    result.skipped = mit.results.skipped
112    return result
113
114  def assert_equal_test(self, actual_test, expected_test):
115    (expected_test_name, expected_signal) = expected_test
116    self.assertEqual(
117        actual_test.test_class, MOCK_INSTRUMENTATION_TEST_CLASS_NAME
118    )
119    self.assertEqual(actual_test.test_name, expected_test_name)
120    self.assertIsInstance(
121        actual_test.termination_signal.exception, expected_signal
122    )
123
124  def assert_run_instrumentation_test(
125      self,
126      instrumentation_output,
127      expected_executed=[],
128      expected_skipped=[],
129      expected_completed_and_passed=False,
130      expected_has_error=False,
131      prefix=None,
132      expected_executed_times=[],
133  ):
134    result = self.run_instrumentation_test(
135        bytes(instrumentation_output, 'utf-8'), prefix=prefix
136    )
137    if expected_has_error:
138      self.assertIsInstance(result.error, signals.TestError)
139    else:
140      self.assertIsNone(result.error)
141      self.assertEqual(
142          result.completed_and_passed, expected_completed_and_passed
143      )
144    self.assertEqual(len(result.executed), len(expected_executed))
145    for actual_test, expected_test in zip(result.executed, expected_executed):
146      self.assert_equal_test(actual_test, expected_test)
147    self.assertEqual(len(result.skipped), len(expected_skipped))
148    for actual_test, expected_test in zip(result.skipped, expected_skipped):
149      self.assert_equal_test(actual_test, expected_test)
150    if expected_executed_times:
151      for actual_test, expected_time in zip(
152          result.executed, expected_executed_times
153      ):
154        (expected_begin_time, expected_end_time) = expected_time
155        self.assertEqual(actual_test.begin_time, expected_begin_time)
156        self.assertEqual(actual_test.end_time, expected_end_time)
157
158  def test_run_instrumentation_test_with_invalid_syntax(self):
159    instrumentation_output = """\
160usage: am [subcommand] [options]
161usage: am start [-D] [-N] [-W] [-P <FILE>] [--start-profiler <FILE>]
162         [--sampling INTERVAL] [-R COUNT] [-S]
163
164am start: start an Activity.  Options are:
165  -D: enable debugging
166
167am startservice: start a Service.  Options are:
168  --user <USER_ID> | current: Specify which user to run as; if not
169    specified then run as the current user.
170
171am task lock: bring <TASK_ID> to the front and don't allow other tasks to run.
172
173<INTENT> specifications include these flags and arguments:
174  [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
175  [-c <CATEGORY> [-c <CATEGORY>] ...]
176
177Error: Bad component name: /
178"""
179    self.assert_run_instrumentation_test(
180        instrumentation_output, expected_has_error=True
181    )
182
183  def test_run_instrumentation_test_with_no_output(self):
184    instrumentation_output = """\
185"""
186    self.assert_run_instrumentation_test(
187        instrumentation_output, expected_has_error=True
188    )
189
190  def test_run_instrumentation_test_with_missing_test_package(self):
191    instrumentation_output = """\
192android.util.AndroidException: INSTRUMENTATION_FAILED: com.my.package.test/com.my.package.test.runner.MyRunner
193  at com.android.commands.am.Am.runInstrument(Am.java:897)
194  at com.android.commands.am.Am.onRun(Am.java:405)
195  at com.android.internal.os.BaseCommand.run(BaseCommand.java:51)
196  at com.android.commands.am.Am.main(Am.java:124)
197  at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
198  at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:262)
199INSTRUMENTATION_STATUS: id=ActivityManagerService
200INSTRUMENTATION_STATUS: Error=Unable to find instrumentation info for: ComponentInfo{com.my.package.test/com.my.package.test.runner.MyRunner}
201INSTRUMENTATION_STATUS_CODE: -1"""
202    self.assert_run_instrumentation_test(
203        instrumentation_output, expected_has_error=True
204    )
205
206  def test_run_instrumentation_test_with_missing_runner(self):
207    instrumentation_output = """\
208android.util.AndroidException: INSTRUMENTATION_FAILED: com.my.package.test/com.my.package.test.runner
209INSTRUMENTATION_STATUS: id=ActivityManagerService
210INSTRUMENTATION_STATUS: Error=Unable to find instrumentation info for: ComponentInfo{com.my.package.test/com.my.package.test.runner}
211INSTRUMENTATION_STATUS_CODE: -1
212  at com.android.commands.am.Am.runInstrument(Am.java:897)
213  at com.android.commands.am.Am.onRun(Am.java:405)
214  at com.android.internal.os.BaseCommand.run(BaseCommand.java:51)
215  at com.android.commands.am.Am.main(Am.java:124)
216  at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
217  at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:262)"""
218    self.assert_run_instrumentation_test(
219        instrumentation_output, expected_has_error=True
220    )
221
222  def test_run_instrumentation_test_with_no_tests(self):
223    instrumentation_output = MOCK_EMPTY_INSTRUMENTATION_TEST
224    self.assert_run_instrumentation_test(
225        instrumentation_output, expected_completed_and_passed=True
226    )
227
228  @mock.patch('logging.info')
229  def test_run_instrumentation_test_logs_correctly(self, mock_info_logger):
230    instrumentation_output = MOCK_EMPTY_INSTRUMENTATION_TEST
231    self.assert_run_instrumentation_test(
232        instrumentation_output, expected_completed_and_passed=True
233    )
234    for mock_call in mock_info_logger.mock_calls:
235      logged_format = mock_call[1][0]
236      self.assertIsInstance(logged_format, str)
237
238  @mock.patch('mobly.utils.get_current_epoch_time')
239  def test_run_instrumentation_test_with_passing_test(self, mock_get_time):
240    instrumentation_output = """\
241INSTRUMENTATION_STATUS: numtests=1
242INSTRUMENTATION_STATUS: stream=
243com.my.package.test.BasicTest:
244INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
245INSTRUMENTATION_STATUS: test=basicTest
246INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
247INSTRUMENTATION_STATUS: current=1
248INSTRUMENTATION_STATUS_CODE: 1
249INSTRUMENTATION_STATUS: numtests=1
250INSTRUMENTATION_STATUS: stream=.
251INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
252INSTRUMENTATION_STATUS: test=basicTest
253INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
254INSTRUMENTATION_STATUS: current=1
255INSTRUMENTATION_STATUS_CODE: 0
256INSTRUMENTATION_RESULT: stream=
257
258Time: 0.214
259
260OK (1 test)
261
262
263INSTRUMENTATION_CODE: -1
264"""
265    expected_executed = [
266        ('com.my.package.test.BasicTest#basicTest', signals.TestPass),
267    ]
268    mock_get_time.side_effect = [13, 51]
269    self.assert_run_instrumentation_test(
270        instrumentation_output,
271        expected_executed=expected_executed,
272        expected_completed_and_passed=True,
273        expected_executed_times=[(13, 51)],
274    )
275
276  def test_run_instrumentation_test_with_random_whitespace(self):
277    instrumentation_output = """\
278
279INSTRUMENTATION_STATUS: numtests=1
280
281INSTRUMENTATION_STATUS: stream=
282
283com.my.package.test.BasicTest:
284
285INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
286
287INSTRUMENTATION_STATUS: test=basicTest
288
289INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
290
291INSTRUMENTATION_STATUS: current=1
292
293INSTRUMENTATION_STATUS_CODE: 1
294
295INSTRUMENTATION_STATUS: numtests=1
296
297INSTRUMENTATION_STATUS: stream=.
298
299INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
300
301INSTRUMENTATION_STATUS: test=basicTest
302
303INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
304
305INSTRUMENTATION_STATUS: current=1
306
307INSTRUMENTATION_STATUS_CODE: 0
308
309INSTRUMENTATION_RESULT: stream=
310
311
312Time: 0.214
313
314
315OK (1 test)
316
317
318
319
320INSTRUMENTATION_CODE: -1
321
322"""
323    expected_executed = [
324        ('com.my.package.test.BasicTest#basicTest', signals.TestPass),
325    ]
326    self.assert_run_instrumentation_test(
327        instrumentation_output,
328        expected_executed=expected_executed,
329        expected_completed_and_passed=True,
330    )
331
332  def test_run_instrumentation_test_with_prefix_test(self):
333    instrumentation_output = """\
334INSTRUMENTATION_STATUS: numtests=1
335INSTRUMENTATION_STATUS: stream=
336com.my.package.test.BasicTest:
337INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
338INSTRUMENTATION_STATUS: test=basicTest
339INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
340INSTRUMENTATION_STATUS: current=1
341INSTRUMENTATION_STATUS_CODE: 1
342INSTRUMENTATION_STATUS: numtests=1
343INSTRUMENTATION_STATUS: stream=.
344INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
345INSTRUMENTATION_STATUS: test=basicTest
346INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
347INSTRUMENTATION_STATUS: current=1
348INSTRUMENTATION_STATUS_CODE: 0
349INSTRUMENTATION_RESULT: stream=
350
351Time: 0.214
352
353OK (1 test)
354
355
356INSTRUMENTATION_CODE: -1
357"""
358    expected_executed = [
359        (
360            '%s.com.my.package.test.BasicTest#basicTest' % MOCK_PREFIX,
361            signals.TestPass,
362        ),
363    ]
364    self.assert_run_instrumentation_test(
365        instrumentation_output,
366        expected_executed=expected_executed,
367        expected_completed_and_passed=True,
368        prefix=MOCK_PREFIX,
369    )
370
371  def test_run_instrumentation_test_with_failing_test(self):
372    instrumentation_output = """\
373INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
374INSTRUMENTATION_STATUS: current=1
375INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
376INSTRUMENTATION_STATUS: numtests=1
377INSTRUMENTATION_STATUS: stream=
378com.my.package.test.BasicTest:
379INSTRUMENTATION_STATUS: test=failingTest
380INSTRUMENTATION_STATUS_CODE: 1
381INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
382INSTRUMENTATION_STATUS: current=1
383INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
384INSTRUMENTATION_STATUS: numtests=1
385INSTRUMENTATION_STATUS: stack=java.lang.UnsupportedOperationException: dummy failing test
386  at com.my.package.test.BasicTest.failingTest(BasicTest.java:38)
387  at java.lang.reflect.Method.invoke(Native Method)
388  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
389  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
390  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
391  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
392  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
393  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
394  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
395  at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
396  at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
397  at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
398  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
399  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
400  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
401  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
402  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
403  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
404  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
405  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
406  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
407  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
408  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
409  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
410  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
411  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
412  at org.junit.runners.Suite.runChild(Suite.java:128)
413  at org.junit.runners.Suite.runChild(Suite.java:27)
414  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
415  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
416  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
417  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
418  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
419  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
420  at org.junit.runners.Suite.runChild(Suite.java:128)
421  at org.junit.runners.Suite.runChild(Suite.java:27)
422  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
423  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
424  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
425  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
426  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
427  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
428  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
429  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
430  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
431  at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
432  at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
433  at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
434  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
435
436INSTRUMENTATION_STATUS: stream=
437Error in failingTest(com.my.package.test.BasicTest):
438java.lang.UnsupportedOperationException: dummy failing test
439  at com.my.package.test.BasicTest.failingTest(BasicTest.java:38)
440  at java.lang.reflect.Method.invoke(Native Method)
441  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
442  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
443  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
444  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
445  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
446  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
447  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
448  at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
449  at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
450  at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
451  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
452  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
453  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
454  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
455  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
456  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
457  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
458  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
459  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
460  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
461  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
462  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
463  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
464  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
465  at org.junit.runners.Suite.runChild(Suite.java:128)
466  at org.junit.runners.Suite.runChild(Suite.java:27)
467  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
468  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
469  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
470  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
471  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
472  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
473  at org.junit.runners.Suite.runChild(Suite.java:128)
474  at org.junit.runners.Suite.runChild(Suite.java:27)
475  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
476  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
477  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
478  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
479  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
480  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
481  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
482  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
483  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
484  at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
485  at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
486  at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
487  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
488
489INSTRUMENTATION_STATUS: test=failingTest
490INSTRUMENTATION_STATUS_CODE: -2
491INSTRUMENTATION_RESULT: stream=
492
493Time: 1.92
494There was 1 failure:
4951) failingTest(com.my.package.test.BasicTest)
496java.lang.UnsupportedOperationException: dummy failing test
497  at com.my.package.test.BasicTest.failingTest(BasicTest.java:38)
498  at java.lang.reflect.Method.invoke(Native Method)
499  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
500  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
501  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
502  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
503  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
504  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
505  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
506  at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
507  at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
508  at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
509  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
510  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
511  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
512  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
513  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
514  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
515  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
516  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
517  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
518  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
519  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
520  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
521  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
522  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
523  at org.junit.runners.Suite.runChild(Suite.java:128)
524  at org.junit.runners.Suite.runChild(Suite.java:27)
525  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
526  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
527  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
528  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
529  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
530  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
531  at org.junit.runners.Suite.runChild(Suite.java:128)
532  at org.junit.runners.Suite.runChild(Suite.java:27)
533  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
534  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
535  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
536  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
537  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
538  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
539  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
540  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
541  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
542  at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
543  at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
544  at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
545  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
546
547FAILURES!!!
548Tests run: 1,  Failures: 1
549
550
551INSTRUMENTATION_CODE: -1"""
552    expected_executed = [
553        ('com.my.package.test.BasicTest#failingTest', signals.TestFailure),
554    ]
555    self.assert_run_instrumentation_test(
556        instrumentation_output, expected_executed=expected_executed
557    )
558
559  def test_run_instrumentation_test_with_assumption_failure_test(self):
560    instrumentation_output = """\
561INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
562INSTRUMENTATION_STATUS: current=1
563INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
564INSTRUMENTATION_STATUS: numtests=1
565INSTRUMENTATION_STATUS: stream=
566com.my.package.test.BasicTest:
567INSTRUMENTATION_STATUS: test=assumptionFailureTest
568INSTRUMENTATION_STATUS_CODE: 1
569INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
570INSTRUMENTATION_STATUS: current=1
571INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
572INSTRUMENTATION_STATUS: numtests=1
573INSTRUMENTATION_STATUS: stack=org.junit.AssumptionViolatedException: Assumption failure reason
574  at org.junit.Assume.assumeTrue(Assume.java:59)
575  at org.junit.Assume.assumeFalse(Assume.java:66)
576  at com.my.package.test.BasicTest.assumptionFailureTest(BasicTest.java:63)
577  at java.lang.reflect.Method.invoke(Native Method)
578  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
579  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
580  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
581  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
582  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
583  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
584  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
585  at com.my.package.test.MyBaseTest$3.evaluate(MyBaseTest.java:96)
586  at com.my.package.test.MyBaseTest$4.evaluate(MyBaseTest.java:109)
587  at com.my.package.test.MyBaseTest$2.evaluate(MyBaseTest.java:77)
588  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
589  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
590  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
591  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
592  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
593  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
594  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
595  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
596  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
597  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
598  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
599  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
600  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
601  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
602  at org.junit.runners.Suite.runChild(Suite.java:128)
603  at org.junit.runners.Suite.runChild(Suite.java:27)
604  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
605  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
606  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
607  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
608  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
609  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
610  at org.junit.runners.Suite.runChild(Suite.java:128)
611  at org.junit.runners.Suite.runChild(Suite.java:27)
612  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
613  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
614  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
615  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
616  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
617  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
618  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
619  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
620  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
621  at com.my.package.test.runner.BaseRunner.runTests(BaseRunner.java:344)
622  at com.my.package.test.runner.BaseRunner.onStart(BaseRunner.java:330)
623  at com.my.package.test.runner.BaseRunner.onStart(BaseRunner.java:253)
624  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
625
626INSTRUMENTATION_STATUS: stream=
627com.my.package.test.BasicTest:
628INSTRUMENTATION_STATUS: test=assumptionFailureTest
629INSTRUMENTATION_STATUS_CODE: -4
630INSTRUMENTATION_RESULT: stream=
631
632Time: 3.139
633
634OK (1 test)
635
636
637INSTRUMENTATION_CODE: -1"""
638    expected_skipped = [
639        (
640            'com.my.package.test.BasicTest#assumptionFailureTest',
641            signals.TestSkip,
642        ),
643    ]
644    self.assert_run_instrumentation_test(
645        instrumentation_output,
646        expected_skipped=expected_skipped,
647        expected_completed_and_passed=True,
648    )
649
650  def test_run_instrumentation_test_with_ignored_test(self):
651    instrumentation_output = """\
652INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
653INSTRUMENTATION_STATUS: current=1
654INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
655INSTRUMENTATION_STATUS: numtests=1
656INSTRUMENTATION_STATUS: stream=
657com.my.package.test.BasicTest:
658INSTRUMENTATION_STATUS: test=ignoredTest
659INSTRUMENTATION_STATUS_CODE: 1
660INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
661INSTRUMENTATION_STATUS: current=1
662INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
663INSTRUMENTATION_STATUS: numtests=1
664INSTRUMENTATION_STATUS: stream=
665com.my.package.test.BasicTest:
666INSTRUMENTATION_STATUS: test=ignoredTest
667INSTRUMENTATION_STATUS_CODE: -3
668INSTRUMENTATION_RESULT: stream=
669
670Time: 0.007
671
672OK (0 tests)
673
674
675INSTRUMENTATION_CODE: -1"""
676    expected_skipped = [
677        ('com.my.package.test.BasicTest#ignoredTest', signals.TestSkip),
678    ]
679    self.assert_run_instrumentation_test(
680        instrumentation_output,
681        expected_skipped=expected_skipped,
682        expected_completed_and_passed=True,
683    )
684
685  @mock.patch('mobly.utils.get_current_epoch_time')
686  def test_run_instrumentation_test_with_crashed_test(self, mock_get_time):
687    instrumentation_output = """\
688INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
689INSTRUMENTATION_STATUS: current=1
690INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
691INSTRUMENTATION_STATUS: numtests=1
692INSTRUMENTATION_STATUS: stream=
693com.my.package.test.BasicTest:
694INSTRUMENTATION_STATUS: test=crashTest
695INSTRUMENTATION_STATUS_CODE: 1
696INSTRUMENTATION_RESULT: shortMsg=Process crashed.
697INSTRUMENTATION_CODE: 0"""
698    expected_executed = [
699        ('com.my.package.test.BasicTest#crashTest', signals.TestError),
700    ]
701    mock_get_time.side_effect = [67, 942]
702    self.assert_run_instrumentation_test(
703        instrumentation_output,
704        expected_executed=expected_executed,
705        expected_has_error=True,
706        expected_executed_times=[(67, 942)],
707    )
708
709  @mock.patch('mobly.utils.get_current_epoch_time')
710  def test_run_instrumentation_test_with_crashing_test(self, mock_get_time):
711    instrumentation_output = """\
712INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
713INSTRUMENTATION_STATUS: current=1
714INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
715INSTRUMENTATION_STATUS: numtests=2
716INSTRUMENTATION_STATUS: stream=
717com.my.package.test.BasicTest:
718INSTRUMENTATION_STATUS: test=crashAndRecover1Test
719INSTRUMENTATION_STATUS_CODE: 1
720INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
721INSTRUMENTATION_STATUS: current=2
722INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
723INSTRUMENTATION_STATUS: numtests=2
724INSTRUMENTATION_STATUS: stream=
725com.my.package.test.BasicTest:
726INSTRUMENTATION_STATUS: test=crashAndRecover2Test
727INSTRUMENTATION_STATUS_CODE: 1
728INSTRUMENTATION_RESULT: stream=
729
730Time: 6.342
731
732OK (2 tests)
733
734
735INSTRUMENTATION_CODE: -1"""
736    expected_executed = [
737        (
738            'com.my.package.test.BasicTest#crashAndRecover1Test',
739            signals.TestError,
740        ),
741        (
742            'com.my.package.test.BasicTest#crashAndRecover2Test',
743            signals.TestError,
744        ),
745    ]
746    mock_get_time.side_effect = [16, 412, 4143, 6547]
747    # TODO(winterfrosts): Fix this issue with overlapping timing
748    self.assert_run_instrumentation_test(
749        instrumentation_output,
750        expected_executed=expected_executed,
751        expected_completed_and_passed=True,
752        expected_executed_times=[(16, 4143), (412, 6547)],
753    )
754
755  def test_run_instrumentation_test_with_runner_setup_crash(self):
756    instrumentation_output = """\
757INSTRUMENTATION_RESULT: shortMsg=Process crashed.
758INSTRUMENTATION_CODE: 0"""
759    self.assert_run_instrumentation_test(
760        instrumentation_output, expected_has_error=True
761    )
762
763  def test_run_instrumentation_test_with_runner_teardown_crash(self):
764    instrumentation_output = """\
765INSTRUMENTATION_STATUS: numtests=1
766INSTRUMENTATION_STATUS: stream=
767com.my.package.test.BasicTest:
768INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
769INSTRUMENTATION_STATUS: test=basicTest
770INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
771INSTRUMENTATION_STATUS: current=1
772INSTRUMENTATION_STATUS_CODE: 1
773INSTRUMENTATION_STATUS: numtests=1
774INSTRUMENTATION_STATUS: stream=.
775INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
776INSTRUMENTATION_STATUS: test=basicTest
777INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
778INSTRUMENTATION_STATUS: current=1
779INSTRUMENTATION_STATUS_CODE: 0
780INSTRUMENTATION_RESULT: shortMsg=Process crashed.
781INSTRUMENTATION_CODE: 0
782"""
783    expected_executed = [
784        ('com.my.package.test.BasicTest#basicTest', signals.TestPass),
785    ]
786    self.assert_run_instrumentation_test(
787        instrumentation_output,
788        expected_executed=expected_executed,
789        expected_has_error=True,
790    )
791
792  @mock.patch('mobly.utils.get_current_epoch_time')
793  def test_run_instrumentation_test_with_multiple_tests(self, mock_get_time):
794    instrumentation_output = """\
795INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
796INSTRUMENTATION_STATUS: current=1
797INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
798INSTRUMENTATION_STATUS: numtests=4
799INSTRUMENTATION_STATUS: stream=
800com.my.package.test.BasicTest:
801INSTRUMENTATION_STATUS: test=failingTest
802INSTRUMENTATION_STATUS_CODE: 1
803INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
804INSTRUMENTATION_STATUS: current=1
805INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
806INSTRUMENTATION_STATUS: numtests=4
807INSTRUMENTATION_STATUS: stack=java.lang.UnsupportedOperationException: dummy failing test
808  at com.my.package.test.BasicTest.failingTest(BasicTest.java:40)
809  at java.lang.reflect.Method.invoke(Native Method)
810  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
811  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
812  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
813  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
814  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
815  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
816  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
817  at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
818  at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
819  at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
820  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
821  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
822  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
823  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
824  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
825  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
826  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
827  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
828  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
829  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
830  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
831  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
832  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
833  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
834  at org.junit.runners.Suite.runChild(Suite.java:128)
835  at org.junit.runners.Suite.runChild(Suite.java:27)
836  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
837  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
838  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
839  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
840  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
841  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
842  at org.junit.runners.Suite.runChild(Suite.java:128)
843  at org.junit.runners.Suite.runChild(Suite.java:27)
844  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
845  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
846  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
847  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
848  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
849  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
850  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
851  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
852  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
853  at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
854  at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
855  at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
856  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
857
858INSTRUMENTATION_STATUS: stream=
859Error in failingTest(com.my.package.test.BasicTest):
860java.lang.UnsupportedOperationException: dummy failing test
861  at com.my.package.test.BasicTest.failingTest(BasicTest.java:40)
862  at java.lang.reflect.Method.invoke(Native Method)
863  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
864  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
865  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
866  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
867  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
868  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
869  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
870  at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
871  at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
872  at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
873  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
874  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
875  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
876  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
877  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
878  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
879  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
880  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
881  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
882  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
883  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
884  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
885  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
886  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
887  at org.junit.runners.Suite.runChild(Suite.java:128)
888  at org.junit.runners.Suite.runChild(Suite.java:27)
889  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
890  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
891  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
892  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
893  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
894  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
895  at org.junit.runners.Suite.runChild(Suite.java:128)
896  at org.junit.runners.Suite.runChild(Suite.java:27)
897  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
898  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
899  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
900  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
901  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
902  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
903  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
904  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
905  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
906  at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
907  at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
908  at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
909  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
910
911INSTRUMENTATION_STATUS: test=failingTest
912INSTRUMENTATION_STATUS_CODE: -2
913INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
914INSTRUMENTATION_STATUS: current=2
915INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
916INSTRUMENTATION_STATUS: numtests=4
917INSTRUMENTATION_STATUS: stream=
918INSTRUMENTATION_STATUS: test=assumptionFailureTest
919INSTRUMENTATION_STATUS_CODE: 1
920INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
921INSTRUMENTATION_STATUS: current=2
922INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
923INSTRUMENTATION_STATUS: numtests=4
924INSTRUMENTATION_STATUS: stack=org.junit.AssumptionViolatedException: Assumption failure reason
925  at org.junit.Assume.assumeTrue(Assume.java:59)
926  at com.my.package.test.BasicTest.assumptionFailureTest(BasicTest.java:61)
927  at java.lang.reflect.Method.invoke(Native Method)
928  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
929  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
930  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
931  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
932  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
933  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
934  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
935  at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
936  at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
937  at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
938  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
939  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
940  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
941  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
942  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
943  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
944  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
945  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
946  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
947  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
948  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
949  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
950  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
951  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
952  at org.junit.runners.Suite.runChild(Suite.java:128)
953  at org.junit.runners.Suite.runChild(Suite.java:27)
954  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
955  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
956  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
957  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
958  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
959  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
960  at org.junit.runners.Suite.runChild(Suite.java:128)
961  at org.junit.runners.Suite.runChild(Suite.java:27)
962  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
963  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
964  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
965  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
966  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
967  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
968  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
969  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
970  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
971  at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
972  at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
973  at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
974  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
975
976INSTRUMENTATION_STATUS: stream=
977INSTRUMENTATION_STATUS: test=assumptionFailureTest
978INSTRUMENTATION_STATUS_CODE: -4
979INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
980INSTRUMENTATION_STATUS: current=3
981INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
982INSTRUMENTATION_STATUS: numtests=4
983INSTRUMENTATION_STATUS: stream=
984INSTRUMENTATION_STATUS: test=ignoredTest
985INSTRUMENTATION_STATUS_CODE: 1
986INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
987INSTRUMENTATION_STATUS: current=3
988INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
989INSTRUMENTATION_STATUS: numtests=4
990INSTRUMENTATION_STATUS: stream=
991INSTRUMENTATION_STATUS: test=ignoredTest
992INSTRUMENTATION_STATUS_CODE: -3
993INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
994INSTRUMENTATION_STATUS: current=4
995INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
996INSTRUMENTATION_STATUS: numtests=4
997INSTRUMENTATION_STATUS: stream=
998INSTRUMENTATION_STATUS: test=passingTest
999INSTRUMENTATION_STATUS_CODE: 1
1000INSTRUMENTATION_STATUS: class=com.my.package.test.BasicTest
1001INSTRUMENTATION_STATUS: current=4
1002INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
1003INSTRUMENTATION_STATUS: numtests=4
1004INSTRUMENTATION_STATUS: stream=.
1005INSTRUMENTATION_STATUS: test=passingTest
1006INSTRUMENTATION_STATUS_CODE: 0
1007INSTRUMENTATION_RESULT: stream=
1008
1009Time: 4.131
1010There was 1 failure:
10111) failingTest(com.my.package.test.BasicTest)
1012java.lang.UnsupportedOperationException: dummy failing test
1013  at com.my.package.test.BasicTest.failingTest(BasicTest.java:40)
1014  at java.lang.reflect.Method.invoke(Native Method)
1015  at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:57)
1016  at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
1017  at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:59)
1018  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
1019  at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)
1020  at androidx.test.internal.runner.junit4.statement.RunAfters.evaluate(RunAfters.java:61)
1021  at androidx.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:433)
1022  at com.my.package.test.BaseTest$3.evaluate(BaseTest.java:96)
1023  at com.my.package.test.BaseTest$4.evaluate(BaseTest.java:109)
1024  at com.my.package.test.BaseTest$2.evaluate(BaseTest.java:77)
1025  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
1026  at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55)
1027  at org.junit.rules.RunRules.evaluate(RunRules.java:20)
1028  at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:81)
1029  at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:327)
1030  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:84)
1031  at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
1032  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
1033  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
1034  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
1035  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
1036  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
1037  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
1038  at androidx.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:99)
1039  at org.junit.runners.Suite.runChild(Suite.java:128)
1040  at org.junit.runners.Suite.runChild(Suite.java:27)
1041  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
1042  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
1043  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
1044  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
1045  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
1046  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
1047  at org.junit.runners.Suite.runChild(Suite.java:128)
1048  at org.junit.runners.Suite.runChild(Suite.java:27)
1049  at org.junit.runners.ParentRunner$3.run(ParentRunner.java:292)
1050  at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:73)
1051  at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:290)
1052  at org.junit.runners.ParentRunner.access$000(ParentRunner.java:60)
1053  at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:270)
1054  at org.junit.runners.ParentRunner.run(ParentRunner.java:370)
1055  at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
1056  at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
1057  at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
1058  at com.my.package.test.BaseRunner.runTests(BaseRunner.java:344)
1059  at com.my.package.test.BaseRunner.onStart(BaseRunner.java:330)
1060  at com.my.package.test.runner.MyRunner.onStart(MyRunner.java:253)
1061  at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2074)
1062
1063FAILURES!!!
1064Tests run: 3,  Failures: 1
1065
1066
1067INSTRUMENTATION_CODE: -1"""
1068    expected_executed = [
1069        ('com.my.package.test.BasicTest#failingTest', signals.TestFailure),
1070        ('com.my.package.test.BasicTest#passingTest', signals.TestPass),
1071    ]
1072    expected_skipped = [
1073        (
1074            'com.my.package.test.BasicTest#assumptionFailureTest',
1075            signals.TestSkip,
1076        ),
1077        ('com.my.package.test.BasicTest#ignoredTest', signals.TestSkip),
1078    ]
1079    mock_get_time.side_effect = [54, 64, -1, -1, -1, -1, 89, 94]
1080    self.assert_run_instrumentation_test(
1081        instrumentation_output,
1082        expected_executed=expected_executed,
1083        expected_skipped=expected_skipped,
1084        expected_executed_times=[(54, 64), (89, 94)],
1085    )
1086
1087  def test__Instrumentation_block_set_key_on_multiple_equals_sign(self):
1088    value = 'blah=blah, blah2=blah2, blah=2=1=2'
1089    parsed_line = 'INSTRUMENTATION_STATUS: stack=%s' % value
1090    block = _InstrumentationBlock()
1091    block.set_key(_InstrumentationStructurePrefixes.STATUS, parsed_line)
1092    self.assertIn(
1093        value, block.known_keys[_InstrumentationKnownStatusKeys.STACK]
1094    )
1095
1096
1097if __name__ == '__main__':
1098  unittest.main()
1099