package edu.harvard.econcs.turkserver.server.mysql; import static org.junit.Assert.*; import java.net.InetAddress; import java.util.Collection; import java.util.Date; import edu.harvard.econcs.turkserver.config.TSConfig; import edu.harvard.econcs.turkserver.schema.Session; import edu.harvard.econcs.turkserver.server.HITWorkerImpl; import edu.harvard.econcs.turkserver.server.SessionRecord; import edu.harvard.econcs.turkserver.server.SessionRecord.SessionStatus; import edu.harvard.econcs.turkserver.server.mysql.ExperimentDataTracker.SessionSummary; import org.apache.commons.configuration.Configuration; import org.junit.*; import com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource; public class MySQLDataTrackerTest { private static Configuration conf; private static MysqlConnectionPoolDataSource ds; private MySQLDataTracker dt; @BeforeClass public static void init() throws Exception { conf = TSConfig.getDefault(); // import default (empty) schema into database MySQLDataTracker.createSchema(conf); ds = TSConfig.getMysqlCPDS(conf); } @Before public void setup() throws Exception { dt = new MySQLDataTracker(ds); dt.setSetId("test"); } @After public void tearDown() { dt.clearDatabase(); } @Test // Test simple saving and retrieving from db public void testSaving() { String hitId = "HIT12340931"; String assignmentId = "AsstIJFINGPEWRBNAE"; String workerId = "WorkerABJAER"; Session record = new Session(); record.setHitId(hitId); record.setAssignmentId(assignmentId); record.setWorkerId(workerId); dt.saveHITId(hitId); dt.saveSession(record); Session saved = dt.getStoredSessionInfo(hitId); assertEquals(hitId, saved.getHitId()); assertEquals(assignmentId, saved.getAssignmentId()); assertEquals(workerId, saved.getWorkerId()); } /* * Simple test of session storing capabilities */ @Test public void testSession() throws Exception { assertSessionCount(0, 0, 0, dt.getSetSessionSummary()); String hitId = "HIT12340931"; String assignmentId = "AsstIJFINGPEWRBNAE"; String workerId = "WorkerABJAER"; String username = "randomuser\" WHERE"; // Recorded HITId dt.saveHITId(hitId); // Test for uniqueness (code copied from tracker) assertTrue(dt.hitExistsInDB(hitId)); assertEquals(SessionStatus.UNASSIGNED, SessionRecord.status(dt.getStoredSessionInfo(hitId))); assertSessionCount(1, 0, 0, dt.getSetSessionSummary()); HITWorkerImpl hitw = new HITWorkerImpl(null, dt.getStoredSessionInfo(hitId)); // Add assignment dt.saveWorkerAssignment(hitw, assignmentId, workerId); assertEquals(SessionStatus.ASSIGNED, SessionRecord.status(dt.getStoredSessionInfo(hitId))); assertSessionCount(1, 1, 0, dt.getSetSessionSummary()); // Check that sessionIDs stored properly Collection<Session> srs = dt.getSetSessionInfoForWorker(workerId); assertTrue(srs.size() == 1); assertEquals(hitId, srs.iterator().next().getHitId()); // Check that assignmentID is stored correctly assertEquals(assignmentId, dt.getStoredSessionInfo(hitId).getAssignmentId()); dt.saveUsername(hitw, username); dt.saveIP(hitw, InetAddress.getLocalHost(), new Date()); // Check that username cached correctly assertEquals(username, dt.getStoredSessionInfo(hitId).getUsername()); assertEquals(SessionStatus.LOBBY, SessionRecord.status(dt.getStoredSessionInfo(hitId))); assertSessionCount(1, 1, 0, dt.getSetSessionSummary()); // Test inactivePercent completion detection dt.saveSessionCompleteInfo(hitw); assertEquals(SessionStatus.COMPLETED, SessionRecord.status(dt.getStoredSessionInfo(hitId))); assertSessionCount(1, 1, 1, dt.getSetSessionSummary()); } private void assertSessionCount(int created, int assigned, int completed, SessionSummary summary) { assertEquals(created, summary.createdHITs); assertEquals(assigned, summary.assignedHITs); assertEquals(completed, summary.completedHITs); } }