1 #!/usr/bin/env python2 2 3 import os 4 import subprocess 5 import sys 6 7 red = '\033[91m' 8 green = '\033[92m' 9 bold = '\033[1m' 10 reset = '\033[0m' 11 prefix_pass = bold + "[" + green + "PASS" + reset + bold + "]" + reset 12 prefix_fail = bold + "[" + red + "FAIL" + reset + bold + "]" + reset 13 14 15 def 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 21 def 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 57 def usage(): 58 print("Usage: run_tests.py [-f]") 59 print(" -f\t\tdon't run slow tests") 60 sys.exit(0) 61 62 63 root_dir = os.path.dirname(os.path.realpath(__file__)) 64 test_dir = os.path.join(root_dir, "tests") 65 tests = os.listdir(test_dir) 66 run_slow = True 67 68 if len(sys.argv) > 2: 69 usage() 70 elif len(sys.argv) == 2: 71 if sys.argv[1] != "-f": 72 usage() 73 run_slow = False 74 75 success = True 76 for 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 85 sys.exit(0 if success else 1) 86