source: orange/Orange/testing/regression/xtest.py @ 9690:71ccf5c08086

Revision 9690:71ccf5c08086, 8.9 KB checked in by Miha Stajdohar <miha.stajdohar@…>, 2 years ago (diff)

Changed paths, again, I know.

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