| #!/usr/bin/env python | |
| import sys | |
| import subprocess | |
| import traceback | |
| import json | |
| data = json.load(sys.stdin) | |
| testfile = sys.argv[1] | |
| prefix = "CHECK: " | |
| fails = 0 | |
| passes = 0 | |
| with open(testfile) as testfh: | |
| lineno = 0 | |
| for line in iter(testfh.readline, ""): | |
| lineno += 1 | |
| line = line.rstrip("\r\n") | |
| try: | |
| prefix_pos = line.index(prefix) | |
| except ValueError: | |
| continue | |
| check_expr = line[prefix_pos + len(prefix):] | |
| try: | |
| exception = None | |
| result = eval(check_expr, {"data":data}) | |
| except Exception: | |
| result = False | |
| exception = traceback.format_exc().splitlines()[-1] | |
| if exception is not None: | |
| sys.stderr.write( | |
| "{file}:{line:d}: check threw exception: {expr}\n" | |
| "{file}:{line:d}: exception was: {exception}\n".format( | |
| file=testfile, line=lineno, | |
| expr=check_expr, exception=exception)) | |
| fails += 1 | |
| elif not result: | |
| sys.stderr.write( | |
| "{file}:{line:d}: check returned False: {expr}\n".format( | |
| file=testfile, line=lineno, expr=check_expr)) | |
| fails += 1 | |
| else: | |
| passes += 1 | |
| if fails != 0: | |
| sys.exit("{} checks failed".format(fails)) | |
| else: | |
| sys.stdout.write("{} checks passed\n".format(passes)) |