@ -7,6 +7,8 @@ import os
import json
import json
import sys
import sys
import binascii
import binascii
import difflib
import logging
def parse_output ( a , fmt ) :
def parse_output ( a , fmt ) :
if fmt == ' json ' : # json: compare parsed data
if fmt == ' json ' : # json: compare parsed data
@ -33,53 +35,70 @@ def bctest(testDir, testObj, exeext):
if " output_cmp " in testObj :
if " output_cmp " in testObj :
outputFn = testObj [ ' output_cmp ' ]
outputFn = testObj [ ' output_cmp ' ]
outputType = os . path . splitext ( outputFn ) [ 1 ] [ 1 : ] # output type from file extension (determines how to compare)
outputType = os . path . splitext ( outputFn ) [ 1 ] [ 1 : ] # output type from file extension (determines how to compare)
try :
outputData = open ( testDir + " / " + outputFn ) . read ( )
outputData = open ( testDir + " / " + outputFn ) . read ( )
except :
logging . error ( " Output file " + outputFn + " can not be opened " )
raise
if not outputData :
if not outputData :
print ( " Output data missing for " + outputFn )
logging . error ( " Output data missing for " + outputFn )
sys . exit ( 1 )
raise Exception
proc = subprocess . Popen ( execrun , stdin = stdinCfg , stdout = subprocess . PIPE , stderr = subprocess . PIPE , universal_newlines = True )
proc = subprocess . Popen ( execrun , stdin = stdinCfg , stdout = subprocess . PIPE , stderr = subprocess . PIPE , universal_newlines = True )
try :
try :
outs = proc . communicate ( input = inputData )
outs = proc . communicate ( input = inputData )
except OSError :
except OSError :
print ( " OSError, Failed to execute " + execprog )
logging . error ( " OSError, Failed to execute " + execprog )
sys . exit ( 1 )
raise
if outputData :
if outputData :
try :
try :
a_parsed = parse_output ( outs [ 0 ] , outputType )
a_parsed = parse_output ( outs [ 0 ] , outputType )
except Exception as e :
except Exception as e :
print ( ' Error parsing command output as %s : %s ' % ( outputType , e ) )
logging . error ( ' Error parsing command output as %s : %s ' % ( outputType , e ) )
sys . exit ( 1 )
raise
try :
try :
b_parsed = parse_output ( outputData , outputType )
b_parsed = parse_output ( outputData , outputType )
except Exception as e :
except Exception as e :
print ( ' Error parsing expected output %s as %s : %s ' % ( outputFn , outputType , e ) )
logging . error ( ' Error parsing expected output %s as %s : %s ' % ( outputFn , outputType , e ) )
sys . exit ( 1 )
raise
if a_parsed != b_parsed :
if a_parsed != b_parsed :
print ( " Output data mismatch for " + outputFn + " (format " + outputType + " ) " )
logging . error ( " Output data mismatch for " + outputFn + " (format " + outputType + " ) " )
sys . exit ( 1 )
raise Exception
if outs [ 0 ] != outputData :
if outs [ 0 ] != outputData :
print ( " Output formatting mismatch for " + outputFn + " (format " + outputType + " ) " )
error_message = " Output formatting mismatch for " + outputFn + " : \n "
sys . exit ( 1 )
error_message + = " " . join ( difflib . context_diff ( outputData . splitlines ( True ) ,
outs [ 0 ] . splitlines ( True ) ,
fromfile = outputFn ,
tofile = " returned " ) )
logging . error ( error_message )
raise Exception
wantRC = 0
wantRC = 0
if " return_code " in testObj :
if " return_code " in testObj :
wantRC = testObj [ ' return_code ' ]
wantRC = testObj [ ' return_code ' ]
if proc . returncode != wantRC :
if proc . returncode != wantRC :
print ( " Return code mismatch for " + outputFn )
logging . error ( " Return code mismatch for " + outputFn )
sys . exit ( 1 )
raise Exception
def bctester ( testDir , input_basename , buildenv , verbose = False ) :
def bctester ( testDir , input_basename , buildenv ) :
input_filename = testDir + " / " + input_basename
input_filename = testDir + " / " + input_basename
raw_data = open ( input_filename ) . read ( )
raw_data = open ( input_filename ) . read ( )
input_data = json . loads ( raw_data )
input_data = json . loads ( raw_data )
failed_testcases = [ ]
for testObj in input_data :
for testObj in input_data :
if verbose and " description " in testObj :
try :
print ( " Testing: " + testObj [ " description " ] )
bctest ( testDir , testObj , buildenv . exeext )
bctest ( testDir , testObj , buildenv . exeext )
if verbose and " description " in testObj :
logging . info ( " PASSED: " + testObj [ " description " ] )
print ( " PASS " )
except :
logging . info ( " FAILED: " + testObj [ " description " ] )
failed_testcases . append ( testObj [ " description " ] )
if failed_testcases :
logging . error ( " FAILED TESTCASES: [ " + " , " . join ( failed_testcases ) + " ] " )
sys . exit ( 1 )
else :
sys . exit ( 0 )
sys . exit ( 0 )