test: Add format-dependent comparison to bctest
This splits the output comparison for `bitcoin-tx` into two steps: - First, check for data mismatch, parsing the data as json or hex depending on the extension of the output file - Then, check if the literal string matches For either of these cases give a different error. This prevents wild goose chases when e.g. a trailing space doesn't match exactly, and makes sure that both test output and examples are valid data of the purported format.
This commit is contained in:
parent
2079d495f6
commit
3e2460b6f8
|
@ -3,8 +3,18 @@
|
|||
# file COPYING or https://www.opensource.org/licenses/mit-license.php .
|
||||
|
||||
import subprocess
|
||||
import os
|
||||
import json
|
||||
import sys
|
||||
import binascii
|
||||
|
||||
def parse_output(a, fmt):
|
||||
if fmt == 'json': # json: compare parsed data
|
||||
return json.loads(a)
|
||||
elif fmt == 'hex': # hex: parse and compare binary data
|
||||
return binascii.a2b_hex(a.strip())
|
||||
else:
|
||||
raise NotImplementedError("Don't know how to compare %s" % fmt)
|
||||
|
||||
def bctest(testDir, testObj, exeext):
|
||||
|
||||
|
@ -22,6 +32,7 @@ def bctest(testDir, testObj, exeext):
|
|||
outputData = None
|
||||
if "output_cmp" in testObj:
|
||||
outputFn = testObj['output_cmp']
|
||||
outputType = os.path.splitext(outputFn)[1][1:] # output type from file extension (determines how to compare)
|
||||
outputData = open(testDir + "/" + outputFn).read()
|
||||
if not outputData:
|
||||
print("Output data missing for " + outputFn)
|
||||
|
@ -33,9 +44,23 @@ def bctest(testDir, testObj, exeext):
|
|||
print("OSError, Failed to execute " + execprog)
|
||||
sys.exit(1)
|
||||
|
||||
if outputData and (outs[0] != outputData):
|
||||
print("Output data mismatch for " + outputFn)
|
||||
sys.exit(1)
|
||||
if outputData:
|
||||
try:
|
||||
a_parsed = parse_output(outs[0], outputType)
|
||||
except Exception as e:
|
||||
print('Error parsing command output as %s: %s' % (outputType,e))
|
||||
sys.exit(1)
|
||||
try:
|
||||
b_parsed = parse_output(outputData, outputType)
|
||||
except Exception as e:
|
||||
print('Error parsing expected output %s as %s: %s' % (outputFn,outputType,e))
|
||||
sys.exit(1)
|
||||
if a_parsed != b_parsed:
|
||||
print("Output data mismatch for " + outputFn + " (format " + outputType + ")")
|
||||
sys.exit(1)
|
||||
if outs[0] != outputData:
|
||||
print("Output formatting mismatch for " + outputFn + " (format " + outputType + ")")
|
||||
sys.exit(1)
|
||||
|
||||
wantRC = 0
|
||||
if "return_code" in testObj:
|
||||
|
|
Loading…
Reference in New Issue