performance/ocw/1/c-primer/verifier.py

111 lines
3 KiB
Python

#!/usr/bin/python
import subprocess, os, sys, re
def exitWithError(error):
print error
sys.exit(1)
def runAndReadOutput(args):
if args is str:
args = [args]
try:
return subprocess.check_output(args)
except subprocess.CalledProcessError as e:
exitWithError("ERROR: runtime error with %s" % str(args))
def run(path): runAndReadOutput(path)
def runAndCheckSizes():
output = runAndReadOutput("./sizes")
expected_output_format = "size of %s : %d bytes"
lines = set([x.replace(" ", "") for x in output.strip().lower().split('\n')])
types = [
( "int", 4 ),
( "short", 2 ),
( "long", 8 ),
( "char", 1 ),
( "float", 4 ),
( "double", 8 ),
( "unsigned int", 4 ),
( "long long", 8 ),
( "uint8_t", 1 ),
( "uint16_t", 2 ),
( "uint32_t", 4 ),
( "uint64_t", 8 ),
( "uint_fast8_t", 1 ),
( "uint_fast16_t", 8 ),
( "uintmax_t", 8 ),
( "intmax_t", 8 ),
( "__int128", 16 ),
( "uint32_t", 4 ),
( "uint64_t", 8 ),
( "student", 8 ),
( "x", 20),
( "int*", 8 ),
( "short*", 8 ),
( "long*", 8 ),
( "char*", 8 ),
( "float*", 8 ),
( "double*", 8 ),
( "unsigned int*", 8 ),
( "long long*", 8 ),
( "uint8_t*", 8 ),
( "uint16_t*", 8 ),
( "uint32_t*", 8 ),
( "uint64_t*", 8 ),
( "uint_fast8_t*", 8 ),
( "uint_fast16_t*", 8 ),
( "uintmax_t*", 8 ),
( "intmax_t*", 8 ),
( "__int128*", 8 ),
( "uint32_t*", 8 ),
( "uint64_t*", 8 ),
( "student*", 8 ),
( "&x", 8)
]
for typ in types:
print (expected_output_format % typ)
if (expected_output_format % typ).replace(" ", "") not in lines:
exitWithError("ERROR: couldn't find type %s (or it has the incorrect value) in sizes output" % typ[0])
def runAndCheckSwap():
expected_output = "k = 2, m = 1\n"
output = runAndReadOutput("./swap")
if output != expected_output:
exitWithError('ERROR: actual output: "%s", expected "%s"' % (output, expected_output))
def build(make_arg, filename):
print "\nRunning make %s ... " % make_arg
run(["make", filename])
print "Ok!"
print "\nChecking that %s was built ... " % filename
if not os.path.isfile(filename):
exitWithError("ERROR: %s binary missing, did you rename it?" % filename)
print "Ok!"
print "Running verifying script ... "
print "\nChecking that the Makefile exists ... "
if not os.path.isfile('Makefile'):
exitWithError('ERROR: Makefile does not exist.')
print "Good!"
build("sizes", "sizes")
print "Checking output of sizes ... "
runAndCheckSizes()
print "Ok!"
build("pointer", "pointer")
run("./pointer") # Run pointer as a sanity check, but there's no output to check
build("swap", "swap")
print "Checking output of swap ... "
runAndCheckSwap()
print "Ok!"
print "LGTM"