source: orange/testing/regressionTests/xtest.py @ 9643:d818703beb7c

Revision 9643:d818703beb7c, 8.5 KB checked in by Miha Stajdohar <miha.stajdohar@…>, 2 years ago (diff)

New paths.

Line 
1#! usr/bin/env python
2
3import os, re, sys, time, subprocess
4import getopt
5import orngEnviron
6
7regtestdir = os.getcwd().replace("\\", "/")
8re_israndom = re.compile(r"#\s*xtest\s*:\s*RANDOM")
9
10date = "%2.2i-%2.2i-%2.2i" % time.localtime()[:3]
11
12platform = sys.platform
13pyversion = sys.version[:3]
14states = ["OK", "changed", "random", "error", "crash"]
15
16def file_name_match(name, patterns):
17    """Is any of the string in patterns a substring of name?"""
18    for p in patterns:
19        if p in name:
20            return True
21    return False
22
23def test_scripts(complete, just_print, module="orange", root_directory=".",
24                test_files=None, directories=None):
25    """Test the scripts in the given directory."""
26    global error_status
27    if sys.platform == "win32" and sys.executable[-6:].upper() != "_D.EXE":
28        import win32process, win32api
29        win32process.SetPriorityClass(win32api.GetCurrentProcess(), 64)
30
31    caller_directory = os.getcwd()
32    os.chdir(root_directory) # directory to start the testing in
33    for dirname, dir in directories:
34        dir = os.path.join(root_directory, dir)
35        os.chdir(dir)
36        if module <> dirname:
37            outputsdir = "%s/results/%s/%s" % (regtestdir, module, dirname)
38        else:
39            outputsdir = "%s/results/%s" % (regtestdir, module)
40
41        print "DIR %s (%s)" % (dirname, dir)
42        if not os.path.exists(outputsdir):
43            os.mkdir(outputsdir)
44
45        if os.path.exists("exclude-from-regression.txt"):
46            dont_test = [x.strip() for x in file("exclude-from-regression.txt").readlines()]
47        else:
48            dont_test = []
49        test_set = []
50
51        # file name filtering
52        names = [name for name in os.listdir('.') if name[-3:] == ".py"]
53        if test_files:
54            names = [name for name in names if file_name_match(name, test_files)]
55        names = [name for name in names if name not in dont_test]
56        names.sort()
57
58        if names or True:
59            if just_print == "report-html":
60                print "<h2>Directory '%s'</h2>" % dir
61                print '<table class="xtest_report">'
62            elif just_print:
63                print "-" * 79
64                print "Directory '%s'" % dir
65                print
66
67        # test_set includes all the scripts (file, status) to be tested
68        for name in names:
69            if not os.path.exists("%s/%s.txt" % (outputsdir, name)):
70                # past result not available
71                test_set.append((name, "new"))
72            else:
73                # past result available
74                for state in states:
75                    if os.path.exists("%s/%s.%s.%s.%s.txt" % \
76                                      (outputsdir, name, platform, pyversion, state)):
77                        test_set.append((name, state))
78                        # current result already on disk
79                        break
80                else:
81                    if os.path.exists("%s/%s.%s.%s.random1.txt" % \
82                                      (outputsdir, name, platform, pyversion)):
83                        test_set.append((name, "random"))
84                    elif complete or just_print:
85                        test_set.append((name, "OK"))
86                    else:
87                        dont_test.append(name)
88
89        if just_print == "report-html":
90            for name, lastResult in test_set:
91                if lastResult == "OK":
92                    result = "results/%s/%s/%s.txt" % (module, dirname, name)
93                    print '''  <tr><td><a href="http://orange.biolab.si/trac/browser/trunk/orange/doc/%(dir)s/%(name)s">%(name)s</a></td>
94    <td><a href="%(result)s">%(lastResult)s</a></td>
95  </tr>''' % {"dir":dir, "name":name, "lastResult":lastResult, "result":result}
96
97#                    print '  <tr><td><a href="results/%s/%s/%s.txt">%s</a></td><td>%s</td></tr>' % (module, dirname, name, name, lastResult)
98                elif lastResult in ["changed", "crash", "random"]:
99#                else:
100                    if lastResult == "random":
101                        result = "results/%s/%s/%s.%s.%s.%s.txt" % (module, dirname, name, platform, pyversion, lastResult + "1")
102                    else:
103                        result = "results/%s/%s/%s.%s.%s.%s.txt" % (module, dirname, name, platform, pyversion, lastResult)
104                    original = "results/%s/%s/%s.txt" % (module, dirname, name)
105                    print '''  <tr><td><a href="http://orange.biolab.si/trac/browser/trunk/orange/doc/%(dir)s/%(name)s">%(name)s</a>
106    </td><td><a href="%(result)s">%(lastResult)s</a></td>
107    <td><a href="%(original)s">original</a></td>
108  </tr>''' % {"dir":dir, "name":name, "lastResult":lastResult, "result":result, "original":original}
109
110            print "</table>"
111        elif just_print:
112            for name, lastResult in test_set:
113                print "%-30s %s" % (name, lastResult)
114
115        else:
116            if dont_test:
117                print "Skipped: %s\n" % ", ".join(dont_test)
118
119            for name, lastResult in test_set:
120                print "%s (%s): " % (name, lastResult == "new" and lastResult or ("last: %s" % lastResult)),
121                sys.stdout.flush()
122
123                for state in ["crash", "error", "new", "changed", "random1", "random2"]:
124                    remname = "%s/%s.%s.%s.%s.txt" % \
125                              (outputsdir, name, platform, pyversion, state)
126                    if os.path.exists(remname):
127                        os.remove(remname)
128
129                titerations = re_israndom.search(open(name, "rt").read()) and 1 or iterations
130                os.spawnl(os.P_WAIT, sys.executable, "-c", regtestdir + "/xtest_one.py", name, str(titerations), outputsdir)
131
132                result = open("xtest1_report", "rt").readline().rstrip() or "crash"
133                error_status = max(error_status, states.index(result))
134                os.remove("xtest1_report")
135
136        os.chdir("..")
137
138    os.chdir(caller_directory)
139
140
141iterations = 3
142directories = []
143error_status = 0
144
145def usage():
146    """Print out help."""
147    print "%s [update|test|report|report-html|errors] -[h|s] [--single|--module=[orange|obi|text]|--dir=<dir>|] <files>" % sys.argv[0]
148    print "  test:   regression tests on all scripts"
149    print "  update: regression tests on all previously failed scripts (default)"
150    print "  report: report on testing results"
151    print "  errors: report on errors from regression tests"
152    print
153    print "-s, --single: runs a single test on each script"
154    print "--module=<module>: defines a module to test"
155    print "--dir=<dir>: a comma-separated list of names where any should match the directory to be tested"
156    print "<files>: space separated list of string matching the file names to be tested"
157
158
159def main(argv):
160    """Process the argument list and run the regression test."""
161    global iterations
162
163    command = "update"
164    if argv:
165        if argv[0] in ["update", "test", "report", "report-html", "errors", "help"]:
166            command = argv[0]
167            del argv[0]
168
169    try:
170        opts, test_files = getopt.getopt(argv, "hs", ["single", "module=", "help", "files=", "verbose="])
171    except getopt.GetoptError:
172        print "Warning: Wrong argument"
173        usage()
174        sys.exit(1)
175    opts = dict(opts) if opts else {}
176    if "--single" in opts or "-s" in opts:
177        iterations = 1
178    if "--help" in opts or '-h' in opts:
179        usage()
180        sys.exit(0)
181
182    module = opts.get("--module", "orange")
183    if module in ["orange"]:
184        root = "%s/.." % orngEnviron.orangeDir
185        module = "orange"
186        dirs = [("modules", "orange/doc/modules"), ("reference", "orange/doc/reference"), ("ofb", "docs/tutorial/rst/code")]
187    elif module in ["ofb-rst"]:
188        root = "%s/.." % orngEnviron.orangeDir
189        module = "orange"
190        dirs = [("ofb", "docs/tutorial/rst/code")]
191    elif module in ["orange25"]:
192        root = "%s/.." % orngEnviron.orangeDir
193        module = "orange25"
194        dirs = [("orange25", "docs/reference/rst/code")]
195    elif module == "obi":
196        root = orngEnviron.addOnsDirSys + "/Bioinformatics/doc"
197        dirs = [("modules", "modules")]
198    elif module == "text":
199        root = orngEnviron.addOnsDirSys + "/Text/doc"
200        dirs = [("modules", "modules")]
201    else:
202        print "Error: %s is wrong name of the module, should be in [orange|obi|text]" % module
203        sys.exit(1)
204
205    test_scripts(command == "test", command == "report" or (command == "report-html" and command or False),
206                 module=module, root_directory=root,
207                 test_files=test_files, directories=dirs)
208    # sys.exit(error_status)
209
210main(sys.argv[1:])
Note: See TracBrowser for help on using the repository browser.