blob: 556d57983929118f180e310960dfcfc03ad9d82b [file] [log] [blame]
#!/usr/bin/python3
import os
import glob
import re
import sys
import subprocess
import shutil
import tempfile
successes = 0
failures = []
def TestFile(filename):
cwd = os.getcwd()
abspath = os.path.abspath(filename)
global successes
global failures
with open(abspath) as f:
print(filename)
tmpdir = tempfile.mkdtemp(prefix="/tmp/bloaty-")
contents = f.read()
file_count = len(re.findall(r'^---', contents, flags=re.MULTILINE))
for i in range(1, file_count + 1):
subprocess.check_call('yaml2obj {0} --docnum={1} > {1}'.format(abspath, str(i)), shell=True, cwd=tmpdir)
lines = contents.splitlines()
while len(lines[0]) == 0 or lines[0][0] != '$':
lines.pop(0)
bloaty_invocation = os.path.join(cwd, lines[0][2:]) + ' > actual'
lines.pop(0)
expected_output = "\n".join(lines) + "\n"
failure = None
if subprocess.call(bloaty_invocation, shell=True, cwd=tmpdir) != 0:
failure = "CRASHED"
else:
with open(os.path.join(tmpdir, 'expected'), 'w') as expected:
expected.write(expected_output)
if subprocess.call('diff -u expected actual', shell=True, cwd=tmpdir) != 0:
failure = "FAILED"
if failure:
print("{}: {}".format(failure, filename))
print("{}: output in {}".format(failure, tmpdir))
failures.append((filename, tmpdir))
else:
successes += 1
shutil.rmtree(tmpdir)
def TestArg(arg):
if os.path.isdir(arg):
files = sorted(glob.glob(os.path.join(arg, "**/*.test"), recursive=True))
for file in files:
TestFile(file)
else:
TestFile(arg)
args = sys.argv[1:]
if not args:
print("Usage: tester.py <FILE-OR-DIR> ...")
sys.exit(1)
for arg in sys.argv[1:]:
TestArg(arg)
if not failures:
print("SUCCESS: {} test(s) passed".format(successes))
else:
print("\nFAILURE: {} tests passed, {} tests failed:".format(successes, len(failures)))
for failure in failures:
print(" - {} (output in {})".format(*failure))
sys.exit(1)