1#!/usr/bin/env python2 2 3import os 4import subprocess 5import sys 6 7red = '\033[91m' 8green = '\033[92m' 9bold = '\033[1m' 10reset = '\033[0m' 11prefix_pass = bold + "[" + green + "PASS" + reset + bold + "]" + reset 12prefix_fail = bold + "[" + red + "FAIL" + reset + bold + "]" + reset 13 14 15def indent(text, spaces=4): 16 text = text.decode("utf-8") 17 prefix = " " 18 return "\n".join([prefix + line for line in text.split("\n")]) 19 20 21def run_test(test_name, path): 22 os.chdir(path) 23 process = subprocess.Popen( 24 ["/bin/sh", "run.sh"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 25 (output, _) = process.communicate() 26 27 if os.path.exists("expected_fail"): 28 with open("expected_fail", "rb") as f: 29 expected_output = f.read() 30 if process.returncode == 0: 31 print("{} {}: unexpected success:".format(prefix_fail, test_name)) 32 print("") 33 print(" Expected:") 34 print(indent(expected_output)) 35 print(" Actual:") 36 print(indent(output)) 37 return False 38 elif not output.endswith(expected_output): 39 print("{} {}: expected output mismatch".format( 40 prefix_fail, test_name)) 41 print("") 42 print(" Expected:") 43 print(indent(expected_output)) 44 print(" Actual:") 45 print(indent(output)) 46 return False 47 elif process.returncode != 0: 48 print("{} {}: unexpected failure:".format(prefix_fail, test_name)) 49 print("") 50 print(indent(output)) 51 return False 52 53 print("{} {}".format(prefix_pass, test_name)) 54 return True 55 56 57def usage(): 58 print("Usage: run_tests.py [-f]") 59 print(" -f\t\tdon't run slow tests") 60 sys.exit(0) 61 62 63root_dir = os.path.dirname(os.path.realpath(__file__)) 64test_dir = os.path.join(root_dir, "tests") 65tests = os.listdir(test_dir) 66run_slow = True 67 68if len(sys.argv) > 2: 69 usage() 70elif len(sys.argv) == 2: 71 if sys.argv[1] != "-f": 72 usage() 73 run_slow = False 74 75success = True 76for test in sorted(tests): 77 if test.startswith("slow") and not run_slow: 78 continue 79 path = os.path.join(test_dir, test) 80 if not os.path.isdir(path): 81 continue 82 if not run_test(test, path): 83 success = False 84 85sys.exit(0 if success else 1) 86