| #!/usr/bin/env python3 | 
 |  | 
 | import os | 
 | import subprocess | 
 | import sys | 
 |  | 
 | red = '\033[91m' | 
 | green = '\033[92m' | 
 | bold = '\033[1m' | 
 | reset = '\033[0m' | 
 | prefix_pass = bold + "[" + green + "PASS" + reset + bold + "]" + reset | 
 | prefix_fail = bold + "[" + red + "FAIL" + reset + bold + "]" + reset | 
 |  | 
 |  | 
 | def indent(text, spaces=4): | 
 |     text = text.decode("utf-8") | 
 |     prefix = "    " | 
 |     return "\n".join([prefix + line for line in text.split("\n")]) | 
 |  | 
 |  | 
 | def run_test(test_name, path): | 
 |     os.chdir(path) | 
 |     process = subprocess.Popen( | 
 |         ["/bin/sh", "run.sh"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) | 
 |     (output, _) = process.communicate() | 
 |  | 
 |     if os.path.exists("expected_fail"): | 
 |         with open("expected_fail", "rb") as f: | 
 |             expected_output = f.read() | 
 |             if process.returncode == 0: | 
 |                 print("{} {}: unexpected success:".format(prefix_fail, test_name)) | 
 |                 print("") | 
 |                 print("  Expected:") | 
 |                 print(indent(expected_output)) | 
 |                 print("  Actual:") | 
 |                 print(indent(output)) | 
 |                 return False | 
 |             elif not output.endswith(expected_output): | 
 |                 print("{} {}: expected output mismatch".format( | 
 |                     prefix_fail, test_name)) | 
 |                 print("") | 
 |                 print("  Expected:") | 
 |                 print(indent(expected_output)) | 
 |                 print("  Actual:") | 
 |                 print(indent(output)) | 
 |                 return False | 
 |     elif process.returncode != 0: | 
 |         print("{} {}: unexpected failure:".format(prefix_fail, test_name)) | 
 |         print("") | 
 |         print(indent(output)) | 
 |         return False | 
 |  | 
 |     print("{} {}".format(prefix_pass, test_name)) | 
 |     return True | 
 |  | 
 |  | 
 | def usage(): | 
 |     print("Usage: run_tests.py [-f]") | 
 |     print("    -f\t\tdon't run slow tests") | 
 |     sys.exit(0) | 
 |  | 
 |  | 
 | root_dir = os.path.dirname(os.path.realpath(__file__)) | 
 | test_dir = os.path.join(root_dir, "tests") | 
 | tests = os.listdir(test_dir) | 
 | run_slow = True | 
 |  | 
 | if len(sys.argv) > 2: | 
 |     usage() | 
 | elif len(sys.argv) == 2: | 
 |     if sys.argv[1] != "-f": | 
 |         usage() | 
 |     run_slow = False | 
 |  | 
 | success = True | 
 | for test in sorted(tests): | 
 |     if test.startswith("slow") and not run_slow: | 
 |         continue | 
 |     path = os.path.join(test_dir, test) | 
 |     if not os.path.isdir(path): | 
 |         continue | 
 |     if not run_test(test, path): | 
 |         success = False | 
 |  | 
 | sys.exit(0 if success else 1) |