/* * Hibernate OGM, Domain model persistence for NoSQL datastores * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.ogm.datastore.infinispan.test.dialect.impl; import static org.fest.assertions.Assertions.assertThat; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.Collections; import java.util.Set; import org.hibernate.HibernateException; import org.hibernate.ogm.datastore.infinispan.persistencestrategy.common.externalizer.impl.ExternalizerIds; import org.hibernate.ogm.datastore.infinispan.persistencestrategy.kind.externalizer.impl.EntityKeyExternalizer; import org.hibernate.ogm.model.impl.DefaultEntityKeyMetadata; import org.hibernate.ogm.model.key.spi.EntityKey; import org.hibernate.ogm.model.key.spi.EntityKeyMetadata; import org.infinispan.commons.marshall.AdvancedExternalizer; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; /** * Unit test for {@link EntityKeyExternalizer}. * * @author Gunnar Morling */ public class EntityKeyExternalizerTest { @Rule public ExpectedException thrown = ExpectedException.none(); private ExternalizerTestHelper<EntityKey, EntityKeyExternalizer> externalizerHelper; @Before public void setupMarshallerFactory() { externalizerHelper = ExternalizerTestHelper.getInstance( EntityKeyExternalizer.INSTANCE ); } @Test public void shouldSerializeAndDeserializeEntityKey() throws Exception { String[] columnNames = { "foo", "bar", "baz" }; EntityKeyMetadata keyMetadata = new DefaultEntityKeyMetadata( "Foobar", columnNames ); Object[] values = { 123, "Hello", 456L }; // given EntityKey key = new EntityKey( keyMetadata, values ); // when byte[] bytes = externalizerHelper.marshall( key ); EntityKey unmarshalledKey = externalizerHelper.unmarshall( bytes ); // then assertThat( unmarshalledKey.getTable() ).isEqualTo( key.getTable() ); assertThat( unmarshalledKey.getColumnNames() ).isEqualTo( key.getColumnNames() ); assertThat( unmarshalledKey.getColumnValues() ).isEqualTo( key.getColumnValues() ); assertTrue( key.equals( unmarshalledKey ) ); assertTrue( unmarshalledKey.equals( key ) ); assertThat( unmarshalledKey.hashCode() ).isEqualTo( key.hashCode() ); } @Test public void shouldRaiseErrorWhenUnmarshallingBytesWithUnknownVersion() throws Exception { ExternalizerTestHelper<EntityKey, FutureEntityKeyExternalizer> futureExternalizer = ExternalizerTestHelper.getInstance( new FutureEntityKeyExternalizer() ); String[] columnNames = { "foo", "bar", "baz" }; EntityKeyMetadata keyMetadata = new DefaultEntityKeyMetadata( "Foobar", columnNames ); Object[] values = { 123, "Hello", 456L }; EntityKey key = new EntityKey( keyMetadata, values ); // given byte[] bytes = futureExternalizer.marshall( key ); // then thrown.expect( HibernateException.class ); thrown.expectMessage( "OGM001101" ); // when externalizerHelper.unmarshall( bytes ); } /** * A faked future version of {@link EntityKeyExternalizer}. */ private static class FutureEntityKeyExternalizer implements AdvancedExternalizer<EntityKey> { @Override public void writeObject(ObjectOutput output, EntityKey object) throws IOException { // A future version output.writeInt( 5 ); } @Override public EntityKey readObject(ObjectInput input) throws IOException, ClassNotFoundException { throw new UnsupportedOperationException( "should not be invoked" ); } @Override public Set<Class<? extends EntityKey>> getTypeClasses() { return Collections.<Class<? extends EntityKey>>singleton( EntityKey.class ); } @Override public Integer getId() { return ExternalizerIds.PER_KIND_ENTITY_KEY; } } }