12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- # 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()
|