blob: 54c4da42cd6551f58bebf93c0a4fcb34803aa6b5 [file] [log] [blame]
Christopher Dunnbd1e8952014-11-19 23:30:47 -06001from __future__ import print_function
Christopher Dunn4bc31152015-01-16 14:48:06 -06002from __future__ import unicode_literals
3from io import open
Christopher Dunnbd1e8952014-11-19 23:30:47 -06004from glob import glob
Christopher Dunndc0f7362011-06-21 21:18:49 +00005import sys
6import os
7import os.path
8import subprocess
Christopher Dunndc0f7362011-06-21 21:18:49 +00009import optparse
10
11VALGRIND_CMD = 'valgrind --tool=memcheck --leak-check=yes --undef-value-errors=yes'
12
13class TestProxy(object):
14 def __init__( self, test_exe_path, use_valgrind=False ):
15 self.test_exe_path = os.path.normpath( os.path.abspath( test_exe_path ) )
16 self.use_valgrind = use_valgrind
17
18 def run( self, options ):
19 if self.use_valgrind:
20 cmd = VALGRIND_CMD.split()
21 else:
22 cmd = []
23 cmd.extend( [self.test_exe_path, '--test-auto'] + options )
Christopher Dunn4bc31152015-01-16 14:48:06 -060024 try:
25 process = subprocess.Popen( cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT )
26 except:
27 print(cmd)
28 raise
Christopher Dunndc0f7362011-06-21 21:18:49 +000029 stdout = process.communicate()[0]
30 if process.returncode:
31 return False, stdout
32 return True, stdout
33
34def runAllTests( exe_path, use_valgrind=False ):
35 test_proxy = TestProxy( exe_path, use_valgrind=use_valgrind )
36 status, test_names = test_proxy.run( ['--list-tests'] )
37 if not status:
Christopher Dunnbd1e8952014-11-19 23:30:47 -060038 print("Failed to obtain unit tests list:\n" + test_names, file=sys.stderr)
Christopher Dunndc0f7362011-06-21 21:18:49 +000039 return 1
datadiode01aee4a2015-01-11 10:39:24 +010040 test_names = [name.strip() for name in test_names.decode('utf-8').strip().split('\n')]
Christopher Dunndc0f7362011-06-21 21:18:49 +000041 failures = []
42 for name in test_names:
Christopher Dunnbd1e8952014-11-19 23:30:47 -060043 print('TESTING %s:' % name, end=' ')
Christopher Dunndc0f7362011-06-21 21:18:49 +000044 succeed, result = test_proxy.run( ['--test', name] )
45 if succeed:
Christopher Dunnbd1e8952014-11-19 23:30:47 -060046 print('OK')
Christopher Dunndc0f7362011-06-21 21:18:49 +000047 else:
48 failures.append( (name, result) )
Christopher Dunnbd1e8952014-11-19 23:30:47 -060049 print('FAILED')
Christopher Dunndc0f7362011-06-21 21:18:49 +000050 failed_count = len(failures)
51 pass_count = len(test_names) - failed_count
52 if failed_count:
Christopher Dunnbd1e8952014-11-19 23:30:47 -060053 print()
Christopher Dunndc0f7362011-06-21 21:18:49 +000054 for name, result in failures:
Christopher Dunnbd1e8952014-11-19 23:30:47 -060055 print(result)
56 print('%d/%d tests passed (%d failure(s))' % (
57 pass_count, len(test_names), failed_count))
Christopher Dunndc0f7362011-06-21 21:18:49 +000058 return 1
59 else:
Christopher Dunnbd1e8952014-11-19 23:30:47 -060060 print('All %d tests passed' % len(test_names))
Christopher Dunndc0f7362011-06-21 21:18:49 +000061 return 0
62
63def main():
64 from optparse import OptionParser
65 parser = OptionParser( usage="%prog [options] <path to test_lib_json.exe>" )
66 parser.add_option("--valgrind",
67 action="store_true", dest="valgrind", default=False,
68 help="run all the tests using valgrind to detect memory leaks")
69 parser.enable_interspersed_args()
70 options, args = parser.parse_args()
71
72 if len(args) != 1:
73 parser.error( 'Must provides at least path to test_lib_json executable.' )
74 sys.exit( 1 )
75
76 exit_code = runAllTests( args[0], use_valgrind=options.valgrind )
77 sys.exit( exit_code )
78
79if __name__ == '__main__':
80 main()