Home | History | Annotate | Download | only in versioner
      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