blob: dd1c9a379588691efa83db264ceaa7f359cf571a [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):
Christopher Dunn494950a2015-01-24 15:29:52 -060014 def __init__(self, test_exe_path, use_valgrind=False):
15 self.test_exe_path = os.path.normpath(os.path.abspath(test_exe_path))
Christopher Dunndc0f7362011-06-21 21:18:49 +000016 self.use_valgrind = use_valgrind
17
Christopher Dunn494950a2015-01-24 15:29:52 -060018 def run(self, options):
Christopher Dunndc0f7362011-06-21 21:18:49 +000019 if self.use_valgrind:
20 cmd = VALGRIND_CMD.split()
21 else:
22 cmd = []
Christopher Dunn494950a2015-01-24 15:29:52 -060023 cmd.extend([self.test_exe_path, '--test-auto'] + options)
Christopher Dunn4bc31152015-01-16 14:48:06 -060024 try:
Christopher Dunn494950a2015-01-24 15:29:52 -060025 process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
Christopher Dunn4bc31152015-01-16 14:48:06 -060026 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
Christopher Dunn494950a2015-01-24 15:29:52 -060034def 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'])
Christopher Dunndc0f7362011-06-21 21:18:49 +000037 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 Dunn494950a2015-01-24 15:29:52 -060044 succeed, result = test_proxy.run(['--test', name])
Christopher Dunndc0f7362011-06-21 21:18:49 +000045 if succeed:
Christopher Dunnbd1e8952014-11-19 23:30:47 -060046 print('OK')
Christopher Dunndc0f7362011-06-21 21:18:49 +000047 else:
Christopher Dunn494950a2015-01-24 15:29:52 -060048 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)
Christopher Dunn494950a2015-01-24 15:29:52 -060056 print('%d/%d tests passed (%d failure(s))' % ( pass_count, len(test_names), failed_count))
Christopher Dunndc0f7362011-06-21 21:18:49 +000057 return 1
58 else:
Christopher Dunnbd1e8952014-11-19 23:30:47 -060059 print('All %d tests passed' % len(test_names))
Christopher Dunndc0f7362011-06-21 21:18:49 +000060 return 0
61
62def main():
63 from optparse import OptionParser
Christopher Dunn494950a2015-01-24 15:29:52 -060064 parser = OptionParser(usage="%prog [options] <path to test_lib_json.exe>")
Christopher Dunndc0f7362011-06-21 21:18:49 +000065 parser.add_option("--valgrind",
66 action="store_true", dest="valgrind", default=False,
67 help="run all the tests using valgrind to detect memory leaks")
68 parser.enable_interspersed_args()
69 options, args = parser.parse_args()
70
71 if len(args) != 1:
Christopher Dunn494950a2015-01-24 15:29:52 -060072 parser.error('Must provides at least path to test_lib_json executable.')
73 sys.exit(1)
Christopher Dunndc0f7362011-06-21 21:18:49 +000074
Christopher Dunn494950a2015-01-24 15:29:52 -060075 exit_code = runAllTests(args[0], use_valgrind=options.valgrind)
76 sys.exit(exit_code)
Christopher Dunndc0f7362011-06-21 21:18:49 +000077
78if __name__ == '__main__':
79 main()