diff options
Diffstat (limited to 'tools/regression/test/test.py')
-rw-r--r-- | tools/regression/test/test.py | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/tools/regression/test/test.py b/tools/regression/test/test.py new file mode 100644 index 0000000000..5a627ea2b5 --- /dev/null +++ b/tools/regression/test/test.py @@ -0,0 +1,181 @@ +# Copyright (c) MetaCommunications, Inc. 2003-2005 +# +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +import difflib +import os +import re +import shutil +import string +import sys + + + +def scan_for_test_cases(): + return [ os.path.join( "test-cases", x ) for x in os.listdir( "test-cases" ) if x != "CVS" ] + +def clean_dir( dir ): + if os.path.exists( dir ): + shutil.rmtree( dir ) + os.makedirs( dir ) + +def system( commands ): + if sys.platform == 'win32': + f = open( 'tmp.cmd', 'w' ) + f.write( string.join( commands, '\n' ) ) + f.close() + rc = os.system( 'tmp.cmd' ) + os.unlink( 'tmp.cmd' ) + return rc + else: + rc = os.system( '&&'.join( commands ) ) + return rc + +def checked_system( commands, valid_return_codes = [ 0 ] ): + rc = system( commands ) + if rc not in [ 0 ] + valid_return_codes: + raise Exception( 'Command sequence "%s" failed with return code %d' % ( commands, rc ) ) + return rc + +def list_recursively( dir ): + r = [] + for root, dirs, files in os.walk( dir, topdown=False ): + root = root[ len( dir ) + 1 : ] + r.extend( [ os.path.join( root, x ) for x in dirs ] ) + r.extend( [ os.path.join( root, x ) for x in files ] ) + + return r + +def find_process_jam_log(): + root = "../../../" + + for root, dirs, files in os.walk( os.path.join( root, "bin.v2" ), topdown=False ): + if "process_jam_log.exe" in files: + return os.path.abspath( os.path.normpath( os.path.join( root, "process_jam_log.exe" ) ) ) + if "process_jam_log" in files: + return os.path.abspath( os.path.normpath( os.path.join( root, "process_jam_log" ) ) ) + return None + +def process_jam_log( executable, file, locate_root, results_dir ): + args = [] + args.append( executable ) + # args.append( '--echo' ) + args.append( '--create-directories' ) + args.append( '--v2' ) + args.append( locate_root ) + args.append( '<' ) + args.append( file ) + + cmd = " ".join( args ) + print "Running process_jam_log (%s)" % cmd + checked_system( [ cmd ] ) + + +def read_file( file_path ): + f = open( file_path ) + try: + return f.read() + finally: + f.close() + +def remove_timestamps( log_lines ): + return [ re.sub( "timestamp=\"[^\"]+\"", "timestamp=\"\"", x ) for x in log_lines ] + +def determine_locate_root( bjam_log ): + locate_root = None + f = open( 'bjam.log' ) + try: + locate_root_re = re.compile( r'locate-root\s+"(.*)"' ) + for l in f.readlines(): + m = locate_root_re.match( l ) + if m: + locate_root = m.group(1) + break + finally: + f.close() + return locate_root + +def read_file( path ): + f = open( path ) + try: + return f.read() + finally: + f.close() + +def read_file_lines( path ): + f = open( path ) + try: + return f.readlines() + finally: + f.close() + +def write_file( path, content ): + f = open( path, 'w' ) + try: + return f.write( content ) + finally: + f.close() + +def write_file_lines( path, content ): + f = open( path, 'w' ) + try: + return f.writelines( content ) + finally: + f.close() + + +def run_test_cases( test_cases ): + process_jam_log_executable = find_process_jam_log() + print 'Found process_jam_log: %s' % process_jam_log_executable + initial_dir = os.getcwd() + for test_case in test_cases: + os.chdir( initial_dir ) + print 'Running test case "%s"' % test_case + os.chdir( test_case ) + if os.path.exists( "expected" ): + locate_root = determine_locate_root( 'bjam.log' ) + print 'locate_root: %s' % locate_root + + actual_results_dir = os.path.join( test_case, "actual" ) + clean_dir( "actual" ) + os.chdir( "actual" ) + root = os.getcwd() + i = 0 + while 1: + if i == 0: + bjam_log_file = 'bjam.log' + else: + bjam_log_file = 'bjam.log.%0d' % i + i += 1 + print 'Looking for %s' % bjam_log_file + if not os.path.exists( os.path.join( '..', bjam_log_file ) ): + print ' does not exists' + break + print ' found' + write_file_lines(bjam_log_file.replace( 'bjam', 'bjam_' ), + [ x.replace( locate_root, root ) for x in read_file_lines( os.path.join( '..', bjam_log_file ) ) ] ) + + process_jam_log( executable = process_jam_log_executable + , results_dir = "." + , locate_root = root + , file=bjam_log_file.replace( 'bjam', 'bjam_' ) ) + + actual_content = list_recursively( "." ) + actual_content.sort() + result_xml = [] + for test_log in [ x for x in actual_content if os.path.splitext( x )[1] == '.xml' ]: + print 'reading %s' % test_log + result = [ re.sub( r'timestamp="(.*)"', 'timestamp="xxx"', x ) for x in read_file_lines( test_log ) ] + result_xml.extend( result ) + + write_file_lines( 'results.xml', result_xml ) + os.chdir( '..' ) + assert read_file( 'expected/results.xml' ) == read_file( 'actual/results.xml' ) + os.chdir( '..' ) + else: + raise ' Test case "%s" doesn\'t contain the expected results directory ("expected" )' % ( test_case ) + +run_test_cases( scan_for_test_cases() ) +# print find_process_jam_log() |