package cn.edu.zju.acm.onlinejudge.judgeservice;
import java.net.InetAddress;
import java.net.Socket;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
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;
import static org.junit.Assert.*;
public class JudgeClientUnitTest {
private Submission[] submissions;
private static MockClient mockServer;
private SubmissionQueueReader queue;
private JudgeClient judgeClient;
@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 {
mockServer = new MockClient(true);
queue = new SubmissionQueueReader();
judgeClient = new JudgeClient(queue, new Socket(InetAddress.getLocalHost(), mockServer.getPort()), 3);
judgeClient.start();
submissions = new Submission[10];
for (int i = 0; i < submissions.length; i++) {
submissions[i] = new Submission();
submissions[i].setId(i);
submissions[i].setLanguage(LanguageManager.getLanguage(0));
submissions[i].setProblemId(0);
submissions[i].setContent("test");
DAOFactory.getSubmissionDAO().update(submissions[i]);
}
}
@After
public void tearDown() throws Exception {
judgeClient.stop();
mockServer.stop();
}
@Test
public void testNormal() throws Exception {
for (int i = 0; i < submissions.length + 1; i++) {
mockServer.addReply(MockClient.ACCEPTED);
}
for (int i = 0; i < submissions.length; i++) {
queue.add(submissions[i]);
}
for (int i = 0; i < submissions.length; i++) {
for (;;) {
Submission submission = DAOFactory.getSubmissionDAO().getSubmission(i);
if (submission.getJudgeReply() == JudgeReply.ACCEPTED) {
break;
}
Thread.sleep(10);
}
}
assertEquals(0, mockServer.getReplies().size());
}
@Test
public void testWaitForServer() throws Exception {
mockServer.addReply(MockClient.SAVE_SERVER_ERROR);
for (int i = 0; i < submissions.length + 1; i++) {
mockServer.addReply(MockClient.ACCEPTED);
}
for (int i = 0; i < submissions.length; i++) {
queue.add(submissions[i]);
}
for (int i = 0; i < submissions.length; i++) {
for (;;) {
Submission submission = DAOFactory.getSubmissionDAO().getSubmission(i);
if (submission.getJudgeReply() == JudgeReply.ACCEPTED) {
break;
}
Thread.sleep(10);
}
}
assertEquals(0, mockServer.getReplies().size());
}
@Test
public void testRestartServer() throws Exception {
mockServer.addReply(MockClient.ACCEPTED);
mockServer.addReply(MockClient.COMPILATION_SERVER_ERROR);
for (int i = 0; i < submissions.length - 1; i++) {
mockServer.addReply(MockClient.ACCEPTED);
}
mockServer.addReply(MockClient.COMPILATION_SERVER_ERROR);
mockServer.addReply(MockClient.ACCEPTED);
mockServer.addReply(MockClient.ACCEPTED);
for (int i = 0; i < submissions.length; i++) {
queue.add(submissions[i]);
}
for (int i = 0; i < submissions.length; i++) {
for (;;) {
Submission submission = DAOFactory.getSubmissionDAO().getSubmission(i);
if (submission.getJudgeReply() == JudgeReply.ACCEPTED) {
break;
}
Thread.sleep(10);
}
}
assertEquals(0, mockServer.getReplies().size());
}
}