public boolean ok(String out, String reference) { try { File fo = File.createTempFile("homeworkeval", ".out"); File fr = File.createTempFile("homeworkeval", ".ref"); log.fine("Running custom validator."); save(out, fo); save(reference, fr); ArrayList<String> c = new ArrayList<String>(); c.add(command); c.add(fo.getPath()); c.add(fr.getPath()); ProcessBuilder pb = new ProcessBuilder(c); Process p = pb.start(); int rc = p.waitFor(); fo.delete(); fr.delete(); log.fine("Custom validator " + command + " says " + rc); return rc == 0; } catch (Exception e) { // Assume NOK. Don't propagate info to the client. log.finer("exc: " + UtilSrv.describe(e)); return false; } }
public int run(PbTest[] tests, int timelimit, int memlimit) throws ServerException { allStdout = new ArrayList<String>(); allStderr = new ArrayList<String>(); int correct = 0; for (int i = 0; i < tests.length; ++i) { try { exec(runCmd, tests[i].in, timelimit, memlimit); allStdout.add(stdout); allStderr.add(stderr); if (!stderr.isEmpty()) { log.fine("NOK, stderr: " + stderr); continue; } if (!validator.ok(stdout, tests[i].out)) continue; log.fine("OK"); ++correct; } catch (Exception e) { // Assume incorrect. Do NOT propagate anyhing from the exception to // the client, just put it in the log. log.finer("exc: " + UtilSrv.describe(e)); } } return correct; }