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