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