blob: ccc54e45a3e331675254428009076dabf8ad9afe [file] [log] [blame]
Baptiste Lepilleur45c499d2009-11-21 18:07:09 +00001import sys
2import os
3import os.path
4import subprocess
5from glob import glob
6import optparse
7
8VALGRIND_CMD = 'valgrind --tool=memcheck --leak-check=yes --undef-value-errors=yes'
9
10class TestProxy(object):
11 def __init__( self, test_exe_path, use_valgrind=False ):
12 self.test_exe_path = os.path.normpath( os.path.abspath( test_exe_path ) )
13 self.use_valgrind = use_valgrind
14
15 def run( self, options ):
16 if self.use_valgrind:
17 cmd = VALGRIND_CMD.split()
18 else:
19 cmd = []
20 cmd.extend( [self.test_exe_path, '--test-auto'] + options )
21 process = subprocess.Popen( cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT )
22 stdout = process.communicate()[0]
23 if process.returncode:
24 return False, stdout
25 return True, stdout
26
27def runAllTests( exe_path, use_valgrind=False ):
28 test_proxy = TestProxy( exe_path, use_valgrind=use_valgrind )
29 status, test_names = test_proxy.run( ['--list-tests'] )
30 if not status:
31 print >> sys.stderr, "Failed to obtain unit tests list:\n" + test_names
32 return 1
33 test_names = [name.strip() for name in test_names.strip().split('\n')]
34 failures = []
35 for name in test_names:
36 print 'TESTING %s:' % name,
37 succeed, result = test_proxy.run( ['--test', name] )
38 if succeed:
39 print 'OK'
40 else:
41 failures.append( (name, result) )
42 print 'FAILED'
43 failed_count = len(failures)
44 pass_count = len(test_names) - failed_count
45 if failed_count:
46 print
47 for name, result in failures:
48 print result
49 print '%d/%d tests passed (%d failure(s))' % (
50 pass_count, len(test_names), failed_count)
51 return 1
52 else:
53 print 'All %d tests passed' % len(test_names)
54 return 0
55
56def main():
57 from optparse import OptionParser
58 parser = OptionParser( usage="%prog [options] <path to test_lib_json.exe>" )
59 parser.add_option("--valgrind",
60 action="store_true", dest="valgrind", default=False,
61 help="run all the tests using valgrind to detect memory leaks")
62 parser.enable_interspersed_args()
63 options, args = parser.parse_args()
64
65 if len(args) != 1:
66 parser.error( 'Must provides at least path to test_lib_json executable.' )
67 sys.exit( 1 )
68
69 exit_code = runAllTests( args[0], use_valgrind=options.valgrind )
70 sys.exit( exit_code )
71
72if __name__ == '__main__':
73 main()