OLD | NEW |
| (Empty) |
1 #!/usr/bin/env python | |
2 # Copyright (c) 2010 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 """Unit tests for coverage_posix.py. | |
7 | |
8 Run a single test with a command such as: | |
9 ./coverage_posix_unittest.py CoveragePosixTest.testFindTestsAsArgs | |
10 | |
11 Waring that running a single test like that may interfere with the arg | |
12 parsing tests, since coverage_posix.py uses optparse.OptionParser() | |
13 which references globals. | |
14 """ | |
15 | |
16 import coverage_posix as coverage | |
17 import os | |
18 import sys | |
19 import tempfile | |
20 import unittest | |
21 | |
22 class CoveragePosixTest(unittest.TestCase): | |
23 | |
24 | |
25 def setUp(self): | |
26 self.parseArgs() | |
27 self.sample_test_names = ['zippy_tests', '../base/base.gyp:base_unittests'] | |
28 | |
29 def confirmSampleTestsArePresent(self, tests): | |
30 """Confirm the tests in self.sample_test_names are in some form in 'tests'. | |
31 | |
32 The Coverage object can munge them (e.g. add .exe to the end as needed. | |
33 Helper function for arg parsing, bundle file tests. | |
34 | |
35 Args: | |
36 tests: the parsed tests from a Coverage object. | |
37 """ | |
38 for simple_test_name in ('zippy_tests', 'base_unittests'): | |
39 found = False | |
40 for item in tests: | |
41 if simple_test_name in item: | |
42 found = True | |
43 break | |
44 self.assertTrue(found) | |
45 for not_test_name in ('kablammo', 'not_a_unittest'): | |
46 found = False | |
47 for item in tests: | |
48 if not_test_name in item: | |
49 found = True | |
50 break | |
51 self.assertFalse(found) | |
52 | |
53 def parseArgs(self): | |
54 """Setup and process arg parsing.""" | |
55 self.parser = coverage.CoverageOptionParser() | |
56 (self.options, self.args) = self.parser.parse_args() | |
57 self.options.directory = '.' | |
58 | |
59 def testSanity(self): | |
60 """Sanity check we're able to actually run the tests. | |
61 | |
62 Simply creating a Coverage instance checks a few things (e.g. on | |
63 Windows that the coverage tools can be found).""" | |
64 c = coverage.Coverage(self.options, self.args) | |
65 | |
66 def testRunBasicProcess(self): | |
67 """Test a simple run of a subprocess.""" | |
68 c = coverage.Coverage(self.options, self.args) | |
69 for code in range(2): | |
70 retcode = c.Run([sys.executable, '-u', '-c', | |
71 'import sys; sys.exit(%d)' % code], | |
72 ignore_error=True) | |
73 self.assertEqual(code, retcode) | |
74 | |
75 def testRunSlowProcess(self): | |
76 """Test program which prints slowly but doesn't hit our timeout. | |
77 | |
78 Overall runtime is longer than the timeout but output lines | |
79 trickle in keeping things alive. | |
80 """ | |
81 self.options.timeout = 2.5 | |
82 c = coverage.Coverage(self.options, self.args) | |
83 slowscript = ('import sys, time\n' | |
84 'for x in range(10):\n' | |
85 ' time.sleep(0.5)\n' | |
86 ' print "hi mom"\n' | |
87 'sys.exit(0)\n') | |
88 retcode = c.Run([sys.executable, '-u', '-c', slowscript]) | |
89 self.assertEqual(0, retcode) | |
90 | |
91 def testRunExcessivelySlowProcess(self): | |
92 """Test program which DOES hit our timeout. | |
93 | |
94 Initial lines should print but quickly it takes too long and | |
95 should be killed. | |
96 """ | |
97 self.options.timeout = 2.5 | |
98 c = coverage.Coverage(self.options, self.args) | |
99 slowscript = ('import time\n' | |
100 'for x in range(1,10):\n' | |
101 ' print "sleeping for %d" % x\n' | |
102 ' time.sleep(x)\n') | |
103 self.assertRaises(Exception, | |
104 c.Run, | |
105 [sys.executable, '-u', '-c', slowscript]) | |
106 | |
107 def testFindTestsAsArgs(self): | |
108 """Test finding of tests passed as args.""" | |
109 self.args += '--' | |
110 self.args += self.sample_test_names | |
111 c = coverage.Coverage(self.options, self.args) | |
112 c.FindTests() | |
113 self.confirmSampleTestsArePresent(c.tests) | |
114 | |
115 def testFindTestsFromBundleFile(self): | |
116 """Test finding of tests from a bundlefile.""" | |
117 (fd, filename) = tempfile.mkstemp() | |
118 f = os.fdopen(fd, 'w') | |
119 f.write(str(self.sample_test_names)) | |
120 f.close() | |
121 self.options.bundles = filename | |
122 c = coverage.Coverage(self.options, self.args) | |
123 c.FindTests() | |
124 self.confirmSampleTestsArePresent(c.tests) | |
125 os.unlink(filename) | |
126 | |
127 def testExclusionList(self): | |
128 """Test the gtest_filter exclusion list.""" | |
129 c = coverage.Coverage(self.options, self.args) | |
130 self.assertFalse(c.GtestFilter('doesnotexist_test')) | |
131 fake_exclusions = { sys.platform: { 'foobar': | |
132 ('a','b'), | |
133 'doesnotexist_test': | |
134 ('Evil.Crash','Naughty.Test') } } | |
135 self.assertFalse(c.GtestFilter('barfoo')) | |
136 filter = c.GtestFilter('doesnotexist_test', fake_exclusions) | |
137 self.assertEquals('--gtest_filter=-Evil.Crash:-Naughty.Test', filter) | |
138 | |
139 | |
140 | |
141 if __name__ == '__main__': | |
142 unittest.main() | |
OLD | NEW |