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)
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")
24 e.cfgs.apply_overrides("TEST_" + test + "_")
27 e.cfgs.apply_overrides("EXT_" + ext + "_")
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)
36 e.log_config(2, "for the test")
38 e.test_stat = moe.status.MoeStatus()
39 e.test_stat["id"] = test
40 e.stat.get_list("tests").append(e.test_stat)
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()
48 if e.log.verbosity > 1:
49 stat.write_nested(e.log.log_file, 1)
51 e.test_stat[k] = stat[k]
54 e.log.verbose("No status file present\n")
59 inn = e.cfgs["TESTCASE_IN"]
60 out = e.cfgs["TESTCASE_OUT"]
61 ok = e.cfgs["TESTCASE_OK"]
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))
69 judge = e.cfgs["OUTPUT_CHECK"]
73 e.log.progress("<check> ")
74 e.log.verbose("Checking output: %s\n" % judge)
77 ## FIXME: parse stderr of the judge to get the status message
80 if os.WEXITSTATUS(rc) == 0:
82 elif os.WEXITSTATUS(rc) == 1:
83 raise moe.TestError("Wrong answer", "WA")
84 raise moe.MoeError("Judge failure")
87 ## FIXME: check $TEST.pts
88 if e.test_stat["points"] is None:
89 e.test_stat["points"] = e.cfgs["POINTS_PER_TEST"]
91 def run_test(e, test):
92 configure_test(e, test)
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")
100 def wrap_run_test(e, test):
103 except moe.MoeError, err:
104 raise moe.TestError(err, "XX")
106 def conclude_test(e):
108 if not stat["points"]:
111 if e.log.verbosity > 1:
112 e.log.verbose("Final status:\n")
113 stat.write_nested(e.log.log_file, 1)
116 msg = "%s: %s" % (stat["status"], e.test_stat["message"])
119 msg += " (%s points" % stat["points"]
121 msg += ", %s s" % stat["time"]
123 msg += ", %d MB" % ((int(stat["mem"]) + 524288) // 1048576)
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)
135 for test in e.cfgs["TESTS"].split():
136 e.log.progress("Test %s: " % test)
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
151 moe.log.default = old_log