summaryrefslogtreecommitdiffstats
path: root/tools/isolate/run_test_cases_smoke_test.py
blob: 62ba92efaa6902213d6ae896d81ee7e88e41814e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/usr/bin/env python
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import logging
import os
import re
import subprocess
import sys
import unittest

ROOT_DIR = os.path.dirname(os.path.abspath(__file__))

sys.path.append(os.path.join(ROOT_DIR, 'data', 'gtest_fake'))
import gtest_fake_base


def RunTest(test_file):
  target = os.path.join(ROOT_DIR, 'data', 'gtest_fake', test_file)
  cmd = [
      sys.executable,
      os.path.join(ROOT_DIR, 'run_test_cases.py'),
      '--no-dump',
      target,
  ]
  logging.debug(' '.join(cmd))
  proc = subprocess.Popen(
      cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    # pylint is confused.
  out, err = proc.communicate() or ('', '')

  return (out, err, proc.returncode)


class TraceTestCases(unittest.TestCase):
  def setUp(self):
    # Make sure there's no environment variable that could do side effects.
    os.environ.pop('GTEST_SHARD_INDEX', '')
    os.environ.pop('GTEST_TOTAL_SHARDS', '')

  def _check_results(self, expected_out_re, out, err):
    if sys.platform == 'win32':
      out = out.replace('\r\n', '\n')
    lines = out.splitlines()

    for index in range(len(expected_out_re)):
      line = lines.pop(0)
      self.assertTrue(
          re.match('^%s$' % expected_out_re[index], line),
          (index, expected_out_re[index], repr(line)))
    self.assertEquals([], lines)
    self.assertEquals('', err)

  def test_simple_pass(self):
    out, err, return_code = RunTest('gtest_fake_pass.py')

    self.assertEquals(0, return_code)

    expected_out_re = [
      r'\[\d/\d\]   \d\.\d\ds .+',
      r'\[\d/\d\]   \d\.\d\ds .+',
      r'\[\d/\d\]   \d\.\d\ds .+',
      re.escape('Success:    3 100.00%'),
      re.escape('Flaky:      0  0.00%'),
      re.escape('Fail:       0  0.00%'),
      r'\d+\.\ds Done running 3 tests with 3 executions. \d+\.\d test/s',
    ]

    self._check_results(expected_out_re, out, err)

  def test_simple_fail(self):
    out, err, return_code = RunTest('gtest_fake_fail.py')

    self.assertEquals(1, return_code)

    expected_out_re = [
      r'\[\d/\d\]   \d\.\d\ds .+',
      r'\[\d/\d\]   \d\.\d\ds .+',
      r'\[\d/\d\]   \d\.\d\ds .+',
      r'\[\d/\d\]   \d\.\d\ds .+',
      r'\[\d/\d\]   \d\.\d\ds .+',
      r'\[\d/\d\]   \d\.\d\ds .+',
      re.escape('Note: Google Test filter = Baz.Fail'),
      r'',
    ] + [
        re.escape(l) for l in
        gtest_fake_base.get_test_output('Baz.Fail').splitlines()
    ] + [
      '',
    ] + [
      re.escape(l) for l in gtest_fake_base.get_footer(1, 1).splitlines()
    ] + [
      '',
      re.escape('Success:    3 75.00%'),
      re.escape('Flaky:      0  0.00%'),
      re.escape('Fail:       1 25.00%'),
      r'\d+\.\ds Done running 4 tests with 6 executions. \d+\.\d test/s',
    ]
    self._check_results(expected_out_re, out, err)

  def test_simple_gtest_list_error(self):
    out, err, return_code = RunTest('gtest_fake_error.py')

    expected_out_re = [
        'Failed to run .+gtest_fake_error.py',
        'Unable to list tests'
    ]

    self.assertEqual(1, return_code)
    self._check_results(expected_out_re, out, err)


if __name__ == '__main__':
  VERBOSE = '-v' in sys.argv
  logging.basicConfig(level=logging.DEBUG if VERBOSE else logging.ERROR)
  unittest.main()