You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by to...@apache.org on 2013/12/04 04:45:17 UTC
[3/5] Major refactor complete. Need to work on scheduling of futures.
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategyImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategyImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategyImplTest.java
deleted file mode 100644
index ffa868e..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccEntitySerializationStrategyImplTest.java
+++ /dev/null
@@ -1,430 +0,0 @@
-package org.apache.usergrid.persistence.collection.serialization;
-
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.UUID;
-
-import org.junit.Rule;
-import org.junit.Test;
-
-import org.apache.cassandra.db.marshal.UUIDType;
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-import org.apache.usergrid.persistence.collection.CollectionContextImpl;
-import org.apache.usergrid.persistence.collection.guice.TestCollectionModule;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntityImpl;
-import org.apache.usergrid.persistence.model.entity.Entity;
-import org.apache.usergrid.persistence.model.field.BooleanField;
-import org.apache.usergrid.persistence.model.field.DoubleField;
-import org.apache.usergrid.persistence.model.field.Field;
-import org.apache.usergrid.persistence.model.field.IntegerField;
-import org.apache.usergrid.persistence.model.field.LongField;
-import org.apache.usergrid.persistence.model.field.StringField;
-import org.apache.usergrid.persistence.model.field.UUIDField;
-import org.apache.usergrid.persistence.model.util.UUIDGenerator;
-import org.apache.usergrid.persistence.test.CassandraRule;
-
-import com.google.common.base.Optional;
-import com.google.guiceberry.junit4.GuiceBerryRule;
-import com.google.inject.Inject;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-import com.netflix.astyanax.serializers.UUIDSerializer;
-import com.netflix.astyanax.util.TimeUUIDUtils;
-
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertSame;
-import static junit.framework.TestCase.assertFalse;
-import static junit.framework.TestCase.assertNull;
-import static org.junit.Assert.assertTrue;
-
-
-/**
- * @author tnine
- */
-public class MvccEntitySerializationStrategyImplTest {
-
- @Rule
- public final GuiceBerryRule guiceBerry = new GuiceBerryRule( TestCollectionModule.class );
-
- @Rule
- public final CassandraRule rule = new CassandraRule();
-
- @Inject
- private MvccEntitySerializationStrategy serializationStrategy;
-
-
- @Test
- public void writeLoadDelete() throws ConnectionException {
-
- final UUID applicationId = UUIDGenerator.newTimeUUID();
- final String name = "test";
-
- CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
-
-
- final UUID entityId = UUIDGenerator.newTimeUUID();
- final UUID version = UUIDGenerator.newTimeUUID();
- final String type = "test";
- final long created = 1l;
- final long updated = 2l;
-
- Entity entity = new Entity( entityId, type );
-
- entity.setVersion( version );
- entity.setCreated( created );
- entity.setUpdated( updated );
-
-
- BooleanField boolField = new BooleanField( "boolean", false );
- DoubleField doubleField = new DoubleField( "double", 1d );
- IntegerField intField = new IntegerField( "long", 1 );
- LongField longField = new LongField( "int", 1l );
- StringField stringField = new StringField( "name", "test" );
- UUIDField uuidField = new UUIDField( "uuid", UUIDGenerator.newTimeUUID() );
-
- entity.setField( boolField );
- entity.setField( doubleField );
- entity.setField( intField );
- entity.setField( longField );
- entity.setField( stringField );
- entity.setField( uuidField );
-
-
- MvccEntity saved = new MvccEntityImpl( context, entityId, version, Optional.of( entity ) );
-
-
- //persist the entity
- serializationStrategy.write( saved ).execute();
-
- //now read it back
-
- MvccEntity returned = serializationStrategy.load( context, entityId, version );
-
- assertEquals( "Mvcc entities are the same", saved, returned );
-
-
- assertEquals( entityId, entity.getUuid() );
- assertEquals( type, entity.getType() );
- assertEquals( created, entity.getCreated() );
- assertEquals( updated, entity.getUpdated() );
-
-
- Field<Boolean> boolFieldReturned = entity.getField( boolField.getName() );
-
- assertSame( boolField, boolFieldReturned );
-
- Field<Double> doubleFieldReturned = entity.getField( doubleField.getName() );
-
- assertSame( doubleField, doubleFieldReturned );
-
- Field<Integer> intFieldReturned = entity.getField( intField.getName() );
-
- assertSame( intField, intFieldReturned );
-
- Field<Long> longFieldReturned = entity.getField( longField.getName() );
-
- assertSame( longField, longFieldReturned );
-
- Field<String> stringFieldReturned = entity.getField( stringField.getName() );
-
- assertSame( stringField, stringFieldReturned );
-
- Field<UUID> uuidFieldReturned = entity.getField( uuidField.getName() );
-
- assertSame( uuidField, uuidFieldReturned );
-
-
- Set<Field> results = new HashSet<Field>();
- results.addAll( entity.getFields() );
-
-
- assertTrue( results.contains( boolField ) );
- assertTrue( results.contains( doubleField ) );
- assertTrue( results.contains( intField ) );
- assertTrue( results.contains( longField ) );
- assertTrue( results.contains( stringField ) );
- assertTrue( results.contains( uuidField ) );
-
- assertEquals( 6, results.size() );
-
-
- assertEquals( entityId, entity.getUuid() );
- assertEquals( version, entity.getVersion() );
-
-
- //now delete it
- serializationStrategy.delete( context, entityId, version ).execute();
-
- //now get it, should be gone
-
- returned = serializationStrategy.load( context, entityId, version );
-
- assertNull( returned );
- }
-
-
- @Test
- public void writeLoadClearDelete() throws ConnectionException {
-
- final UUID applicationId = UUIDGenerator.newTimeUUID();
- final String name = "test";
-
- CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
-
-
- final UUID entityId = UUIDGenerator.newTimeUUID();
- final UUID version = UUIDGenerator.newTimeUUID();
- final String type = "test";
- final long created = 1l;
- final long updated = 2l;
-
- Entity entity = new Entity( entityId, type );
-
- entity.setVersion( version );
- entity.setCreated( created );
- entity.setUpdated( updated );
-
-
- MvccEntity saved = new MvccEntityImpl( context, entityId, version, Optional.of( entity ) );
-
-
- //persist the entity
- serializationStrategy.write( saved ).execute();
-
- //now read it back
-
- MvccEntity returned = serializationStrategy.load( context, entityId, version );
-
- assertEquals( "Mvcc entities are the same", saved, returned );
-
-
- assertEquals( entityId, entity.getUuid() );
- assertEquals( type, entity.getType() );
- assertEquals( created, entity.getCreated() );
- assertEquals( updated, entity.getUpdated() );
-
-
- //now clear it
-
- serializationStrategy.clear( context, entityId, version ).execute();
-
- returned = serializationStrategy.load( context, entityId, version );
-
- assertEquals( context, returned.getContext() );
- assertEquals( entityId, returned.getUuid() );
- assertEquals( version, returned.getVersion() );
- assertFalse( returned.getEntity().isPresent() );
-
- //now delete it
- serializationStrategy.delete( context, entityId, version ).execute();
-
- //now get it, should be gone
-
- returned = serializationStrategy.load( context, entityId, version );
-
- assertNull( returned );
- }
-
-
- @Test
- public void writeX2ClearDelete() throws ConnectionException {
-
- final UUID applicationId = UUIDGenerator.newTimeUUID();
- final String name = "test";
-
- CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
-
-
- final UUID entityId = UUIDGenerator.newTimeUUID();
- final UUID version1 = UUIDGenerator.newTimeUUID();
- final String type = "test";
-
- Entity entityv1 = new Entity( entityId, type );
-
- entityv1.setVersion( version1 );
-
-
- MvccEntity saved = new MvccEntityImpl( context, entityId, version1, Optional.of( entityv1 ) );
-
-
- //persist the entity
- serializationStrategy.write( saved ).execute();
-
- //now read it back
-
- MvccEntity returnedV1 = serializationStrategy.load( context, entityId, version1 );
-
- assertEquals( "Mvcc entities are the same", saved, returnedV1 );
-
-
- assertEquals( entityId, entityv1.getUuid() );
- assertEquals( type, entityv1.getType() );
-
-
- //now write a new version of it
-
-
- Entity entityv2 = new Entity( entityId, type );
-
- UUID version2 = UUIDGenerator.newTimeUUID();
- entityv2.setVersion( version2 );
-
-
- UUIDType comparator = UUIDType.instance;
-
- int value = comparator.compare( UUIDSerializer.get().toByteBuffer( version1 ), UUIDSerializer.get().toByteBuffer( version2 ) );
-
- assertTrue(value < 0);
-
- value = comparator.compare( UUIDSerializer.get().toByteBuffer( version2 ), UUIDSerializer.get().toByteBuffer( version2 ) );
-
- assertEquals(0, value);
-
- MvccEntity savedV2 = new MvccEntityImpl( context, entityId, version2, Optional.of( entityv2 ) );
-
- serializationStrategy.write( savedV2 ).execute();
-
- MvccEntity returnedV2 = serializationStrategy.load( context, entityId, version2 );
-
- assertEquals( "Mvcc entities are the same", savedV2, returnedV2 );
-
-
- //now clear it at v3
-
- UUID version3 = UUIDGenerator.newTimeUUID();
-
- serializationStrategy.clear( context, entityId, version3 ).execute();
-
-
- final Optional<Entity> empty = Optional.absent();
-
- MvccEntity clearedV3 = new MvccEntityImpl( context, entityId, version3, empty );
-
- MvccEntity returnedV3 = serializationStrategy.load( context, entityId, version3 );
-
- assertEquals("entities are the same", clearedV3, returnedV3);
-
- //now ask for up to 10 versions from the current version, we should get cleared, v2, v1
- UUID current = UUIDGenerator.newTimeUUID();
-
- List<MvccEntity> entities = serializationStrategy.load( context, entityId, current, 3 );
-
- assertEquals( 3, entities.size() );
-
- assertEquals( clearedV3, entities.get( 0 ) );
-
- assertEquals( returnedV2, entities.get( 1 ) );
-
- assertEquals( returnedV1, entities.get( 2 ) );
-
-
- //now delete v2 and v1, we should still get v3
- serializationStrategy.delete( context, entityId, version1 ).execute();
- serializationStrategy.delete( context, entityId, version2 ).execute();
-
- entities = serializationStrategy.load( context, entityId, current, 3 );
-
- assertEquals( 1, entities.size() );
-
- assertEquals( clearedV3, entities.get( 0 ) );
-
-
- //now get it, should be gone
- serializationStrategy.delete( context, entityId, version3 ).execute();
-
-
- entities = serializationStrategy.load( context, entityId, current, 3 );
-
- assertEquals( 0, entities.size() );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void writeParams() throws ConnectionException {
- serializationStrategy.write( null );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void deleteParamContext() throws ConnectionException {
- serializationStrategy.delete( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void deleteParamEntityId() throws ConnectionException {
-
- serializationStrategy
- .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- null, UUIDGenerator.newTimeUUID() );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void deleteParamVersion() throws ConnectionException {
-
- serializationStrategy
- .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- UUIDGenerator.newTimeUUID(), null );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadParamContext() throws ConnectionException {
- serializationStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadParamEntityId() throws ConnectionException {
-
- serializationStrategy
- .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- null, UUIDGenerator.newTimeUUID() );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadParamVersion() throws ConnectionException {
-
- serializationStrategy
- .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- UUIDGenerator.newTimeUUID(), null );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadListParamContext() throws ConnectionException {
- serializationStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 1 );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadListParamEntityId() throws ConnectionException {
-
- serializationStrategy
- .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- null, UUIDGenerator.newTimeUUID(), 1 );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadListParamVersion() throws ConnectionException {
-
- serializationStrategy
- .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- UUIDGenerator.newTimeUUID(), null, 1 );
- }
-
-
- @Test(expected = IllegalArgumentException.class)
- public void loadListParamSize() throws ConnectionException {
-
- serializationStrategy
- .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 0 );
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategyImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategyImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategyImplTest.java
deleted file mode 100644
index 195443e..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/MvccLogEntrySerializationStrategyImplTest.java
+++ /dev/null
@@ -1,311 +0,0 @@
-package org.apache.usergrid.persistence.collection.serialization;
-
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import org.junit.Rule;
-import org.junit.Test;
-
-import org.apache.usergrid.persistence.collection.CollectionContext;
-import org.apache.usergrid.persistence.collection.CollectionContextImpl;
-import org.apache.usergrid.persistence.collection.guice.TestCollectionModule;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntryImpl;
-import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
-import org.apache.usergrid.persistence.model.util.UUIDGenerator;
-import org.apache.usergrid.persistence.test.CassandraRule;
-
-import com.google.guiceberry.GuiceBerryEnvSelector;
-import com.google.guiceberry.TestDescription;
-import com.google.guiceberry.junit4.GuiceBerryRule;
-import com.google.inject.Inject;
-import com.google.inject.Module;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-
-import static junit.framework.Assert.assertNotNull;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-
-/** @author tnine */
-public class MvccLogEntrySerializationStrategyImplTest {
-
-
- /** Set our timeout to 1 seconds. If it works for 1 seconds, we'll be good a any value */
- private static final int TIMEOUT = 1;
-
-
- @Rule
- public final GuiceBerryRule guiceBerry = new GuiceBerryRule( new TimeoutModMapper() );
-
- @Rule
- public final CassandraRule rule = new CassandraRule();
-
- @Inject
- private MvccLogEntrySerializationStrategy logEntryStrategy;
-
-
- @Test
- public void createAndDelete() throws ConnectionException {
-
- final UUID applicationId = UUIDGenerator.newTimeUUID();
- final String name = "test";
-
-
- CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
-
-
- final UUID uuid = UUIDGenerator.newTimeUUID();
- final UUID version = UUIDGenerator.newTimeUUID();
-
- for ( Stage stage : Stage.values() ) {
- MvccLogEntry saved = new MvccLogEntryImpl( context, uuid, version, stage );
- logEntryStrategy.write( saved ).execute();
-
- //Read it back
-
- MvccLogEntry returned = logEntryStrategy.load( context, uuid, version );
-
- assertNotNull( "Returned value should not be null", returned );
-
- assertEquals( "Returned should equal the saved", saved, returned );
- }
- }
-
-
- @Test
- public void loadNoData() throws ConnectionException {
-
- final UUID applicationId = UUIDGenerator.newTimeUUID();
- final String name = "test";
-
-
- CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
-
-
- final UUID uuid = UUIDGenerator.newTimeUUID();
- final UUID version = UUIDGenerator.newTimeUUID();
-
-
- MvccLogEntry returned = logEntryStrategy.load( context, uuid, version );
-
- assertNull( "Returned value should not exist", returned );
- }
-
-
- @Test
- public void getMultipleEntries() throws ConnectionException {
-
- final UUID applicationId = UUIDGenerator.newTimeUUID();
- final String name = "test";
-
-
- CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
-
-
- final UUID uuid = UUIDGenerator.newTimeUUID();
-
- int count = 10;
-
- final UUID[] versions = new UUID[count];
- final Stage COMPLETE = Stage.COMPLETE;
- final MvccLogEntry[] entries = new MvccLogEntry[count];
-
-
- for ( int i = 0; i < count; i++ ) {
- versions[i] = UUIDGenerator.newTimeUUID();
-
- entries[i] = new MvccLogEntryImpl( context, uuid, versions[i], COMPLETE );
- logEntryStrategy.write( entries[i] ).execute();
-
- //Read it back
-
- MvccLogEntry returned = logEntryStrategy.load( context, uuid, versions[i] );
-
- assertNotNull( "Returned value should not be null", returned );
-
- assertEquals( "Returned should equal the saved", entries[i], returned );
- }
-
- //now do a range scan from the end
-
- List<MvccLogEntry> results = logEntryStrategy.load( context, uuid, versions[count - 1], count );
-
- assertEquals( count, results.size() );
-
- for ( int i = 0; i < count; i++ ) {
- final MvccLogEntry saved = entries[count - i - 1];
- final MvccLogEntry returned = results.get( i );
-
- assertEquals( "Entry was not equal to the saved value", saved, returned );
- }
-
- //now delete them all and ensure we get no results back
- for ( int i = 0; i < count; i++ ) {
- logEntryStrategy.delete( context, uuid, versions[i] ).execute();
- }
-
- results = logEntryStrategy.load( context, uuid, versions[versions.length - 1], versions.length );
-
- assertEquals( "All log entries were deleted", 0, results.size() );
- }
-
-
- @Test
- public void transientTimeout() throws ConnectionException, InterruptedException {
-
- final UUID applicationId = UUIDGenerator.newTimeUUID();
- final String name = "test";
-
-
- CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
-
-
- final UUID uuid = UUIDGenerator.newTimeUUID();
- final UUID version = UUIDGenerator.newTimeUUID();
-
- for ( Stage stage : Stage.values() ) {
-
- MvccLogEntry saved = new MvccLogEntryImpl( context, uuid, version, stage );
- logEntryStrategy.write( saved ).execute();
-
- //Read it back after the timeout
-
- Thread.sleep( TIMEOUT * 1000 );
-
- MvccLogEntry returned = logEntryStrategy.load( context, uuid, version );
-
-
- if ( stage.isTransient() ) {
-
- assertNull( "Active is transient and should time out", returned );
- }
- else {
- assertNotNull( "Committed is not transient and should be returned", returned );
-
- assertEquals( "Returned should equal the saved", saved, returned );
- }
- }
- }
-
-
- @Test(expected = NullPointerException.class)
- public void writeParams() throws ConnectionException {
- logEntryStrategy.write( null );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void deleteParamContext() throws ConnectionException {
- logEntryStrategy.delete( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void deleteParamEntityId() throws ConnectionException {
-
- logEntryStrategy
- .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- null, UUIDGenerator.newTimeUUID() );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void deleteParamVersion() throws ConnectionException {
-
- logEntryStrategy
- .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- UUIDGenerator.newTimeUUID(), null );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadParamContext() throws ConnectionException {
- logEntryStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadParamEntityId() throws ConnectionException {
-
- logEntryStrategy
- .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- null, UUIDGenerator.newTimeUUID() );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadParamVersion() throws ConnectionException {
-
- logEntryStrategy
- .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- UUIDGenerator.newTimeUUID(), null );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadListParamContext() throws ConnectionException {
- logEntryStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 1 );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadListParamEntityId() throws ConnectionException {
-
- logEntryStrategy
- .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- null, UUIDGenerator.newTimeUUID(), 1 );
- }
-
-
- @Test(expected = NullPointerException.class)
- public void loadListParamVersion() throws ConnectionException {
-
- logEntryStrategy
- .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- UUIDGenerator.newTimeUUID(), null, 1 );
- }
-
-
- @Test(expected = IllegalArgumentException.class)
- public void loadListParamSize() throws ConnectionException {
-
- logEntryStrategy
- .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
- UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 0 );
- }
-
-
- /** Mapper that will change which module we implement based on the test case */
- public static class TimeoutModMapper implements GuiceBerryEnvSelector {
-
- @Override
- public Class<? extends Module> guiceBerryEnvToUse( final TestDescription testDescription ) {
-
- //in this edge case, we want to truncate the timeout to 1 second for this test, override the env to use
- //this module setup
- if ( ( MvccLogEntrySerializationStrategyImplTest.class.getName() + ".transientTimeout" )
- .equals( testDescription.getName() ) ) {
- return TimeoutEnv.class;
- }
-
- //by default, we wnat to run the TestCollectionModule
- return TestCollectionModule.class;
- }
- }
-
-
- public static class TimeoutEnv extends TestCollectionModule {
-
- @Override
- public Map<String, String> getOverrides() {
- Map<String, String> timeout = new HashMap<String, String>();
- timeout.put( MvccLogEntrySerializationStrategyImpl.TIMEOUT_PROP, TIMEOUT + "" );
- return timeout;
- }
- }
-}
-
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/SerializationComparison.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/SerializationComparison.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/SerializationComparison.java
deleted file mode 100644
index a78293b..0000000
--- a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/SerializationComparison.java
+++ /dev/null
@@ -1,182 +0,0 @@
-package org.apache.usergrid.persistence.collection.serialization;
-
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.UUID;
-
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.smile.SmileFactory;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.usergrid.persistence.model.entity.Entity;
-import org.apache.usergrid.persistence.model.field.ArrayField;
-import org.apache.usergrid.persistence.model.field.BooleanField;
-import org.apache.usergrid.persistence.model.field.ByteBufferField;
-import org.apache.usergrid.persistence.model.field.DoubleField;
-import org.apache.usergrid.persistence.model.field.EntityObjectField;
-import org.apache.usergrid.persistence.model.field.IntegerField;
-import org.apache.usergrid.persistence.model.field.ListField;
-import org.apache.usergrid.persistence.model.field.LocationField;
-import org.apache.usergrid.persistence.model.field.LongField;
-import org.apache.usergrid.persistence.model.field.SetField;
-import org.apache.usergrid.persistence.model.field.StringField;
-import org.apache.usergrid.persistence.model.field.UUIDField;
-import org.apache.usergrid.persistence.model.util.UUIDGenerator;
-import org.apache.usergrid.persistence.model.value.EntityObject;
-import org.apache.usergrid.persistence.model.value.Location;
-
-import com.esotericsoftware.kryo.Kryo;
-import com.esotericsoftware.kryo.io.ByteBufferInputStream;
-import com.esotericsoftware.kryo.io.ByteBufferOutputStream;
-import com.esotericsoftware.kryo.io.Input;
-import com.esotericsoftware.kryo.io.Output;
-
-
-/**
- * TODO We need to get both of these serialization methods working, and benchmark them for comparison
- * Neither works out of the box for us without custom work.
- * @author tnine
- */
-public class SerializationComparison {
-
- private static final Logger logger = LoggerFactory.getLogger( SerializationComparison.class );
-
- private static final int count = 10000;
-
-
- @Test
- @Ignore
- public void smileSerialization() throws IOException {
- SmileFactory smile = new SmileFactory();
-
- ObjectMapper smileMapper = new ObjectMapper( smile );
-
-
- Entity entity = createEntity();
-
- long writeTime = 0;
- long readTime = 0;
-
- for ( int i = 0; i < count; i++ ) {
-
- //capture time in nannos for write
- long writeStart = System.nanoTime();
-
- byte[] smileData = smileMapper.writeValueAsBytes( entity );
-
- writeTime += System.nanoTime() - writeStart;
-
- long readStart = System.nanoTime();
-
- Entity otherValue = smileMapper.readValue( smileData, Entity.class );
-
- readTime += System.nanoTime() - readStart;
- }
-
- logger.info( "Smile took {} nanos for writing {} entities", writeTime, count );
- logger.info( "Smile took {} nanos for reading {} entities", readTime, count );
- }
-
-
- @Test
- @Ignore
- public void kyroSerialization() {
- Kryo kryo = new Kryo();
-
- //container classes
- kryo.register( Entity.class );
-
- kryo.register( EntityObject.class );
- kryo.register( Location.class );
-
-
- //field classes
- kryo.register( ArrayField.class );
- kryo.register( BooleanField.class );
- kryo.register( ByteBufferField.class );
- kryo.register( DoubleField.class );
- kryo.register( EntityObjectField.class );
- kryo.register( IntegerField.class );
- kryo.register( ListField.class );
- kryo.register( LocationField.class );
- kryo.register( LongField.class );
- kryo.register( SetField.class );
- kryo.register( StringField.class );
- kryo.register( UUIDField.class, new de.javakaffee.kryoserializers.UUIDSerializer() );
-
-
- long writeTime = 0;
- long readTime = 0;
-
- for ( int i = 0; i < count; i++ ) {
-
- //capture time in nanos for write
- long writeStart = System.nanoTime();
-
- ByteBuffer data = ByteBuffer.allocate( 1024 );
- ByteBufferOutputStream byteBuffOutputStream = new ByteBufferOutputStream(data);
- Output output = new Output( byteBuffOutputStream );
-
- Entity entity = createEntity();
-
- kryo.writeObject( output, entity );
- output.close();
-
- writeTime += System.nanoTime() - writeStart;
-
- data.rewind();
-
- long readStart = System.nanoTime();
-
-
- Input input = new Input( new ByteBufferInputStream( data ) );
- Entity loaded = kryo.readObject( input, Entity.class );
- input.close();
-
- readTime += System.nanoTime() - readStart;
- }
-
- logger.info( "Smile took {} nanos for writing {} entities", writeTime, count );
- logger.info( "Smile took {} nanos for reading {} entities", readTime, count );
- }
-
-
- private Entity createEntity() {
-
- final UUID entityId = UUIDGenerator.newTimeUUID();
-
- final UUID version = UUIDGenerator.newTimeUUID();
-
- Entity entity = new Entity( entityId, "test" );
- entity.setCreated( 1l );
- entity.setUpdated( 2l );
- entity.setVersion( version );
-
-
- BooleanField boolField = new BooleanField( "boolean", false );
- DoubleField doubleField = new DoubleField( "double", 1d );
- IntegerField intField = new IntegerField( "long", 1 );
- LongField longField = new LongField( "int", 1l );
- StringField stringField = new StringField( "name", "test" );
- UUIDField uuidField = new UUIDField( "uuid", UUIDGenerator.newTimeUUID() );
-
- entity.setField( boolField );
- entity.setField( doubleField );
- entity.setField( intField );
- entity.setField( longField );
- entity.setField( stringField );
- entity.setField( uuidField );
-
- return entity;
- }
-
-
-}
-
-
-
-
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImplTest.java
new file mode 100644
index 0000000..daa9edd
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccEntitySerializationStrategyImplTest.java
@@ -0,0 +1,438 @@
+package org.apache.usergrid.persistence.collection.serialization.impl;
+
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.cassandra.db.marshal.UUIDType;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.guice.TestCollectionModule;
+import org.apache.usergrid.persistence.collection.impl.CollectionContextImpl;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
+import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccEntityImpl;
+import org.apache.usergrid.persistence.collection.serialization.MvccEntitySerializationStrategy;
+import org.apache.usergrid.persistence.model.entity.Entity;
+import org.apache.usergrid.persistence.model.field.BooleanField;
+import org.apache.usergrid.persistence.model.field.DoubleField;
+import org.apache.usergrid.persistence.model.field.Field;
+import org.apache.usergrid.persistence.model.field.IntegerField;
+import org.apache.usergrid.persistence.model.field.LongField;
+import org.apache.usergrid.persistence.model.field.StringField;
+import org.apache.usergrid.persistence.model.field.UUIDField;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+import org.apache.usergrid.persistence.test.CassandraRule;
+
+import com.google.common.base.Optional;
+import com.google.guiceberry.junit4.GuiceBerryRule;
+import com.google.inject.Inject;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+import com.netflix.astyanax.serializers.UUIDSerializer;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertSame;
+import static junit.framework.TestCase.assertFalse;
+import static junit.framework.TestCase.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+
+/** @author tnine */
+public class MvccEntitySerializationStrategyImplTest {
+
+ @Rule
+ public final GuiceBerryRule guiceBerry = new GuiceBerryRule( TestCollectionModule.class );
+
+ @Rule
+ public final CassandraRule rule = new CassandraRule();
+
+ @Inject
+ private MvccEntitySerializationStrategy serializationStrategy;
+
+
+ @Test
+ public void writeLoadDelete() throws ConnectionException {
+
+ final UUID applicationId = UUIDGenerator.newTimeUUID();
+ final String name = "test";
+
+ CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
+
+
+ final UUID entityId = UUIDGenerator.newTimeUUID();
+ final UUID version = UUIDGenerator.newTimeUUID();
+ final String type = "test";
+ final long created = 1l;
+ final long updated = 2l;
+
+ Entity entity = new Entity( entityId, type );
+
+ entity.setVersion( version );
+ entity.setCreated( created );
+ entity.setUpdated( updated );
+
+
+ BooleanField boolField = new BooleanField( "boolean", false );
+ DoubleField doubleField = new DoubleField( "double", 1d );
+ IntegerField intField = new IntegerField( "long", 1 );
+ LongField longField = new LongField( "int", 1l );
+ StringField stringField = new StringField( "name", "test" );
+ UUIDField uuidField = new UUIDField( "uuid", UUIDGenerator.newTimeUUID() );
+
+ entity.setField( boolField );
+ entity.setField( doubleField );
+ entity.setField( intField );
+ entity.setField( longField );
+ entity.setField( stringField );
+ entity.setField( uuidField );
+
+
+ MvccEntity saved = new MvccEntityImpl( entityId, version, Optional.of( entity ) );
+
+
+ //persist the entity
+ serializationStrategy.write( context, saved ).execute();
+
+ //now read it back
+
+ MvccEntity returned = serializationStrategy.load( context, entityId, version );
+
+ assertEquals( "Mvcc entities are the same", saved, returned );
+
+
+ assertEquals( entityId, entity.getUuid() );
+ assertEquals( type, entity.getType() );
+ assertEquals( created, entity.getCreated() );
+ assertEquals( updated, entity.getUpdated() );
+
+
+ Field<Boolean> boolFieldReturned = entity.getField( boolField.getName() );
+
+ assertSame( boolField, boolFieldReturned );
+
+ Field<Double> doubleFieldReturned = entity.getField( doubleField.getName() );
+
+ assertSame( doubleField, doubleFieldReturned );
+
+ Field<Integer> intFieldReturned = entity.getField( intField.getName() );
+
+ assertSame( intField, intFieldReturned );
+
+ Field<Long> longFieldReturned = entity.getField( longField.getName() );
+
+ assertSame( longField, longFieldReturned );
+
+ Field<String> stringFieldReturned = entity.getField( stringField.getName() );
+
+ assertSame( stringField, stringFieldReturned );
+
+ Field<UUID> uuidFieldReturned = entity.getField( uuidField.getName() );
+
+ assertSame( uuidField, uuidFieldReturned );
+
+
+ Set<Field> results = new HashSet<Field>();
+ results.addAll( entity.getFields() );
+
+
+ assertTrue( results.contains( boolField ) );
+ assertTrue( results.contains( doubleField ) );
+ assertTrue( results.contains( intField ) );
+ assertTrue( results.contains( longField ) );
+ assertTrue( results.contains( stringField ) );
+ assertTrue( results.contains( uuidField ) );
+
+ assertEquals( 6, results.size() );
+
+
+ assertEquals( entityId, entity.getUuid() );
+ assertEquals( version, entity.getVersion() );
+
+
+ //now delete it
+ serializationStrategy.delete( context, entityId, version ).execute();
+
+ //now get it, should be gone
+
+ returned = serializationStrategy.load( context, entityId, version );
+
+ assertNull( returned );
+ }
+
+
+ @Test
+ public void writeLoadClearDelete() throws ConnectionException {
+
+ final UUID applicationId = UUIDGenerator.newTimeUUID();
+ final String name = "test";
+
+ CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
+
+
+ final UUID entityId = UUIDGenerator.newTimeUUID();
+ final UUID version = UUIDGenerator.newTimeUUID();
+ final String type = "test";
+ final long created = 1l;
+ final long updated = 2l;
+
+ Entity entity = new Entity( entityId, type );
+
+ entity.setVersion( version );
+ entity.setCreated( created );
+ entity.setUpdated( updated );
+
+
+ MvccEntity saved = new MvccEntityImpl( entityId, version, Optional.of( entity ) );
+
+
+ //persist the entity
+ serializationStrategy.write( context, saved ).execute();
+
+ //now read it back
+
+ MvccEntity returned = serializationStrategy.load( context, entityId, version );
+
+ assertEquals( "Mvcc entities are the same", saved, returned );
+
+
+ assertEquals( entityId, entity.getUuid() );
+ assertEquals( type, entity.getType() );
+ assertEquals( created, entity.getCreated() );
+ assertEquals( updated, entity.getUpdated() );
+
+
+ //now clear it
+
+ serializationStrategy.clear( context, entityId, version ).execute();
+
+ returned = serializationStrategy.load( context, entityId, version );
+
+ assertEquals( entityId, returned.getUuid() );
+ assertEquals( version, returned.getVersion() );
+ assertFalse( returned.getEntity().isPresent() );
+
+ //now delete it
+ serializationStrategy.delete( context, entityId, version ).execute();
+
+ //now get it, should be gone
+
+ returned = serializationStrategy.load( context, entityId, version );
+
+ assertNull( returned );
+ }
+
+
+ @Test
+ public void writeX2ClearDelete() throws ConnectionException {
+
+ final UUID applicationId = UUIDGenerator.newTimeUUID();
+ final String name = "test";
+
+ CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
+
+
+ final UUID entityId = UUIDGenerator.newTimeUUID();
+ final UUID version1 = UUIDGenerator.newTimeUUID();
+ final String type = "test";
+
+ Entity entityv1 = new Entity( entityId, type );
+
+ entityv1.setVersion( version1 );
+
+
+ MvccEntity saved = new MvccEntityImpl( entityId, version1, Optional.of( entityv1 ) );
+
+
+ //persist the entity
+ serializationStrategy.write( context, saved ).execute();
+
+ //now read it back
+
+ MvccEntity returnedV1 = serializationStrategy.load( context, entityId, version1 );
+
+ assertEquals( "Mvcc entities are the same", saved, returnedV1 );
+
+
+ assertEquals( entityId, entityv1.getUuid() );
+ assertEquals( type, entityv1.getType() );
+
+
+ //now write a new version of it
+
+
+ Entity entityv2 = new Entity( entityId, type );
+
+ UUID version2 = UUIDGenerator.newTimeUUID();
+ entityv2.setVersion( version2 );
+
+
+ UUIDType comparator = UUIDType.instance;
+
+ int value = comparator.compare( UUIDSerializer.get().toByteBuffer( version1 ),
+ UUIDSerializer.get().toByteBuffer( version2 ) );
+
+ assertTrue( value < 0 );
+
+ value = comparator.compare( UUIDSerializer.get().toByteBuffer( version2 ),
+ UUIDSerializer.get().toByteBuffer( version2 ) );
+
+ assertEquals( 0, value );
+
+ MvccEntity savedV2 = new MvccEntityImpl( entityId, version2, Optional.of( entityv2 ) );
+
+ serializationStrategy.write( context, savedV2 ).execute();
+
+ MvccEntity returnedV2 = serializationStrategy.load( context, entityId, version2 );
+
+ assertEquals( "Mvcc entities are the same", savedV2, returnedV2 );
+
+
+ //now clear it at v3
+
+ UUID version3 = UUIDGenerator.newTimeUUID();
+
+ serializationStrategy.clear( context, entityId, version3 ).execute();
+
+
+ final Optional<Entity> empty = Optional.absent();
+
+ MvccEntity clearedV3 = new MvccEntityImpl( entityId, version3, empty );
+
+ MvccEntity returnedV3 = serializationStrategy.load( context, entityId, version3 );
+
+ assertEquals( "entities are the same", clearedV3, returnedV3 );
+
+ //now ask for up to 10 versions from the current version, we should get cleared, v2, v1
+ UUID current = UUIDGenerator.newTimeUUID();
+
+ List<MvccEntity> entities = serializationStrategy.load( context, entityId, current, 3 );
+
+ assertEquals( 3, entities.size() );
+
+ assertEquals( clearedV3, entities.get( 0 ) );
+
+ assertEquals( returnedV2, entities.get( 1 ) );
+
+ assertEquals( returnedV1, entities.get( 2 ) );
+
+
+ //now delete v2 and v1, we should still get v3
+ serializationStrategy.delete( context, entityId, version1 ).execute();
+ serializationStrategy.delete( context, entityId, version2 ).execute();
+
+ entities = serializationStrategy.load( context, entityId, current, 3 );
+
+ assertEquals( 1, entities.size() );
+
+ assertEquals( clearedV3, entities.get( 0 ) );
+
+
+ //now get it, should be gone
+ serializationStrategy.delete( context, entityId, version3 ).execute();
+
+
+ entities = serializationStrategy.load( context, entityId, current, 3 );
+
+ assertEquals( 0, entities.size() );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void writeParamsContext() throws ConnectionException {
+ serializationStrategy.write( null, mock( MvccEntity.class ) );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void writeParamsEntity() throws ConnectionException {
+ serializationStrategy
+ .write( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ null );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void deleteParamContext() throws ConnectionException {
+ serializationStrategy.delete( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void deleteParamEntityId() throws ConnectionException {
+
+ serializationStrategy
+ .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ null, UUIDGenerator.newTimeUUID() );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void deleteParamVersion() throws ConnectionException {
+
+ serializationStrategy
+ .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ UUIDGenerator.newTimeUUID(), null );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void loadParamContext() throws ConnectionException {
+ serializationStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void loadParamEntityId() throws ConnectionException {
+
+ serializationStrategy
+ .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ null, UUIDGenerator.newTimeUUID() );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void loadParamVersion() throws ConnectionException {
+
+ serializationStrategy
+ .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ UUIDGenerator.newTimeUUID(), null );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void loadListParamContext() throws ConnectionException {
+ serializationStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 1 );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void loadListParamEntityId() throws ConnectionException {
+
+ serializationStrategy
+ .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ null, UUIDGenerator.newTimeUUID(), 1 );
+ }
+
+
+ @Test( expected = NullPointerException.class )
+ public void loadListParamVersion() throws ConnectionException {
+
+ serializationStrategy
+ .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ UUIDGenerator.newTimeUUID(), null, 1 );
+ }
+
+
+ @Test( expected = IllegalArgumentException.class )
+ public void loadListParamSize() throws ConnectionException {
+
+ serializationStrategy
+ .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 0 );
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyImplTest.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyImplTest.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyImplTest.java
new file mode 100644
index 0000000..9c47e08
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/MvccLogEntrySerializationStrategyImplTest.java
@@ -0,0 +1,319 @@
+package org.apache.usergrid.persistence.collection.serialization.impl;
+
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.usergrid.persistence.collection.CollectionContext;
+import org.apache.usergrid.persistence.collection.impl.CollectionContextImpl;
+import org.apache.usergrid.persistence.collection.guice.TestCollectionModule;
+import org.apache.usergrid.persistence.collection.mvcc.entity.MvccLogEntry;
+import org.apache.usergrid.persistence.collection.mvcc.entity.impl.MvccLogEntryImpl;
+import org.apache.usergrid.persistence.collection.mvcc.entity.Stage;
+import org.apache.usergrid.persistence.collection.serialization.MvccLogEntrySerializationStrategy;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+import org.apache.usergrid.persistence.test.CassandraRule;
+
+import com.google.guiceberry.GuiceBerryEnvSelector;
+import com.google.guiceberry.TestDescription;
+import com.google.guiceberry.junit4.GuiceBerryRule;
+import com.google.inject.Inject;
+import com.google.inject.Module;
+import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
+
+import static junit.framework.Assert.assertNotNull;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.mockito.Mockito.mock;
+
+
+/** @author tnine */
+public class MvccLogEntrySerializationStrategyImplTest {
+
+
+ /** Set our timeout to 1 seconds. If it works for 1 seconds, we'll be good a any value */
+ private static final int TIMEOUT = 1;
+
+
+ @Rule
+ public final GuiceBerryRule guiceBerry = new GuiceBerryRule( new TimeoutModMapper() );
+
+ @Rule
+ public final CassandraRule rule = new CassandraRule();
+
+ @Inject
+ private MvccLogEntrySerializationStrategy logEntryStrategy;
+
+
+ @Test
+ public void createAndDelete() throws ConnectionException {
+
+ final UUID applicationId = UUIDGenerator.newTimeUUID();
+ final String name = "test";
+
+
+ CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
+
+
+ final UUID uuid = UUIDGenerator.newTimeUUID();
+ final UUID version = UUIDGenerator.newTimeUUID();
+
+ for ( Stage stage : Stage.values() ) {
+ MvccLogEntry saved = new MvccLogEntryImpl( uuid, version, stage );
+ logEntryStrategy.write( context, saved ).execute();
+
+ //Read it back
+
+ MvccLogEntry returned = logEntryStrategy.load( context, uuid, version );
+
+ assertNotNull( "Returned value should not be null", returned );
+
+ assertEquals( "Returned should equal the saved", saved, returned );
+ }
+ }
+
+
+ @Test
+ public void loadNoData() throws ConnectionException {
+
+ final UUID applicationId = UUIDGenerator.newTimeUUID();
+ final String name = "test";
+
+
+ CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
+
+
+ final UUID uuid = UUIDGenerator.newTimeUUID();
+ final UUID version = UUIDGenerator.newTimeUUID();
+
+
+ MvccLogEntry returned = logEntryStrategy.load( context, uuid, version );
+
+ assertNull( "Returned value should not exist", returned );
+ }
+
+
+ @Test
+ public void getMultipleEntries() throws ConnectionException {
+
+ final UUID applicationId = UUIDGenerator.newTimeUUID();
+ final String name = "test";
+
+
+ CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
+
+
+ final UUID uuid = UUIDGenerator.newTimeUUID();
+
+ int count = 10;
+
+ final UUID[] versions = new UUID[count];
+ final Stage COMPLETE = Stage.COMPLETE;
+ final MvccLogEntry[] entries = new MvccLogEntry[count];
+
+
+ for ( int i = 0; i < count; i++ ) {
+ versions[i] = UUIDGenerator.newTimeUUID();
+
+ entries[i] = new MvccLogEntryImpl( uuid, versions[i], COMPLETE );
+ logEntryStrategy.write( context, entries[i] ).execute();
+
+ //Read it back
+
+ MvccLogEntry returned = logEntryStrategy.load( context, uuid, versions[i] );
+
+ assertNotNull( "Returned value should not be null", returned );
+
+ assertEquals( "Returned should equal the saved", entries[i], returned );
+ }
+
+ //now do a range scan from the end
+
+ List<MvccLogEntry> results = logEntryStrategy.load( context, uuid, versions[count - 1], count );
+
+ assertEquals( count, results.size() );
+
+ for ( int i = 0; i < count; i++ ) {
+ final MvccLogEntry saved = entries[count - i - 1];
+ final MvccLogEntry returned = results.get( i );
+
+ assertEquals( "Entry was not equal to the saved value", saved, returned );
+ }
+
+ //now delete them all and ensure we get no results back
+ for ( int i = 0; i < count; i++ ) {
+ logEntryStrategy.delete( context, uuid, versions[i] ).execute();
+ }
+
+ results = logEntryStrategy.load( context, uuid, versions[versions.length - 1], versions.length );
+
+ assertEquals( "All log entries were deleted", 0, results.size() );
+ }
+
+
+ @Test
+ public void transientTimeout() throws ConnectionException, InterruptedException {
+
+ final UUID applicationId = UUIDGenerator.newTimeUUID();
+ final String name = "test";
+
+
+ CollectionContext context = new CollectionContextImpl( applicationId, applicationId, name );
+
+
+ final UUID uuid = UUIDGenerator.newTimeUUID();
+ final UUID version = UUIDGenerator.newTimeUUID();
+
+ for ( Stage stage : Stage.values() ) {
+
+ MvccLogEntry saved = new MvccLogEntryImpl( uuid, version, stage );
+ logEntryStrategy.write(context, saved ).execute();
+
+ //Read it back after the timeout
+
+ Thread.sleep( TIMEOUT * 1000 );
+
+ MvccLogEntry returned = logEntryStrategy.load( context, uuid, version );
+
+
+ if ( stage.isTransient() ) {
+
+ assertNull( "Active is transient and should time out", returned );
+ }
+ else {
+ assertNotNull( "Committed is not transient and should be returned", returned );
+
+ assertEquals( "Returned should equal the saved", saved, returned );
+ }
+ }
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void writeParamsNoContext() throws ConnectionException {
+ logEntryStrategy.write( null, mock(MvccLogEntry.class) );
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void writeParams() throws ConnectionException {
+ logEntryStrategy.write( mock(CollectionContext.class), null );
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void deleteParamContext() throws ConnectionException {
+ logEntryStrategy.delete( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void deleteParamEntityId() throws ConnectionException {
+
+ logEntryStrategy
+ .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ null, UUIDGenerator.newTimeUUID() );
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void deleteParamVersion() throws ConnectionException {
+
+ logEntryStrategy
+ .delete( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ UUIDGenerator.newTimeUUID(), null );
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void loadParamContext() throws ConnectionException {
+ logEntryStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID() );
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void loadParamEntityId() throws ConnectionException {
+
+ logEntryStrategy
+ .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ null, UUIDGenerator.newTimeUUID() );
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void loadParamVersion() throws ConnectionException {
+
+ logEntryStrategy
+ .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ UUIDGenerator.newTimeUUID(), null );
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void loadListParamContext() throws ConnectionException {
+ logEntryStrategy.load( null, UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 1 );
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void loadListParamEntityId() throws ConnectionException {
+
+ logEntryStrategy
+ .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ null, UUIDGenerator.newTimeUUID(), 1 );
+ }
+
+
+ @Test(expected = NullPointerException.class)
+ public void loadListParamVersion() throws ConnectionException {
+
+ logEntryStrategy
+ .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ UUIDGenerator.newTimeUUID(), null, 1 );
+ }
+
+
+ @Test(expected = IllegalArgumentException.class)
+ public void loadListParamSize() throws ConnectionException {
+
+ logEntryStrategy
+ .load( new CollectionContextImpl( UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), "test" ),
+ UUIDGenerator.newTimeUUID(), UUIDGenerator.newTimeUUID(), 0 );
+ }
+
+
+ /** Mapper that will change which module we implement based on the test case */
+ public static class TimeoutModMapper implements GuiceBerryEnvSelector {
+
+ @Override
+ public Class<? extends Module> guiceBerryEnvToUse( final TestDescription testDescription ) {
+
+ //in this edge case, we want to truncate the timeout to 1 second for this test, override the env to use
+ //this module setup
+ if ( ( MvccLogEntrySerializationStrategyImplTest.class.getName() + ".transientTimeout" )
+ .equals( testDescription.getName() ) ) {
+ return TimeoutEnv.class;
+ }
+
+ //by default, we wnat to run the TestCollectionModule
+ return TestCollectionModule.class;
+ }
+ }
+
+
+ public static class TimeoutEnv extends TestCollectionModule {
+
+ @Override
+ public Map<String, String> getOverrides() {
+ Map<String, String> timeout = new HashMap<String, String>();
+ timeout.put( MvccLogEntrySerializationStrategyImpl.TIMEOUT_PROP, TIMEOUT + "" );
+ return timeout;
+ }
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/SerializationComparison.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/SerializationComparison.java b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/SerializationComparison.java
new file mode 100644
index 0000000..e3dc3b1
--- /dev/null
+++ b/stack/corepersistence/collection/src/test/java/org/apache/usergrid/persistence/collection/serialization/impl/SerializationComparison.java
@@ -0,0 +1,182 @@
+package org.apache.usergrid.persistence.collection.serialization.impl;
+
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.UUID;
+
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.smile.SmileFactory;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.usergrid.persistence.model.entity.Entity;
+import org.apache.usergrid.persistence.model.field.ArrayField;
+import org.apache.usergrid.persistence.model.field.BooleanField;
+import org.apache.usergrid.persistence.model.field.ByteBufferField;
+import org.apache.usergrid.persistence.model.field.DoubleField;
+import org.apache.usergrid.persistence.model.field.EntityObjectField;
+import org.apache.usergrid.persistence.model.field.IntegerField;
+import org.apache.usergrid.persistence.model.field.ListField;
+import org.apache.usergrid.persistence.model.field.LocationField;
+import org.apache.usergrid.persistence.model.field.LongField;
+import org.apache.usergrid.persistence.model.field.SetField;
+import org.apache.usergrid.persistence.model.field.StringField;
+import org.apache.usergrid.persistence.model.field.UUIDField;
+import org.apache.usergrid.persistence.model.util.UUIDGenerator;
+import org.apache.usergrid.persistence.model.value.EntityObject;
+import org.apache.usergrid.persistence.model.value.Location;
+
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.io.ByteBufferInputStream;
+import com.esotericsoftware.kryo.io.ByteBufferOutputStream;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+
+
+/**
+ * TODO We need to get both of these serialization methods working, and benchmark them for comparison
+ * Neither works out of the box for us without custom work.
+ * @author tnine
+ */
+public class SerializationComparison {
+
+ private static final Logger logger = LoggerFactory.getLogger( SerializationComparison.class );
+
+ private static final int count = 10000;
+
+
+ @Test
+ @Ignore
+ public void smileSerialization() throws IOException {
+ SmileFactory smile = new SmileFactory();
+
+ ObjectMapper smileMapper = new ObjectMapper( smile );
+
+
+ Entity entity = createEntity();
+
+ long writeTime = 0;
+ long readTime = 0;
+
+ for ( int i = 0; i < count; i++ ) {
+
+ //capture time in nannos for write
+ long writeStart = System.nanoTime();
+
+ byte[] smileData = smileMapper.writeValueAsBytes( entity );
+
+ writeTime += System.nanoTime() - writeStart;
+
+ long readStart = System.nanoTime();
+
+ Entity otherValue = smileMapper.readValue( smileData, Entity.class );
+
+ readTime += System.nanoTime() - readStart;
+ }
+
+ logger.info( "Smile took {} nanos for writing {} entities", writeTime, count );
+ logger.info( "Smile took {} nanos for reading {} entities", readTime, count );
+ }
+
+
+ @Test
+ @Ignore
+ public void kyroSerialization() {
+ Kryo kryo = new Kryo();
+
+ //container classes
+ kryo.register( Entity.class );
+
+ kryo.register( EntityObject.class );
+ kryo.register( Location.class );
+
+
+ //field classes
+ kryo.register( ArrayField.class );
+ kryo.register( BooleanField.class );
+ kryo.register( ByteBufferField.class );
+ kryo.register( DoubleField.class );
+ kryo.register( EntityObjectField.class );
+ kryo.register( IntegerField.class );
+ kryo.register( ListField.class );
+ kryo.register( LocationField.class );
+ kryo.register( LongField.class );
+ kryo.register( SetField.class );
+ kryo.register( StringField.class );
+ kryo.register( UUIDField.class, new de.javakaffee.kryoserializers.UUIDSerializer() );
+
+
+ long writeTime = 0;
+ long readTime = 0;
+
+ for ( int i = 0; i < count; i++ ) {
+
+ //capture time in nanos for write
+ long writeStart = System.nanoTime();
+
+ ByteBuffer data = ByteBuffer.allocate( 1024 );
+ ByteBufferOutputStream byteBuffOutputStream = new ByteBufferOutputStream(data);
+ Output output = new Output( byteBuffOutputStream );
+
+ Entity entity = createEntity();
+
+ kryo.writeObject( output, entity );
+ output.close();
+
+ writeTime += System.nanoTime() - writeStart;
+
+ data.rewind();
+
+ long readStart = System.nanoTime();
+
+
+ Input input = new Input( new ByteBufferInputStream( data ) );
+ Entity loaded = kryo.readObject( input, Entity.class );
+ input.close();
+
+ readTime += System.nanoTime() - readStart;
+ }
+
+ logger.info( "Smile took {} nanos for writing {} entities", writeTime, count );
+ logger.info( "Smile took {} nanos for reading {} entities", readTime, count );
+ }
+
+
+ private Entity createEntity() {
+
+ final UUID entityId = UUIDGenerator.newTimeUUID();
+
+ final UUID version = UUIDGenerator.newTimeUUID();
+
+ Entity entity = new Entity( entityId, "test" );
+ entity.setCreated( 1l );
+ entity.setUpdated( 2l );
+ entity.setVersion( version );
+
+
+ BooleanField boolField = new BooleanField( "boolean", false );
+ DoubleField doubleField = new DoubleField( "double", 1d );
+ IntegerField intField = new IntegerField( "long", 1 );
+ LongField longField = new LongField( "int", 1l );
+ StringField stringField = new StringField( "name", "test" );
+ UUIDField uuidField = new UUIDField( "uuid", UUIDGenerator.newTimeUUID() );
+
+ entity.setField( boolField );
+ entity.setField( doubleField );
+ entity.setField( intField );
+ entity.setField( longField );
+ entity.setField( stringField );
+ entity.setField( uuidField );
+
+ return entity;
+ }
+
+
+}
+
+
+
+
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java
index cc0bc35..dad2b21 100644
--- a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java
+++ b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Complete.java
@@ -1,7 +1,6 @@
package org.apache.usergrid.persistence.index.stage;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
@@ -15,8 +14,8 @@ public class Complete implements WriteStage
{
@Override
- public void performStage( WriteContext context, final MvccEntity entity ) {
-
- }
+ public void performStage( final WriteContext context ) {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java
index d97b81c..05ecb1d 100644
--- a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java
+++ b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Start.java
@@ -1,20 +1,16 @@
package org.apache.usergrid.persistence.index.stage;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-
/** This state should signal an index update has started */
public class Start implements WriteStage
{
-
@Override
- public void performStage( final WriteContext context, final MvccEntity entity ) throws ConnectionException {
+ public void performStage( final WriteContext context ) {
//To change body of implemented methods use File | Settings | File Templates.
}
}
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/cb9ec94e/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java
----------------------------------------------------------------------
diff --git a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java
index e143a6b..cff6d97 100644
--- a/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java
+++ b/stack/corepersistence/index/src/main/java/org/apache/usergrid/persistence/index/stage/Write.java
@@ -1,21 +1,18 @@
package org.apache.usergrid.persistence.index.stage;
-import org.apache.usergrid.persistence.collection.mvcc.entity.MvccEntity;
import org.apache.usergrid.persistence.collection.mvcc.stage.WriteContext;
import org.apache.usergrid.persistence.collection.mvcc.stage.WriteStage;
-import com.netflix.astyanax.connectionpool.exceptions.ConnectionException;
-
/** This state should perform an update of the index. */
public class Write implements WriteStage
{
- @Override
- public void performStage( final WriteContext context, final MvccEntity entity ) throws ConnectionException {
- //To change body of implemented methods use File | Settings | File Templates.
- }
+@Override
+ public void performStage( final WriteContext context ) {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
}