mirror of
				https://github.com/open-source-parsers/jsoncpp.git
				synced 2025-11-04 02:32:19 -05:00 
			
		
		
		
	Requested/noticed in https://github.com/open-source-parsers/jsoncpp/pull/610, and a followup to https://github.com/open-source-parsers/jsoncpp/pull/607 .
		
			
				
	
	
		
			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()
 |