Home | History | Annotate | Download | only in instrumentation
      1 #!/usr/bin/env python
      2 # Copyright 2014 The Chromium Authors. All rights reserved.
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 
      6 
      7 """Unit tests for instrumentation.TestRunner."""
      8 
      9 # pylint: disable=W0212
     10 
     11 import os
     12 import sys
     13 import unittest
     14 
     15 from pylib import constants
     16 from pylib.base import base_test_result
     17 from pylib.instrumentation import test_runner
     18 
     19 sys.path.append(os.path.join(
     20     constants.DIR_SOURCE_ROOT, 'third_party', 'pymock'))
     21 import mock  # pylint: disable=F0401
     22 
     23 
     24 class InstrumentationTestRunnerTest(unittest.TestCase):
     25 
     26   def setUp(self):
     27     options = mock.Mock()
     28     options.tool = ''
     29     package = mock.Mock()
     30     self.instance = test_runner.TestRunner(options, None, 0, package)
     31 
     32   def testParseAmInstrumentRawOutput_nothing(self):
     33     code, result, statuses = (
     34         test_runner.TestRunner._ParseAmInstrumentRawOutput(['']))
     35     self.assertEqual(None, code)
     36     self.assertEqual([], result)
     37     self.assertEqual([], statuses)
     38 
     39   def testParseAmInstrumentRawOutput_noMatchingStarts(self):
     40     raw_output = [
     41       '',
     42       'this.is.a.test.package.TestClass:.',
     43       'Test result for =.',
     44       'Time: 1.234',
     45       '',
     46       'OK (1 test)',
     47     ]
     48 
     49     code, result, statuses = (
     50         test_runner.TestRunner._ParseAmInstrumentRawOutput(raw_output))
     51     self.assertEqual(None, code)
     52     self.assertEqual([], result)
     53     self.assertEqual([], statuses)
     54 
     55   def testParseAmInstrumentRawOutput_resultAndCode(self):
     56     raw_output = [
     57       'INSTRUMENTATION_RESULT: foo',
     58       'bar',
     59       'INSTRUMENTATION_CODE: -1',
     60     ]
     61 
     62     code, result, _ = (
     63         test_runner.TestRunner._ParseAmInstrumentRawOutput(raw_output))
     64     self.assertEqual(-1, code)
     65     self.assertEqual(['foo', 'bar'], result)
     66 
     67   def testParseAmInstrumentRawOutput_oneStatus(self):
     68     raw_output = [
     69       'INSTRUMENTATION_STATUS: foo=1',
     70       'INSTRUMENTATION_STATUS: bar=hello',
     71       'INSTRUMENTATION_STATUS: world=false',
     72       'INSTRUMENTATION_STATUS: class=this.is.a.test.package.TestClass',
     73       'INSTRUMENTATION_STATUS: test=testMethod',
     74       'INSTRUMENTATION_STATUS_CODE: 0',
     75     ]
     76 
     77     _, _, statuses = (
     78         test_runner.TestRunner._ParseAmInstrumentRawOutput(raw_output))
     79 
     80     expected = [
     81       (0, {
     82         'foo': ['1'],
     83         'bar': ['hello'],
     84         'world': ['false'],
     85         'class': ['this.is.a.test.package.TestClass'],
     86         'test': ['testMethod'],
     87       })
     88     ]
     89     self.assertEqual(expected, statuses)
     90 
     91   def testParseAmInstrumentRawOutput_multiStatus(self):
     92     raw_output = [
     93       'INSTRUMENTATION_STATUS: class=foo',
     94       'INSTRUMENTATION_STATUS: test=bar',
     95       'INSTRUMENTATION_STATUS_CODE: 1',
     96       'INSTRUMENTATION_STATUS: test_skipped=true',
     97       'INSTRUMENTATION_STATUS_CODE: 0',
     98       'INSTRUMENTATION_STATUS: class=hello',
     99       'INSTRUMENTATION_STATUS: test=world',
    100       'INSTRUMENTATION_STATUS: stack=',
    101       'foo/bar.py (27)',
    102       'hello/world.py (42)',
    103       'test/file.py (1)',
    104       'INSTRUMENTATION_STATUS_CODE: -1',
    105     ]
    106 
    107     _, _, statuses = (
    108         test_runner.TestRunner._ParseAmInstrumentRawOutput(raw_output))
    109 
    110     expected = [
    111       (1, {'class': ['foo'], 'test': ['bar'],}),
    112       (0, {'test_skipped': ['true']}),
    113       (-1, {
    114         'class': ['hello'],
    115         'test': ['world'],
    116         'stack': ['', 'foo/bar.py (27)', 'hello/world.py (42)',
    117                   'test/file.py (1)'],
    118       }),
    119     ]
    120     self.assertEqual(expected, statuses)
    121 
    122   def testParseAmInstrumentRawOutput_statusResultAndCode(self):
    123     raw_output = [
    124       'INSTRUMENTATION_STATUS: class=foo',
    125       'INSTRUMENTATION_STATUS: test=bar',
    126       'INSTRUMENTATION_STATUS_CODE: 1',
    127       'INSTRUMENTATION_RESULT: hello',
    128       'world',
    129       '',
    130       '',
    131       'INSTRUMENTATION_CODE: 0',
    132     ]
    133 
    134     code, result, statuses = (
    135         test_runner.TestRunner._ParseAmInstrumentRawOutput(raw_output))
    136 
    137     self.assertEqual(0, code)
    138     self.assertEqual(['hello', 'world', '', ''], result)
    139     self.assertEqual([(1, {'class': ['foo'], 'test': ['bar']})], statuses)
    140 
    141   def testGenerateTestResult_noStatus(self):
    142     result = self.instance._GenerateTestResult(
    143         'test.package.TestClass#testMethod', [], 0, 1000)
    144     self.assertEqual('test.package.TestClass#testMethod', result.GetName())
    145     self.assertEqual(base_test_result.ResultType.UNKNOWN, result.GetType())
    146     self.assertEqual('', result.GetLog())
    147     self.assertEqual(1000, result.GetDur())
    148 
    149   def testGenerateTestResult_testPassed(self):
    150     statuses = [
    151       (1, {
    152         'class': ['test.package.TestClass'],
    153         'test': ['testMethod'],
    154       }),
    155       (0, {
    156         'class': ['test.package.TestClass'],
    157         'test': ['testMethod'],
    158       }),
    159     ]
    160     result = self.instance._GenerateTestResult(
    161         'test.package.TestClass#testMethod', statuses, 0, 1000)
    162     self.assertEqual(base_test_result.ResultType.PASS, result.GetType())
    163 
    164   def testGenerateTestResult_testSkipped_first(self):
    165     statuses = [
    166       (0, {
    167         'test_skipped': ['true'],
    168       }),
    169       (1, {
    170         'class': ['test.package.TestClass'],
    171         'test': ['testMethod'],
    172       }),
    173       (0, {
    174         'class': ['test.package.TestClass'],
    175         'test': ['testMethod'],
    176       }),
    177     ]
    178     result = self.instance._GenerateTestResult(
    179         'test.package.TestClass#testMethod', statuses, 0, 1000)
    180     self.assertEqual(base_test_result.ResultType.SKIP, result.GetType())
    181 
    182   def testGenerateTestResult_testSkipped_last(self):
    183     statuses = [
    184       (1, {
    185         'class': ['test.package.TestClass'],
    186         'test': ['testMethod'],
    187       }),
    188       (0, {
    189         'class': ['test.package.TestClass'],
    190         'test': ['testMethod'],
    191       }),
    192       (0, {
    193         'test_skipped': ['true'],
    194       }),
    195     ]
    196     result = self.instance._GenerateTestResult(
    197         'test.package.TestClass#testMethod', statuses, 0, 1000)
    198     self.assertEqual(base_test_result.ResultType.SKIP, result.GetType())
    199 
    200   def testGenerateTestResult_testSkipped_false(self):
    201     statuses = [
    202       (0, {
    203         'test_skipped': ['false'],
    204       }),
    205       (1, {
    206         'class': ['test.package.TestClass'],
    207         'test': ['testMethod'],
    208       }),
    209       (0, {
    210         'class': ['test.package.TestClass'],
    211         'test': ['testMethod'],
    212       }),
    213     ]
    214     result = self.instance._GenerateTestResult(
    215         'test.package.TestClass#testMethod', statuses, 0, 1000)
    216     self.assertEqual(base_test_result.ResultType.PASS, result.GetType())
    217 
    218   def testGenerateTestResult_testFailed(self):
    219     statuses = [
    220       (1, {
    221         'class': ['test.package.TestClass'],
    222         'test': ['testMethod'],
    223       }),
    224       (-2, {
    225         'class': ['test.package.TestClass'],
    226         'test': ['testMethod'],
    227       }),
    228     ]
    229     result = self.instance._GenerateTestResult(
    230         'test.package.TestClass#testMethod', statuses, 0, 1000)
    231     self.assertEqual(base_test_result.ResultType.FAIL, result.GetType())
    232 
    233   def testGenerateTestResult_testCrashed(self):
    234     self.instance.test_pkg.GetPackageName = mock.Mock(
    235         return_value='generate.test.result.test.package')
    236     self.instance.device.old_interface.DismissCrashDialogIfNeeded = mock.Mock(
    237         return_value='generate.test.result.test.package')
    238     statuses = [
    239       (1, {
    240         'class': ['test.package.TestClass'],
    241         'test': ['testMethod'],
    242       }),
    243       (-1, {
    244         'class': ['test.package.TestClass'],
    245         'test': ['testMethod'],
    246         'stack': ['', 'foo/bar.py (27)', 'hello/world.py (42)'],
    247       }),
    248     ]
    249     result = self.instance._GenerateTestResult(
    250         'test.package.TestClass#testMethod', statuses, 0, 1000)
    251     self.assertEqual(base_test_result.ResultType.CRASH, result.GetType())
    252     self.assertEqual('\nfoo/bar.py (27)\nhello/world.py (42)', result.GetLog())
    253 
    254   def test_RunTest_verifyAdbShellCommand(self):
    255     self.instance.options.test_runner = 'MyTestRunner'
    256     self.instance.device.RunShellCommand = mock.Mock()
    257     self.instance.test_pkg.GetPackageName = mock.Mock(
    258         return_value='test.package')
    259     self.instance._GetInstrumentationArgs = mock.Mock(
    260         return_value={'test_arg_key': 'test_arg_value'})
    261     self.instance._RunTest('test.package.TestClass#testMethod', 100)
    262     self.instance.device.RunShellCommand.assert_called_with(
    263         ['am', 'instrument', '-r',
    264          '-e', 'test_arg_key', "'test_arg_value'",
    265          '-e', 'class', "'test.package.TestClass#testMethod'",
    266          '-w', 'test.package/MyTestRunner'],
    267         timeout=100, retries=0)
    268 
    269 if __name__ == '__main__':
    270   unittest.main(verbosity=2)
    271 
    272