package tv.dyndns.kishibe.qmaclone.server; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.List; import java.util.Map; import java.util.Set; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import tv.dyndns.kishibe.qmaclone.client.packet.RestrictionType; import tv.dyndns.kishibe.qmaclone.server.BadUserDetector.SessionIdAndUserCode; import tv.dyndns.kishibe.qmaclone.server.database.Database; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; import com.google.common.collect.Sets; @RunWith(MockitoJUnitRunner.class) public class BadUserDetectorTest { private static final int FAKE_USER_CODE_1 = 11111111; private static final int FAKE_USER_CODE_2 = 22222222; @Mock private Database mockDatabase; private BadUserDetector manager; @Before public void setUp() throws Exception { manager = new BadUserDetector(mockDatabase); } @Test public void extractStartAndGoalShouldParseLogs() { String body = "情報: Game{method=transitFromMachingToReady, sessionId=1, userCode=123}\n" + "情報: Game{method=transitFromMachingToReady, sessionId=2, userCode=123}\n" + "情報: Game{method=transitFromMachingToReady, sessionId=2, userCode=234}\n" + "8 12, 2012 9:02:51 午後 tv.dyndns.kishibe.server.GameLogger write\n" + "情報: ServiceServletStub{method=notifyGameFinished, userCode=123, sessionId=1, oldRating=123, newRating=1274, remoteAddress=127.0.0.1}\n" + "8 12, 2012 9:02:52 午後 tv.dyndns.kishibe.server.GameLogger write\n" + "情報: ServiceServletStub{method=notifyGameFinished, userCode=123, sessionId=2, oldRating=123, newRating=1423, remoteAddress=127.0.0.1}\n" + "情報: ServiceServletStub{method=notifyGameFinished, userCode=22950866, sessionId=2953, oldRating=2019, newRating=1876, remoteAddress=203.136.117.99}"; Set<Integer> userCodes = Sets.newHashSet(); Set<SessionIdAndUserCode> startLogs = Sets.newHashSet(); Set<SessionIdAndUserCode> finishLogs = Sets.newHashSet(); Map<Integer, List<Double>> userCodeToResponseTimes = Maps.newHashMap(); Map<SessionIdAndUserCode, Double> sessionIdAndUserCodeToTimeUpCount = Maps.newHashMap(); manager.extractStartAndFinish(body, startLogs, finishLogs, userCodeToResponseTimes, sessionIdAndUserCodeToTimeUpCount, userCodes); assertEquals(ImmutableSet.of(new SessionIdAndUserCode(1, 123), new SessionIdAndUserCode(2, 123), new SessionIdAndUserCode(2, 234)), startLogs); assertEquals(ImmutableSet.of(new SessionIdAndUserCode(1, 123), new SessionIdAndUserCode(2, 123), new SessionIdAndUserCode(2953, 22950866)), finishLogs); } @Test public void sessionIdAndUserCodeShouldWorkWithHashSet() { SessionIdAndUserCode code0 = new SessionIdAndUserCode(123, 12345678); SessionIdAndUserCode code1 = new SessionIdAndUserCode(234, 23456789); Set<SessionIdAndUserCode> codes = Sets.newHashSet(); codes.add(code0); codes.add(code1); assertTrue(codes.contains(new SessionIdAndUserCode(123, 12345678))); assertFalse(codes.contains(new SessionIdAndUserCode(999, 99999999))); } @Test public void detectBadProblemCreatorShouldJudgeWithNumberOfProblems() throws Exception { when(mockDatabase.getUserCodeToIndicatedProblems()).thenReturn( ImmutableMap.of(FAKE_USER_CODE_1, 100, FAKE_USER_CODE_2, 5)); manager.detectBadProblemCreator(); // verify(mockDatabase).clearRestrictedUserCodes(RestrictionType.PROBLEM_SUBMITTION); verify(mockDatabase).addRestrictedUserCode(FAKE_USER_CODE_1, RestrictionType.PROBLEM_SUBMITTION); } }