]> mj.ucw.cz Git - moe.git/blob - t/moe/testcase.py
158f3742c36098896d78d8481751742166db6659
[moe.git] / t / moe / testcase.py
1 #!/usr/bin/env python
2
3 import os.path
4 import moe
5 import moe.config
6 import moe.eval
7 import moe.log
8 import shutil
9
10 def judge(e):
11     pass
12
13 def configure_test(e, test):
14     e.cfgs = moe.config.MoeConfigStack(e.cfgs)
15     e.test_builtins = moe.config.MoeConfig(type="test-builtins")
16     e.test_builtins.set("TEST", test)
17     e.cfgs.push(e.test_builtins)
18
19     test_cf = os.path.join(e.cfgs["PDIR"], test + ".config")
20     if os.path.exists(test_cf):
21         cfg = moe.config.MoeConfig(name=test_cf, type="test")
22         e.cfgs.push(cfg)
23
24     e.cfgs.apply_overrides("TEST_" + test + "_")
25     ext = e.cfgs["EXT"]
26     if ext != "":
27         e.cfgs.apply_overrides("EXT_" + ext + "_")
28
29     log = moe.log.MoeLog()
30     log.verbosity = e.log.verbosity
31     log.open(os.path.join(e.cfgs["TDIR"], test + ".log"))
32     log.say("Test case %s\n\n" % test)
33     e.log = log
34     moe.log.default = log
35
36     e.log_config(2, "for the test")
37
38     e.test_stat = moe.status.MoeStatus()
39     e.test_stat["id"] = test
40     e.stat.get_list("tests").append(e.test_stat)
41
42 def collect_status(e):
43     sf = os.path.join(e.cfgs["TDIR"], e.cfgs["TESTCASE_STATUS"])
44     if os.path.exists(sf):
45         e.log.verbose("Reading status from %s\n" % sf)
46         stat = moe.status.MoeStatus()
47         stat.read(name=sf)
48         if e.log.verbosity > 1:
49             stat.write_nested(e.log.log_file, 1)
50         for k in stat.keys():
51             e.test_stat[k] = stat[k]
52         os.unlink(sf)
53     else:
54         e.log.verbose("No status file present\n")
55
56 def setup(e):
57     pdir = e.cfgs["PDIR"]
58     tdir = e.cfgs["TDIR"]
59     inn = e.cfgs["TESTCASE_IN"]
60     out = e.cfgs["TESTCASE_OUT"]
61     ok = e.cfgs["TESTCASE_OK"]
62
63     if os.path.exists(os.path.join(pdir, inn)):
64         moe.util.link_or_copy(os.path.join(pdir, inn), os.path.join(tdir, inn))
65     if os.path.exists(os.path.join(pdir, out)):
66         moe.util.link_or_copy(os.path.join(pdir, out), os.path.join(tdir, ok))
67
68 def judge(e):
69     judge = e.cfgs["OUTPUT_CHECK"]
70     if judge == "":
71         return
72
73     e.log.progress("<check> ")
74     e.log.verbose("Checking output: %s\n" % judge)
75     e.log.flush()
76     rc = os.system(judge)
77     ## FIXME: parse stderr of the judge to get the status message
78     collect_status(e)
79     if os.WIFEXITED(rc):
80         if os.WEXITSTATUS(rc) == 0:
81             return
82         elif os.WEXITSTATUS(rc) == 1:
83             raise moe.TestError("Wrong answer", "WA")
84     raise moe.MoeError("Judge failure")
85
86 def points(e):
87     ## FIXME: check $TEST.pts
88     if e.test_stat["points"] is None:
89         e.test_stat["points"] = e.cfgs["POINTS_PER_TEST"]
90
91 def run_test(e, test):
92     configure_test(e, test)
93
94     ## FIXME: interactive tasks
95     e.test_pipe.configure(e.cfgs["TESTCASE_HOOKS"])
96     if e.log.verbosity >= 2:
97         e.test_pipe.dump(e.log.log_file, prefix="\t")
98     e.test_pipe.run(e)
99
100 def wrap_run_test(e, test):
101     try:
102         run_test(e, test)
103     except moe.MoeError, err:
104         raise moe.TestError(err, "XX")
105
106 def conclude_test(e):
107     stat = e.test_stat
108     if not stat["points"]:
109         stat["points"] = 0
110
111     if e.log.verbosity > 1:
112         e.log.verbose("Final status:\n")
113         stat.write_nested(e.log.log_file, 1)
114
115     if stat["status"]:
116         msg = "%s: %s" % (stat["status"], e.test_stat["message"])
117     else:
118         msg = "OK"
119     msg += " (%s points" % stat["points"]
120     if stat["time"]:
121         msg += ", %s s" % stat["time"]
122     if stat["mem"]:
123         msg += ", %d MB" % ((int(stat["mem"]) + 524288) // 1048576)
124     msg += ")\n"
125     e.log.progress(msg)
126     e.log.say(msg)
127
128 def run_tests(e):
129     ## FIXME: output filter
130     ## FIXME: syntax checks
131     e.test_pipe.insert(0, "setup", setup)
132     e.test_pipe.insert(400, "judge", judge)
133     e.test_pipe.insert(500, "points", points)
134
135     for test in e.cfgs["TESTS"].split():
136         e.log.progress("Test %s: " % test)
137         old_cfgs = e.cfgs
138         old_log = e.log
139
140         try:
141             wrap_run_test(e, test)
142         except moe.TestError, err:
143             if not e.test_stat["status"]:
144                 e.test_stat["status"] = err.stat_code
145                 e.test_stat["message"] = err.message
146
147         conclude_test(e)
148         
149         e.cfgs = old_cfgs
150         e.log = old_log
151         moe.log.default = old_log