Browse Source

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.
0.14
Wladimir J. van der Laan 8 years ago
parent
commit
6c5cd9d022
  1. 30
      src/test/bctest.py

30
src/test/bctest.py

@ -6,6 +6,15 @@ import subprocess
import os import os
import json import json
import sys 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): def bctest(testDir, testObj, exeext):
@ -23,6 +32,7 @@ def bctest(testDir, testObj, exeext):
outputData = None outputData = None
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)
outputData = open(testDir + "/" + outputFn).read() outputData = open(testDir + "/" + outputFn).read()
if not outputData: if not outputData:
print("Output data missing for " + outputFn) print("Output data missing for " + outputFn)
@ -34,9 +44,23 @@ def bctest(testDir, testObj, exeext):
print("OSError, Failed to execute " + execprog) print("OSError, Failed to execute " + execprog)
sys.exit(1) sys.exit(1)
if outputData and (outs[0] != outputData): if outputData:
print("Output data mismatch for " + outputFn) try:
sys.exit(1) 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 wantRC = 0
if "return_code" in testObj: if "return_code" in testObj:

Loading…
Cancel
Save