package cn.edu.zju.acm.onlinejudge.judgeservice;
import java.net.InetAddress;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
import cn.edu.zju.acm.onlinejudge.bean.Limit;
import cn.edu.zju.acm.onlinejudge.bean.Problem;
import cn.edu.zju.acm.onlinejudge.bean.Reference;
import cn.edu.zju.acm.onlinejudge.bean.Submission;
import cn.edu.zju.acm.onlinejudge.bean.enumeration.JudgeReply;
import cn.edu.zju.acm.onlinejudge.bean.enumeration.ReferenceType;
import cn.edu.zju.acm.onlinejudge.dao.DAOFactory;
import cn.xuchuan.util.ReflectionUtil;
public class IntegrationTest {
private static class TestCase {
public String content;
public long result;
public String extension;
public TestCase(String content, long result, String extension) {
this.content = content;
this.result = result;
this.extension = extension;
}
}
private JudgeService service;
private TestCase[] testcases = new TestCase[] {
new TestCase(
"#include <iostream>\nusing namespace std;int main(){int a, b;while(cin>>a>>b){cout<<a+b<<endl;}}",
JudgeReply.ACCEPTED.getId(), "cc"),
new TestCase(
"#include <iostream>\nusing namespace std;int main(){int a, b;while(cin>>a>>b){cout<<a+b+1<<endl;}}",
JudgeReply.WRONG_ANSWER.getId(), "cc"),
new TestCase("invalid", JudgeReply.COMPILATION_ERROR.getId(), "cc"),
new TestCase(
"#include <iostream>\nusing namespace std;int main(){int a, b;while(cin>>a>>b){cout<<a+b<<endl<<endl;}}",
JudgeReply.PRESENTATION_ERROR.getId(), "cc"),
new TestCase("#include <iostream>\nusing namespace std;int main(){while(1);return 0;}",
JudgeReply.TIME_LIMIT_EXCEEDED.getId(), "cc"),
new TestCase("#include <iostream>\nusing namespace std;int main(){while(1)new int[1024];return 0;}",
JudgeReply.MEMORY_LIMIT_EXCEEDED.getId(), "cc"),
new TestCase(
"#include <iostream>\nusing namespace std;int main(){while(1)cout<<\"Hello world!\";return 0;}",
JudgeReply.OUTPUT_LIMIT_EXCEEDED.getId(), "cc"),
new TestCase("#include <string.h>\nint a[1];int main(){memset(a, 0, 10000000);return 0;}",
JudgeReply.SEGMENTATION_FAULT.getId(), "cc"),
new TestCase("#include <string.h>\nint a[1];int main(){return 12;}",
JudgeReply.NON_ZERO_EXIT_CODE.getId(), "cc"),
new TestCase("int main(){int a=0,b=1/a;return b;}", JudgeReply.FLOATING_POINT_ERROR.getId(), "cc"),
new TestCase("#include <unistd.h>\nint main(){fork();return 0;}", JudgeReply.RUNTIME_ERROR.getId(), "cc") };
@BeforeClass
public static void init() throws Exception {
ReflectionUtil.setFieldValue(DAOFactory.class, "languageDAO", new MockLanguageDAO());
ReflectionUtil.setFieldValue(DAOFactory.class, "problemDAO", new MockProblemDAO());
ReflectionUtil.setFieldValue(DAOFactory.class, "submissionDAO", new MockSubmissionDAO());
ReflectionUtil.setFieldValue(DAOFactory.class, "referenceDAO", new MockReferenceDAO());
Problem problem = new Problem();
problem.setId(0);
problem.setRevision(0);
Limit limit = new Limit();
limit.setTimeLimit(1);
limit.setMemoryLimit(1024);
limit.setOutputLimit(1);
problem.setLimit(limit);
Reference reference = new Reference();
reference.setReferenceType(ReferenceType.INPUT);
reference.setContent("0 0\n1 2\n2 3\n".getBytes("ASCII"));
DAOFactory.getReferenceDAO().save(reference, 0);
DAOFactory.getReferenceDAO().save(reference, 1);
reference = new Reference();
reference.setReferenceType(ReferenceType.OUTPUT);
reference.setContent("0\n3\n5\n".getBytes("ASCII"));
DAOFactory.getReferenceDAO().save(reference, 0);
DAOFactory.getProblemDAO().update(problem);
}
@Before
public void setUp() throws Exception {
service = new JudgeService(128, 8123);
}
@After
public void TearDown() throws Exception {
service.terminate();
}
@Test
public void test() throws Exception {
for (int i = 0; i < testcases.length; i++) {
Submission submission = new Submission();
submission.setContent(testcases[i].content);
submission.setLanguage(LanguageManager.getLanguageByExtension(testcases[i].extension));
submission.setProblemId(0);
submission.setJudgeReply(JudgeReply.QUEUING);
DAOFactory.getSubmissionDAO().save(submission);
service.judge(submission);
System.out.println("ok");
}
for (int i = 0; i < testcases.length; i++) {
for (;;) {
Submission submission = DAOFactory.getSubmissionDAO().getSubmission(i);
if (submission.getJudgeReply() != JudgeReply.QUEUING) {
assertEquals((long) testcases[i].result, submission.getJudgeReply().getId());
break;
}
System.out.println("sleep");
Thread.sleep(10000);
System.out.println("done");
}
}
}
}