package org.arbeitspferde.groningen.datastore; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.primitives.Longs; import org.arbeitspferde.groningen.Datastore; import org.arbeitspferde.groningen.Datastore.DatastoreException; import org.arbeitspferde.groningen.PipelineId; import org.arbeitspferde.groningen.PipelineState; import org.arbeitspferde.groningen.config.GroningenConfig; import org.arbeitspferde.groningen.config.ProtoBufConfig; import org.arbeitspferde.groningen.exceptions.InvalidConfigurationException; import org.arbeitspferde.groningen.experimentdb.ExperimentDb; import org.arbeitspferde.groningen.experimentdb.SubjectStateBridge; import org.arbeitspferde.groningen.experimentdb.jvmflags.JvmFlag; import org.arbeitspferde.groningen.experimentdb.jvmflags.JvmFlagSet; import org.arbeitspferde.groningen.proto.GroningenConfigProto.ProgramConfiguration; import org.arbeitspferde.groningen.proto.GroningenConfigProto.ProgramConfiguration.ClusterConfig; import org.arbeitspferde.groningen.proto.GroningenConfigProto.ProgramConfiguration.ClusterConfig.SubjectGroupConfig; import org.arbeitspferde.groningen.proto.Params.GroningenParams; import org.arbeitspferde.groningen.subject.Subject; import junit.framework.TestCase; import org.easymock.EasyMock; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * Implementation-independent test for {@link Datastore} implementations. In order to test * particular Datastore, this class must be subclassed and createDatastore/destroyDatastore * methods must be implemented. */ public abstract class DatastoreTestCase extends TestCase { private Datastore dataStore; private PipelineState createValidPipelineState(PipelineId pipelineId, String inputLogName) throws InvalidConfigurationException { GroningenConfig config = new ProtoBufConfig( ProgramConfiguration.newBuilder() .setParamBlock(GroningenParams.newBuilder().setInputLogName(inputLogName).build()) .setUser("bigtester") .addCluster(ClusterConfig.newBuilder() .setCluster("xx") .addSubjectGroup(SubjectGroupConfig.newBuilder() .setSubjectGroupName("bigTestingGroup") .setExpSettingsFilesDir("/some/path") .build()) .build()) .build()); ExperimentDb experimentDb = new ExperimentDb(); final JvmFlagSet.Builder jvmFlagSetBuilder = JvmFlagSet.builder(); jvmFlagSetBuilder.withValue(JvmFlag.USE_SERIAL_GC, 1) .withValue(JvmFlag.HEAP_SIZE, 100L) .withValue(JvmFlag.MAX_NEW_SIZE, 50L); final JvmFlagSet jvmFlagSet = jvmFlagSetBuilder.build(); SubjectStateBridge s1 = experimentDb.makeSubject(); s1.storeCommandLine(jvmFlagSet); s1.setAssociatedSubject(EasyMock.createNiceMock(Subject.class)); SubjectStateBridge s2 = experimentDb.makeSubject(); s2.storeCommandLine(jvmFlagSet); s2.setAssociatedSubject(EasyMock.createNiceMock(Subject.class)); experimentDb.makeExperiment(ImmutableList.of(s1.getIdOfObject(), s2.getIdOfObject())); return new PipelineState(pipelineId, config, experimentDb); } private PipelineState createValidPipelineState(PipelineId pipelineId) throws InvalidConfigurationException { return createValidPipelineState(pipelineId, "stdin"); } private PipelineState createValidPipelineState() throws InvalidConfigurationException { return createValidPipelineState(new PipelineId("localId")); } @Override protected void setUp() throws Exception { super.setUp(); dataStore = createDatastore(); } @Override protected void tearDown() throws Exception { if (dataStore != null) { destroyDatastore(dataStore); } super.tearDown(); } protected abstract Datastore createDatastore(); protected abstract void destroyDatastore(Datastore dataStore); public void testListPipelineIdsWorksCorrectly() throws InvalidConfigurationException, DatastoreException { dataStore.createPipeline(createValidPipelineState(new PipelineId("ah")), false); dataStore.createPipeline(createValidPipelineState(new PipelineId("oh")), false); List<PipelineId> pipelineIds = dataStore.listPipelinesIds(); Collections.sort(pipelineIds, new Comparator<PipelineId>() { @Override public int compare(PipelineId o1, PipelineId o2) { return o1.toString().compareTo(o2.toString()); } }); assertEquals(new PipelineId("ah"), pipelineIds.get(0)); assertEquals(new PipelineId("oh"), pipelineIds.get(1)); } public void testCreatePipelineWorksCorrectly() throws InvalidConfigurationException, DatastoreException { PipelineState state = createValidPipelineState(); dataStore.createPipeline(state, false); List<PipelineId> ids = dataStore.listPipelinesIds(); assertEquals(1, ids.size()); assertEquals(state.pipelineId(), ids.get(0)); } public void testWritePipelinesWorksCorrectly() throws InvalidConfigurationException, DatastoreException { PipelineId id = new PipelineId("some"); dataStore.createPipeline(createValidPipelineState(id, "stdin"), false); List<PipelineState> resultStates1 = dataStore.getPipelines(Lists.newArrayList(id)); assertEquals(1, resultStates1.size()); PipelineState resultState1 = resultStates1.get(0); dataStore.writePipelines(Lists.newArrayList(createValidPipelineState(id, "stdin2"))); List<PipelineState> resultStates2 = dataStore.getPipelines(Lists.newArrayList(id)); assertEquals(1, resultStates2.size()); PipelineState resultState2 = resultStates2.get(0); dataStore.writePipelines(Lists.newArrayList(createValidPipelineState(id, "stdin"))); List<PipelineState> resultStates3 = dataStore.getPipelines(Lists.newArrayList(id)); assertEquals(1, resultStates3.size()); PipelineState resultState3 = resultStates3.get(0); assertEquals(resultState1.pipelineId(), resultState2.pipelineId()); assertEquals(resultState2.pipelineId(), resultState3.pipelineId()); assertFalse( resultState1.config().getProtoConfig().equals(resultState2.config().getProtoConfig())); assertTrue( resultState1.config().getProtoConfig().equals(resultState3.config().getProtoConfig())); } public void testReadPipelinesWorksCorrectly() throws InvalidConfigurationException, DatastoreException { PipelineState state = createValidPipelineState(); dataStore.createPipeline(state, false); List<PipelineState> resultStates = dataStore.getPipelines(Lists.newArrayList(state.pipelineId())); assertEquals(1, resultStates.size()); PipelineState resultState = resultStates.get(0); assertEquals(state.pipelineId(), resultState.pipelineId()); long[] subjectIds = Longs.toArray(state.experimentDb().getLastExperiment().getSubjectIds()); Arrays.sort(subjectIds); long[] resultSubjectIds = Longs.toArray(resultState.experimentDb().getLastExperiment().getSubjectIds()); Arrays.sort(resultSubjectIds); assertEquals(subjectIds.length, resultSubjectIds.length); for (int i = 0; i < subjectIds.length; ++i) { assertEquals(subjectIds[i], resultSubjectIds[i]); } } public void testDeletePipelinesWorksCorrectly() throws InvalidConfigurationException, DatastoreException { PipelineState state = createValidPipelineState(); dataStore.createPipeline(state, false); List<PipelineId> ids = dataStore.listPipelinesIds(); assertEquals(1, ids.size()); assertEquals(state.pipelineId(), ids.get(0)); dataStore.deletePipelines(Lists.newArrayList(state.pipelineId())); ids = dataStore.listPipelinesIds(); assertTrue(ids.isEmpty()); } }