aboutsummaryrefslogtreecommitdiff
path: root/src/run.py
blob: 47a46ce9d9184d90f31a7c77d335e5f18b725090 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/usr/bin/env python

import os
import sys
import time
import glob
import fnmatch
from optparse import OptionParser

rustDir = os.path.abspath('.')
rustTestDir = rustDir + "/test";
rustTestRunPassDir = rustTestDir + "/run-pass";
rustTestRunFailDir = rustTestDir + "/run-fail";
rustTestCompileFailDir = rustTestDir + "/run-compile-fail";
rustTestRunBenchDir = rustTestDir + "/run-bench";

parser = OptionParser()
parser.set_usage("run.py [options] pattern : run.py -n 100 \"bas*\" -q");
parser.add_option("-n", dest="repetitions",
                  help="number of repetitions", metavar="NUMBER")
parser.add_option("-q", action="store_true", dest="quiet", default=False,
                  help="suppresses rust log output")
parser.add_option("-l", dest="log", default="",
                  help="rust log")
parser.add_option("-v", action="store_true", dest="valgrind", default=False,
                  help="runs under valgrind")
parser.add_option("-t", action="store_true", dest="terminate", default=False,
                  help="terminate on first failure")
parser.add_option("-p", action="store_true", dest="printSource",
                  default=False, help="prints the test case's source")
parser.add_option("-s", dest="seed", metavar="NUMBER", default=-1,
                  help="seeds the rust scheduler, use -1 to generate seeds, "
                  + " or >= 0 to specify a seed")

(options, args) = parser.parse_args()

def getRustTests(filter):
    tests = []
    for root, dirnames, filenames in os.walk(rustTestDir):
      for filename in fnmatch.filter(filenames, filter + '.rs'):
          tests.append(os.path.join(root, filename).
                       replace(rustDir + "/", ""));
    return tests


if len(args) != 1:
    parser.print_usage();
    sys.exit(0);

tests = getRustTests(args[0]);

# Make
for rustProgram in tests:
    print "Making: " + rustProgram;
    result = os.system("make " + rustProgram.replace(".rs", ".x86")) >> 8;
    if (result != 0):
        print "Make failed!";
        sys.exit(1);

if (options.log != ""):
    os.putenv("RUST_LOG", options.log);

if (options.quiet):
    os.putenv("RUST_LOG", "none");

# Rut
totalPassed = 0;
repetitions = 1;
for rustProgram in tests:
    repetitions = 1;
    if (options.repetitions):
        repetitions = int(options.repetitions);
    passed = 0;
    if (options.printSource):
        os.system("cat " + rustProgram);
    for i in range(0, repetitions):
        print "Running: " + rustProgram + " " + str(i) + \
              " of " + str(repetitions);
        if (options.seed):
            if (int(options.seed) >= 0):
              os.putenv("RUST_SEED", options.seed);
            else:
              os.putenv("RUST_SEED", str(i));
        command = rustProgram.replace(".rs", ".x86");
        if (options.valgrind):
            command = "valgrind --leak-check=full "  + \
                      "--quiet --vex-iropt-level=0 " + \
                      "--suppressions=etc/x86.supp " + \
                      command;
        print "Running Command: " + command;
        result = os.system(command);
        exitStatus = result >> 8;
        signalNumber = result & 0xF;
        if (result == 0):
            passed += 1;
        elif (options.terminate):
            sys.exit(1);
    print "Result for: " + rustProgram + " " + str(passed) + \
          " of " + str(repetitions) + " passed.";
    totalPassed += passed;
print "Total: " + str(totalPassed) + " of " + \
      str(len(tests) * repetitions) + " passed."