source: orange/Orange/testing/regression/xtest.py @ 10026:1c83515cadc8

Revision 10026:1c83515cadc8, 10.1 KB checked in by Miha Stajdohar <miha.stajdohar@…>, 2 years ago (diff)

Changed timeout range.

Line 
1#! usr/bin/env python
2
3import os, re, sys, time, subprocess
4import getopt
5from Orange.misc import environ
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", "timedout", "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, timeout=5):
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 states:
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                p = subprocess.Popen([sys.executable, regtestdir + "/xtest_one.py", name, str(titerations), outputsdir])
134
135                passed_time = 0
136                while passed_time < timeout:
137                    time.sleep(0.01)
138                    passed_time += 0.01
139
140                    if p.poll() is not None:
141                        break
142
143                if p.poll() is None:
144                    p.kill()
145                    result2 = "timedout"
146                    print "timedout (use: --timeout #)"
147                    # remove output file and change it for *.timedout.*
148                    for state in states:
149                        remname = "%s/%s.%s.%s.%s.txt" % \
150                                  (outputsdir, name, platform, pyversion, state)
151                        if os.path.exists(remname):
152                            os.remove(remname)
153
154                    timeoutname = "%s/%s.%s.%s.%s.txt" % (outputsdir, name, sys.platform, sys.version[:3], "timedout")
155                    open(timeoutname, "wt").close()
156                    result = "timedout"
157                else:
158                    stdout, stderr = p.communicate()
159                    result = open("xtest1_report", "rt").readline().rstrip() or "crash"
160
161                error_status = max(error_status, states.index(result))
162                os.remove("xtest1_report")
163
164        os.chdir("..")
165
166    os.chdir(caller_directory)
167
168iterations = 1
169directories = []
170error_status = 0
171
172def usage():
173    """Print out help."""
174    print "%s [test|update|report|report-html|errors] -[h|s] [--single|--module=[all|orange|docs]|--timeout=<#>|--dir=<dir>|] <files>" % sys.argv[0]
175    print "  test:   regression tests on all scripts (default)"
176    print "  update: regression tests on all previously failed scripts"
177    print "  report: report on testing results"
178    print "  errors: report on errors from regression tests"
179    print
180    print "-s, --single: runs a single test on each script"
181    print "--module=<module>: defines a module to test"
182    print "--timeout=<#seconds>: defines max. execution time"
183    print "--dir=<dir>: a comma-separated list of names where any should match the directory to be tested"
184    print "<files>: space separated list of string matching the file names to be tested"
185
186
187def main(argv):
188    """Process the argument list and run the regression test."""
189    global iterations
190
191    command = "test"
192    if argv:
193        if argv[0] in ["update", "test", "report", "report-html", "errors", "help"]:
194            command = argv[0]
195            del argv[0]
196
197    try:
198        opts, test_files = getopt.getopt(argv, "hs", ["single", "module=", "timeout=", "help", "files=", "verbose="])
199    except getopt.GetoptError:
200        print "Warning: Wrong argument"
201        usage()
202        sys.exit(1)
203    opts = dict(opts) if opts else {}
204    if "--single" in opts or "-s" in opts:
205        iterations = 1
206    if "--help" in opts or '-h' in opts:
207        usage()
208        sys.exit(0)
209
210    module = opts.get("--module", "all")
211    if module == "all":
212        root = "%s/.." % environ.install_dir
213        module = "orange"
214        dirs = [("tests", "Orange/testing/regression/tests"),
215                ("tests_20", "Orange/testing/regression/tests_20"),
216                ("tutorial", "docs/tutorial/rst/code"),
217                ("reference", "docs/reference/rst/code")]
218    elif module == "orange":
219        root = "%s" % environ.install_dir
220        module = "orange"
221        dirs = [("tests", "testing/regression/tests"),
222                ("tests_20", "testing/regression/tests_20")]
223    elif module == "docs":
224        root = "%s/.." % environ.install_dir
225        module = "orange"
226        dirs = [("tutorial", "docs/tutorial/rst/code"),
227                ("reference", "docs/reference/rst/code")]
228    else:
229        print "Error: %s is wrong name of the module, should be in [orange|docs]" % module
230        sys.exit(1)
231
232    timeout = 5
233    try:
234        _t = opts.get("--timeout", "5")
235        timeout = int(_t)
236        if timeout <= 0 or timeout > 300:
237            raise AttributeError()
238    except AttributeError:
239        print "Error: timeout out of range (0 < # < 300)"
240        sys.exit(1)
241    except:
242        print "Error: %s wrong timeout" % opts.get("--timeout", "5")
243        sys.exit(1)
244
245    test_scripts(command == "test", command == "report" or (command == "report-html" and command or False),
246                 module=module, root_directory=root,
247                 test_files=test_files, directories=dirs, timeout=timeout)
248    # sys.exit(error_status)
249
250main(sys.argv[1:])
Note: See TracBrowser for help on using the repository browser.