# 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] ") 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()