85 lines
2.9 KiB
Python
85 lines
2.9 KiB
Python
|
# 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()
|