| # Copyright 2009 Baptiste Lepilleur and The JsonCpp Authors | |
| # Distributed under MIT license, or public domain if desired and | |
| # recognized in your jurisdiction. | |
| # See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE | |
| from __future__ import print_function | |
| from __future__ import unicode_literals | |
| from io import open | |
| from glob import glob | |
| import sys | |
| import os | |
| import os.path | |
| import subprocess | |
| import optparse | |
| VALGRIND_CMD = 'valgrind --tool=memcheck --leak-check=yes --undef-value-errors=yes' | |
| class TestProxy(object): | |
| def __init__(self, test_exe_path, use_valgrind=False): | |
| self.test_exe_path = os.path.normpath(os.path.abspath(test_exe_path)) | |
| self.use_valgrind = use_valgrind | |
| def run(self, options): | |
| if self.use_valgrind: | |
| cmd = VALGRIND_CMD.split() | |
| else: | |
| cmd = [] | |
| cmd.extend([self.test_exe_path, '--test-auto'] + options) | |
| try: | |
| process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) | |
| except: | |
| print(cmd) | |
| raise | |
| stdout = process.communicate()[0] | |
| if process.returncode: | |
| return False, stdout | |
| return True, stdout | |
| def runAllTests(exe_path, use_valgrind=False): | |
| test_proxy = TestProxy(exe_path, use_valgrind=use_valgrind) | |
| status, test_names = test_proxy.run(['--list-tests']) | |
| if not status: | |
| print("Failed to obtain unit tests list:\n" + test_names, file=sys.stderr) | |
| return 1 | |
| test_names = [name.strip() for name in test_names.decode('utf-8').strip().split('\n')] | |
| failures = [] | |
| for name in test_names: | |
| print('TESTING %s:' % name, end=' ') | |
| succeed, result = test_proxy.run(['--test', name]) | |
| if succeed: | |
| print('OK') | |
| else: | |
| failures.append((name, result)) | |
| print('FAILED') | |
| failed_count = len(failures) | |
| pass_count = len(test_names) - failed_count | |
| if failed_count: | |
| print() | |
| for name, result in failures: | |
| print(result) | |
| print('%d/%d tests passed (%d failure(s))' % ( pass_count, len(test_names), failed_count)) | |
| return 1 | |
| else: | |
| print('All %d tests passed' % len(test_names)) | |
| return 0 | |
| def main(): | |
| from optparse import OptionParser | |
| parser = OptionParser(usage="%prog [options] <path to test_lib_json.exe>") | |
| parser.add_option("--valgrind", | |
| action="store_true", dest="valgrind", default=False, | |
| help="run all the tests using valgrind to detect memory leaks") | |
| parser.enable_interspersed_args() | |
| options, args = parser.parse_args() | |
| if len(args) != 1: | |
| parser.error('Must provides at least path to test_lib_json executable.') | |
| sys.exit(1) | |
| exit_code = runAllTests(args[0], use_valgrind=options.valgrind) | |
| sys.exit(exit_code) | |
| if __name__ == '__main__': | |
| main() |