forked from runt18/py_trace_event
-
Notifications
You must be signed in to change notification settings - Fork 0
/
run_tests
executable file
·156 lines (137 loc) · 4.68 KB
/
run_tests
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#!/usr/bin/env python
# Copyright 2011 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 optparse
import os
import platform
import re
import sys
import types
import traceback
import unittest
def discover(dir, filters):
if hasattr(unittest.TestLoader, 'discover'):
return unittest.TestLoader().discover(dir, '*')
# poor mans unittest.discover
loader = unittest.TestLoader()
subsuites = []
for (dirpath, dirnames, filenames) in os.walk(dir):
for filename in [x for x in filenames if re.match('.*_test\.py$', x)]:
if filename.startswith('.') or filename.startswith('_'):
continue
fqn = dirpath.replace('/', '.') + '.' + re.match('(.+)\.py$', filename).group(1)
# load the test
try:
module = __import__(fqn,fromlist=[True])
except:
print "While importing [%s]\n" % fqn
traceback.print_exc()
continue
def test_is_selected(name):
for f in filters:
if re.search(f,name):
return True
return False
if hasattr(module, 'suite'):
base_suite = module.suite()
else:
base_suite = loader.loadTestsFromModule(module)
new_suite = unittest.TestSuite()
for t in base_suite:
if isinstance(t, unittest.TestSuite):
for i in t:
if test_is_selected(i.id()):
new_suite.addTest(i)
elif isinstance(t, unittest.TestCase):
if test_is_selected(t.id()):
new_suite.addTest(t)
else:
raise Exception("Wtf, expected TestSuite or TestCase, got %s" % t)
if new_suite.countTestCases():
subsuites.append(new_suite)
return unittest.TestSuite(subsuites)
def main():
parser = optparse.OptionParser()
parser.add_option(
'-v', '--verbose', action='count', default=0,
help='Increase verbosity level (repeat as needed)')
parser.add_option('--debug', dest='debug', action='store_true', default=False, help='Break into pdb when an assertion fails')
parser.add_option('--incremental', dest='incremental', action='store_true', default=False, help='Run tests one at a time.')
parser.add_option('--stop', dest='stop_on_error', action='store_true', default=False, help='Stop running tests on error.')
(options, args) = parser.parse_args()
if options.verbose >= 2:
logging.basicConfig(level=logging.DEBUG)
elif options.verbose:
logging.basicConfig(level=logging.INFO)
else:
logging.basicConfig(level=logging.WARNING)
# install hook on set_trace if --debug
if options.debug:
import exceptions
class DebuggingAssertionError(exceptions.AssertionError):
def __init__(self, *args):
exceptions.AssertionError.__init__(self, *args)
print "Assertion failed, entering PDB..."
import pdb
if hasattr(sys, '_getframe'):
pdb.Pdb().set_trace(sys._getframe().f_back.f_back)
else:
pdb.set_trace()
unittest.TestCase.failureException = DebuggingAssertionError
def hook(*args):
import traceback, pdb
traceback.print_exception(*args)
pdb.pm()
sys.excepthook = hook
import browser
browser.debug_mode = True
else:
def hook(exc, value, tb):
import traceback
if not str(value).startswith("_noprint"):
traceback.print_exception(exc, value, tb)
import src.message_loop
if src.message_loop.is_main_loop_running():
if not str(value).startswith("_noprint"):
print "Untrapped exception! Exiting message loop with exception."
src.message_loop.quit_main_loop(quit_with_exception=True)
sys.excepthook = hook
# make sure cwd is the base directory!
os.chdir(os.path.dirname(__file__))
if len(args) > 0:
suites = discover('trace_event_impl', args)
else:
suites = discover('trace_event_impl', ['.*'])
r = unittest.TextTestRunner()
if not options.incremental:
res = r.run(suites)
if res.wasSuccessful():
return 0
return 255
else:
ok = True
for s in suites:
if isinstance(s, unittest.TestSuite):
for t in s:
print '----------------------------------------------------------------------'
print 'Running %s' % str(t)
res = r.run(t)
if not res.wasSuccessful():
ok = False
if options.stop_on_error:
break
if ok == False and options.stop_on_error:
break
else:
res = r.run(s)
if not res.wasSuccessful():
ok = False
if options.stop_on_error:
break
if ok:
return 0
return 255
if __name__ == "__main__":
sys.exit(main())