/* * Copyright Terracotta, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.ehcache.impl.internal.spi.serialization; import org.ehcache.CachePersistenceException; import org.ehcache.core.spi.service.DiskResourceService; import org.ehcache.core.spi.service.FileBasedPersistenceContext; import org.ehcache.impl.config.serializer.DefaultSerializationProviderConfiguration; import org.ehcache.impl.config.serializer.DefaultSerializerConfiguration; import org.ehcache.impl.serialization.ByteArraySerializer; import org.ehcache.impl.serialization.CharSerializer; import org.ehcache.impl.serialization.CompactJavaSerializer; import org.ehcache.impl.serialization.DoubleSerializer; import org.ehcache.impl.serialization.FloatSerializer; import org.ehcache.impl.serialization.IntegerSerializer; import org.ehcache.impl.serialization.LongSerializer; import org.ehcache.impl.serialization.StringSerializer; import org.ehcache.spi.persistence.PersistableResourceService; import org.ehcache.spi.persistence.StateRepository; import org.ehcache.spi.serialization.Serializer; import org.ehcache.spi.serialization.SerializerException; import org.ehcache.spi.serialization.StatefulSerializer; import org.ehcache.spi.serialization.UnsupportedTypeException; import org.ehcache.spi.service.Service; import org.ehcache.spi.service.ServiceProvider; import org.hamcrest.Matchers; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import java.io.Closeable; import java.io.File; import java.io.IOException; import java.io.Serializable; import java.nio.ByteBuffer; import java.util.HashMap; import java.util.concurrent.atomic.AtomicInteger; import static java.lang.ClassLoader.getSystemClassLoader; import static org.ehcache.impl.internal.spi.TestServiceProvider.providerContaining; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; /** * @author Ludovic Orban */ public class DefaultSerializationProviderTest { @Rule public TemporaryFolder tempFolder = new TemporaryFolder(); @Rule public ExpectedException expectedException = ExpectedException.none(); @Test public void testCreateSerializerNoConfig() throws Exception { DefaultSerializationProviderConfiguration dspfConfig = new DefaultSerializationProviderConfiguration(); DefaultSerializationProvider dsp = new DefaultSerializationProvider(dspfConfig); dsp.start(providerContaining()); assertThat(dsp.createValueSerializer(HashMap.class, ClassLoader.getSystemClassLoader()), instanceOf(CompactJavaSerializer.class)); try { dsp.createValueSerializer(Object.class, ClassLoader.getSystemClassLoader()); fail("expected UnsupportedTypeException"); } catch (UnsupportedTypeException ute) { // expected } } @Test public void testCreateSerializerWithConfig() throws Exception { DefaultSerializationProviderConfiguration dspfConfig = new DefaultSerializationProviderConfiguration(); DefaultSerializationProvider dsp = new DefaultSerializationProvider(dspfConfig); dsp.start(providerContaining()); @SuppressWarnings("unchecked") DefaultSerializerConfiguration dspConfig = new DefaultSerializerConfiguration(getSerializerClass(), DefaultSerializerConfiguration.Type.VALUE); assertThat(dsp.createValueSerializer(String.class, ClassLoader.getSystemClassLoader(), dspConfig), instanceOf(TestSerializer.class)); assertThat(dsp.createValueSerializer(Object.class, ClassLoader.getSystemClassLoader(), dspConfig), instanceOf(TestSerializer.class)); } @Test public void testCreateSerializerWithFactoryConfig() throws Exception { DefaultSerializationProviderConfiguration dspfConfig = new DefaultSerializationProviderConfiguration(); Class<Serializer<Long>> serializerClass = getSerializerClass(); dspfConfig.addSerializerFor(Long.class, serializerClass); DefaultSerializationProvider dsp = new DefaultSerializationProvider(dspfConfig); dsp.start(providerContaining()); assertThat(dsp.createValueSerializer(Long.class, ClassLoader.getSystemClassLoader()), instanceOf(TestSerializer.class)); assertThat(dsp.createValueSerializer(HashMap.class, ClassLoader.getSystemClassLoader()), instanceOf(CompactJavaSerializer.class)); } @SuppressWarnings("unchecked") private <T> Class<Serializer<T>> getSerializerClass() { return (Class) TestSerializer.class; } @Test public void testCreateTransientSerializers() throws Exception { DefaultSerializationProviderConfiguration dspfConfig = new DefaultSerializationProviderConfiguration(); Class<Serializer<String>> serializerClass = getSerializerClass(); dspfConfig.addSerializerFor(String.class, serializerClass); DefaultSerializationProvider dsp = new DefaultSerializationProvider(dspfConfig); dsp.start(providerContaining()); assertThat(dsp.createKeySerializer(String.class, getSystemClassLoader()), instanceOf(TestSerializer.class)); assertThat(dsp.createKeySerializer(Serializable.class, getSystemClassLoader()), instanceOf(CompactJavaSerializer.class)); assertThat(dsp.createKeySerializer(Integer.class, getSystemClassLoader()), instanceOf(IntegerSerializer.class)); } @Test public void tesCreateTransientSerializersWithOverriddenSerializableType() throws Exception { DefaultSerializationProviderConfiguration dspfConfig = new DefaultSerializationProviderConfiguration(); Class<Serializer<Serializable>> serializerClass = getSerializerClass(); dspfConfig.addSerializerFor(Serializable.class, serializerClass); DefaultSerializationProvider dsp = new DefaultSerializationProvider(dspfConfig); dsp.start(providerContaining()); assertThat(dsp.createKeySerializer(HashMap.class, getSystemClassLoader()), instanceOf(TestSerializer.class)); assertThat(dsp.createKeySerializer(Serializable.class, getSystemClassLoader()), instanceOf(TestSerializer.class)); assertThat(dsp.createKeySerializer(Integer.class, getSystemClassLoader()), instanceOf(IntegerSerializer.class)); } @Test public void testRemembersCreationConfigurationAfterStopStart() throws UnsupportedTypeException { DefaultSerializationProviderConfiguration configuration = new DefaultSerializationProviderConfiguration(); Class<Serializer<String>> serializerClass = getSerializerClass(); configuration.addSerializerFor(String.class, serializerClass); DefaultSerializationProvider serializationProvider = new DefaultSerializationProvider(configuration); @SuppressWarnings("unchecked") ServiceProvider<Service> serviceProvider = mock(ServiceProvider.class); serializationProvider.start(serviceProvider); assertThat(serializationProvider.createKeySerializer(String.class, getSystemClassLoader()), instanceOf(TestSerializer.class)); serializationProvider.stop(); serializationProvider.start(serviceProvider); assertThat(serializationProvider.createKeySerializer(String.class, getSystemClassLoader()), instanceOf(TestSerializer.class)); } @Test public void testReleaseSerializerWithProvidedCloseableSerializerDoesNotClose() throws Exception { DefaultSerializationProvider provider = new DefaultSerializationProvider(null); CloseableSerializer closeableSerializer = new CloseableSerializer(); provider.providedVsCount.put(closeableSerializer, new AtomicInteger(1)); provider.releaseSerializer(closeableSerializer); assertThat(closeableSerializer.closed, is(false)); } @Test public void testReleaseSerializerWithInstantiatedCloseableSerializerDoesClose() throws Exception { @SuppressWarnings("unchecked") Class<? extends Serializer<String>> serializerClass = (Class) CloseableSerializer.class; DefaultSerializerConfiguration<String> config = new DefaultSerializerConfiguration<String>(serializerClass, DefaultSerializerConfiguration.Type.KEY); DefaultSerializationProvider provider = new DefaultSerializationProvider(null); Serializer serializer = provider.createKeySerializer(String.class, getSystemClassLoader(), config); provider.releaseSerializer(serializer); assertTrue(((CloseableSerializer)serializer).closed); } @Test(expected = IllegalArgumentException.class) public void testReleaseSerializerByAnotherProvider() throws Exception { DefaultSerializationProvider provider = new DefaultSerializationProvider(null); Serializer<?> serializer = mock(Serializer.class); provider.releaseSerializer(serializer); } @Test(expected = IllegalArgumentException.class) public void testReleaseSameInstanceMultipleTimesThrows() throws Exception { DefaultSerializationProvider provider = new DefaultSerializationProvider(null); Serializer<?> serializer = mock(Serializer.class); provider.providedVsCount.put(serializer, new AtomicInteger(1)); provider.releaseSerializer(serializer); assertThat(provider.providedVsCount.get("foo"), Matchers.nullValue()); provider.releaseSerializer(serializer); } @Test public void testCreateKeySerializerWithActualInstanceInServiceConfig() throws Exception { DefaultSerializationProvider provider = new DefaultSerializationProvider(null); @SuppressWarnings("unchecked") TestSerializer<String> serializer = mock(TestSerializer.class); DefaultSerializerConfiguration<String> config = new DefaultSerializerConfiguration<String>(serializer, DefaultSerializerConfiguration.Type.KEY); Serializer<?> created = provider.createKeySerializer(TestSerializer.class, getSystemClassLoader(), config); assertSame(serializer, created); } @Test public void testSameInstanceRetrievedMultipleTimesUpdatesTheProvidedCount() throws Exception { DefaultSerializationProvider provider = new DefaultSerializationProvider(null); @SuppressWarnings("unchecked") TestSerializer<String> serializer = mock(TestSerializer.class); DefaultSerializerConfiguration<String> config = new DefaultSerializerConfiguration<String>(serializer, DefaultSerializerConfiguration.Type.KEY); Serializer<?> created = provider.createKeySerializer(TestSerializer.class, getSystemClassLoader(), config); assertSame(serializer, created); assertThat(provider.providedVsCount.get(created).get(), is(1)); created = provider.createKeySerializer(TestSerializer.class, getSystemClassLoader(), config); assertSame(serializer, created); assertThat(provider.providedVsCount.get(created).get(), is(2)); } @Test public void testDefaultSerializableSerializer() throws Exception { DefaultSerializationProvider provider = getStartedProvider(); Serializer<Serializable> keySerializer = provider.createKeySerializer(Serializable.class, getSystemClassLoader()); assertThat(keySerializer, instanceOf(CompactJavaSerializer.class)); keySerializer = provider.createKeySerializer(Serializable.class, getSystemClassLoader(), getPersistenceSpaceIdentifierMock()); assertThat(keySerializer, instanceOf(CompactJavaSerializer.class)); } @Test public void testDefaultStringSerializer() throws Exception { DefaultSerializationProvider provider = getStartedProvider(); Serializer<String> keySerializer = provider.createKeySerializer(String.class, getSystemClassLoader()); assertThat(keySerializer, instanceOf(StringSerializer.class)); keySerializer = provider.createKeySerializer(String.class, getSystemClassLoader(), getPersistenceSpaceIdentifierMock()); assertThat(keySerializer, instanceOf(StringSerializer.class)); } @Test public void testDefaultIntegerSerializer() throws Exception { DefaultSerializationProvider provider = getStartedProvider(); Serializer<Integer> keySerializer = provider.createKeySerializer(Integer.class, getSystemClassLoader()); assertThat(keySerializer, instanceOf(IntegerSerializer.class)); keySerializer = provider.createKeySerializer(Integer.class, getSystemClassLoader(), getPersistenceSpaceIdentifierMock()); assertThat(keySerializer, instanceOf(IntegerSerializer.class)); } @Test public void testDefaultLongSerializer() throws Exception { DefaultSerializationProvider provider = getStartedProvider(); Serializer<Long> keySerializer = provider.createKeySerializer(Long.class, getSystemClassLoader()); assertThat(keySerializer, instanceOf(LongSerializer.class)); keySerializer = provider.createKeySerializer(Long.class, getSystemClassLoader(), getPersistenceSpaceIdentifierMock()); assertThat(keySerializer, instanceOf(LongSerializer.class)); } @Test public void testDefaultCharSerializer() throws Exception { DefaultSerializationProvider provider = getStartedProvider(); Serializer<Character> keySerializer = provider.createKeySerializer(Character.class, getSystemClassLoader()); assertThat(keySerializer, instanceOf(CharSerializer.class)); keySerializer = provider.createKeySerializer(Character.class, getSystemClassLoader(), getPersistenceSpaceIdentifierMock()); assertThat(keySerializer, instanceOf(CharSerializer.class)); } @Test public void testDefaultDoubleSerializer() throws Exception { DefaultSerializationProvider provider = getStartedProvider(); Serializer<Double> keySerializer = provider.createKeySerializer(Double.class, getSystemClassLoader()); assertThat(keySerializer, instanceOf(DoubleSerializer.class)); keySerializer = provider.createKeySerializer(Double.class, getSystemClassLoader(), getPersistenceSpaceIdentifierMock()); assertThat(keySerializer, instanceOf(DoubleSerializer.class)); } @Test public void testDefaultFloatSerializer() throws Exception { DefaultSerializationProvider provider = getStartedProvider(); Serializer<Float> keySerializer = provider.createKeySerializer(Float.class, getSystemClassLoader()); assertThat(keySerializer, instanceOf(FloatSerializer.class)); keySerializer = provider.createKeySerializer(Float.class, getSystemClassLoader(), getPersistenceSpaceIdentifierMock()); assertThat(keySerializer, instanceOf(FloatSerializer.class)); } @Test public void testDefaultByteArraySerializer() throws Exception { DefaultSerializationProvider provider = getStartedProvider(); Serializer<byte[]> keySerializer = provider.createKeySerializer(byte[].class, getSystemClassLoader()); assertThat(keySerializer, instanceOf(ByteArraySerializer.class)); keySerializer = provider.createKeySerializer(byte[].class, getSystemClassLoader(), getPersistenceSpaceIdentifierMock()); assertThat(keySerializer, instanceOf(ByteArraySerializer.class)); } @Test public void testCreateTransientSerializerWithoutConstructor() throws Exception { expectedException.expect(RuntimeException.class); expectedException.expectMessage("does not have a constructor that takes in a ClassLoader."); DefaultSerializationProvider provider = new DefaultSerializationProvider(null); provider.start(providerContaining()); @SuppressWarnings("unchecked") Class<Serializer<Object>> serializerClass = (Class) BaseSerializer.class; DefaultSerializerConfiguration<Object> configuration = new DefaultSerializerConfiguration<Object>(serializerClass, DefaultSerializerConfiguration.Type.VALUE); provider.createValueSerializer(Object.class, ClassLoader.getSystemClassLoader(), configuration); } @Test public void testCreatePersistentSerializerWithoutConstructor() throws Exception { expectedException.expect(RuntimeException.class); expectedException.expectMessage("does not have a constructor that takes in a ClassLoader."); DefaultSerializationProvider provider = new DefaultSerializationProvider(null); provider.start(providerContaining()); @SuppressWarnings("unchecked") Class<Serializer<Object>> serializerClass = (Class) BaseSerializer.class; DefaultSerializerConfiguration<Object> configuration = new DefaultSerializerConfiguration<Object>(serializerClass, DefaultSerializerConfiguration.Type.VALUE); provider.createValueSerializer(Object.class, ClassLoader.getSystemClassLoader(), configuration, getPersistenceSpaceIdentifierMock()); } @Test public void testCreateTransientStatefulSerializerWithoutConstructor() throws Exception { expectedException.expect(RuntimeException.class); expectedException.expectMessage("does not have a constructor that takes in a ClassLoader."); DefaultSerializationProvider provider = new DefaultSerializationProvider(null); provider.start(providerContaining()); @SuppressWarnings("unchecked") Class<Serializer<Object>> serializerClass = (Class) StatefulBaseSerializer.class; DefaultSerializerConfiguration<Object> configuration = new DefaultSerializerConfiguration<Object>(serializerClass, DefaultSerializerConfiguration.Type.VALUE); provider.createValueSerializer(Object.class, ClassLoader.getSystemClassLoader(), configuration); } @Test public void testCreatePersistentStatefulSerializerWithoutConstructor() throws Exception { expectedException.expect(RuntimeException.class); expectedException.expectMessage("does not have a constructor that takes in a ClassLoader."); DefaultSerializationProvider provider = new DefaultSerializationProvider(null); provider.start(providerContaining()); @SuppressWarnings("unchecked") Class<Serializer<Object>> serializerClass = (Class) StatefulBaseSerializer.class; DefaultSerializerConfiguration<Object> configuration = new DefaultSerializerConfiguration<Object>(serializerClass, DefaultSerializerConfiguration.Type.VALUE); provider.createValueSerializer(Object.class, ClassLoader.getSystemClassLoader(), configuration, getPersistenceSpaceIdentifierMock()); } @Test public void testCreateTransientMinimalSerializer() throws Exception { DefaultSerializationProvider provider = new DefaultSerializationProvider(null); provider.start(providerContaining()); MinimalSerializer.baseConstructorInvoked = false; @SuppressWarnings("unchecked") Class<Serializer<Object>> serializerClass = (Class) MinimalSerializer.class; DefaultSerializerConfiguration<Object> configuration = new DefaultSerializerConfiguration<Object>(serializerClass, DefaultSerializerConfiguration.Type.VALUE); Serializer<Object> valueSerializer = provider.createValueSerializer(Object.class, ClassLoader.getSystemClassLoader(), configuration); assertThat(valueSerializer, instanceOf(MinimalSerializer.class)); assertThat(MinimalSerializer.baseConstructorInvoked, is(true)); } @Test public void testCreatePersistentMinimalSerializer() throws Exception { DefaultSerializationProvider provider = new DefaultSerializationProvider(null); provider.start(providerContaining()); MinimalSerializer.baseConstructorInvoked = false; @SuppressWarnings("unchecked") Class<Serializer<Object>> serializerClass = (Class) MinimalSerializer.class; DefaultSerializerConfiguration<Object> configuration = new DefaultSerializerConfiguration<Object>(serializerClass, DefaultSerializerConfiguration.Type.VALUE); Serializer<Object> valueSerializer = provider.createValueSerializer(Object.class, ClassLoader.getSystemClassLoader(), configuration, getPersistenceSpaceIdentifierMock()); assertThat(valueSerializer, instanceOf(MinimalSerializer.class)); assertThat(MinimalSerializer.baseConstructorInvoked, is(true)); } @Test public void testTransientMinimalStatefulSerializer() throws Exception { DefaultSerializationProvider provider = new DefaultSerializationProvider(null); provider.start(providerContaining()); MinimalStatefulSerializer.baseConstructorInvoked = false; @SuppressWarnings("unchecked") Class<Serializer<Object>> serializerClass = (Class) MinimalStatefulSerializer.class; DefaultSerializerConfiguration<Object> configuration = new DefaultSerializerConfiguration<Object>(serializerClass, DefaultSerializerConfiguration.Type.VALUE); Serializer<Object> valueSerializer = provider.createValueSerializer(Object.class, ClassLoader.getSystemClassLoader(), configuration); assertThat(valueSerializer, instanceOf(MinimalStatefulSerializer.class)); assertThat(MinimalStatefulSerializer.baseConstructorInvoked, is(true)); } @Test public void testPersistentMinimalStatefulSerializer() throws Exception { DefaultSerializationProvider provider = new DefaultSerializationProvider(null); provider.start(providerContaining()); MinimalStatefulSerializer.baseConstructorInvoked = false; @SuppressWarnings("unchecked") Class<Serializer<Object>> serializerClass = (Class) MinimalStatefulSerializer.class; DefaultSerializerConfiguration<Object> configuration = new DefaultSerializerConfiguration<Object>(serializerClass, DefaultSerializerConfiguration.Type.VALUE); Serializer<Object> valueSerializer = provider.createValueSerializer(Object.class, ClassLoader.getSystemClassLoader(), configuration, getPersistenceSpaceIdentifierMock()); assertThat(valueSerializer, instanceOf(MinimalStatefulSerializer.class)); assertThat(MinimalStatefulSerializer.baseConstructorInvoked, is(true)); } @Test public void testTransientLegacySerializer() throws Exception { expectedException.expect(RuntimeException.class); expectedException.expectMessage("does not have a constructor that takes in a ClassLoader."); DefaultSerializationProvider provider = new DefaultSerializationProvider(null); provider.start(providerContaining()); @SuppressWarnings("unchecked") Class<Serializer<Object>> serializerClass = (Class) LegacySerializer.class; DefaultSerializerConfiguration<Object> configuration = new DefaultSerializerConfiguration<Object>(serializerClass, DefaultSerializerConfiguration.Type.VALUE); provider.createValueSerializer(Object.class, ClassLoader.getSystemClassLoader(), configuration); } @Test public void testPersistentLegacySerializer() throws Exception { DefaultSerializationProvider provider = getStartedProvider(); LegacySerializer.legacyConstructorInvoked = false; @SuppressWarnings("unchecked") Class<Serializer<Object>> serializerClass = (Class) LegacySerializer.class; DefaultSerializerConfiguration<Object> configuration = new DefaultSerializerConfiguration<Object>(serializerClass, DefaultSerializerConfiguration.Type.VALUE); expectedException.expect(RuntimeException.class); expectedException.expectMessage("does not have a constructor that takes in a ClassLoader."); Serializer<Object> valueSerializer = provider.createValueSerializer(Object.class, ClassLoader.getSystemClassLoader(), configuration, getPersistenceSpaceIdentifierMock()); assertThat(valueSerializer, instanceOf(LegacySerializer.class)); assertThat(LegacySerializer.legacyConstructorInvoked, is(true)); } @Test public void testTransientLegacyComboSerializer() throws Exception { DefaultSerializationProvider provider = new DefaultSerializationProvider(null); provider.start(providerContaining()); LegacyComboSerializer.baseConstructorInvoked = false; LegacyComboSerializer.legacyConstructorInvoked = false; @SuppressWarnings("unchecked") Class<Serializer<Object>> serializerClass = (Class) LegacyComboSerializer.class; DefaultSerializerConfiguration<Object> configuration = new DefaultSerializerConfiguration<Object>(serializerClass, DefaultSerializerConfiguration.Type.VALUE); Serializer<Object> valueSerializer = provider.createValueSerializer(Object.class, ClassLoader.getSystemClassLoader(), configuration); assertThat(valueSerializer, instanceOf(LegacyComboSerializer.class)); assertThat(LegacyComboSerializer.baseConstructorInvoked, is(true)); assertThat(LegacyComboSerializer.legacyConstructorInvoked, is(false)); } @Test public void testPersistentLegacyComboSerializer() throws Exception { DefaultSerializationProvider provider = getStartedProvider(); LegacyComboSerializer.baseConstructorInvoked = false; LegacyComboSerializer.legacyConstructorInvoked = false; @SuppressWarnings("unchecked") Class<Serializer<Object>> serializerClass = (Class) LegacyComboSerializer.class; DefaultSerializerConfiguration<Object> configuration = new DefaultSerializerConfiguration<Object>(serializerClass, DefaultSerializerConfiguration.Type.VALUE); Serializer<Object> valueSerializer = provider.createValueSerializer(Object.class, ClassLoader.getSystemClassLoader(), configuration, getPersistenceSpaceIdentifierMock()); assertThat(valueSerializer, instanceOf(LegacyComboSerializer.class)); assertThat(LegacyComboSerializer.baseConstructorInvoked, is(true)); assertThat(LegacyComboSerializer.legacyConstructorInvoked, is(false)); } @Test public void testCreateTransientStatefulLegacySerializer() throws Exception { expectedException.expect(RuntimeException.class); expectedException.expectMessage("does not have a constructor that takes in a ClassLoader."); DefaultSerializationProvider provider = new DefaultSerializationProvider(null); provider.start(providerContaining()); @SuppressWarnings("unchecked") Class<Serializer<Object>> serializerClass = (Class) StatefulLegacySerializer.class; DefaultSerializerConfiguration<Object> configuration = new DefaultSerializerConfiguration<Object>(serializerClass, DefaultSerializerConfiguration.Type.VALUE); provider.createValueSerializer(Object.class, ClassLoader.getSystemClassLoader(), configuration); } @Test public void testCreatePersistentStatefulLegacySerializer() throws Exception { expectedException.expect(RuntimeException.class); expectedException.expectMessage("does not have a constructor that takes in a ClassLoader."); DefaultSerializationProvider provider = new DefaultSerializationProvider(null); provider.start(providerContaining()); @SuppressWarnings("unchecked") Class<Serializer<Object>> serializerClass = (Class) StatefulLegacySerializer.class; DefaultSerializerConfiguration<Object> configuration = new DefaultSerializerConfiguration<Object>(serializerClass, DefaultSerializerConfiguration.Type.VALUE); provider.createValueSerializer(Object.class, ClassLoader.getSystemClassLoader(), configuration, getPersistenceSpaceIdentifierMock()); } @Test public void testTransientStatefulLegacyComboSerializer() throws Exception { DefaultSerializationProvider provider = new DefaultSerializationProvider(null); provider.start(providerContaining()); StatefulLegacyComboSerializer.baseConstructorInvoked = false; StatefulLegacyComboSerializer.legacyConstructorInvoked = false; @SuppressWarnings("unchecked") Class<Serializer<Object>> serializerClass = (Class) StatefulLegacyComboSerializer.class; DefaultSerializerConfiguration<Object> configuration = new DefaultSerializerConfiguration<Object>(serializerClass, DefaultSerializerConfiguration.Type.VALUE); Serializer<Object> valueSerializer = provider.createValueSerializer(Object.class, ClassLoader.getSystemClassLoader(), configuration); assertThat(valueSerializer, instanceOf(StatefulLegacyComboSerializer.class)); assertThat(StatefulLegacyComboSerializer.baseConstructorInvoked, is(true)); assertThat(StatefulLegacyComboSerializer.legacyConstructorInvoked, is(false)); } @Test public void testPersistentStatefulLegacyComboSerializer() throws Exception { DefaultSerializationProvider provider = getStartedProvider(); StatefulLegacyComboSerializer.baseConstructorInvoked = false; StatefulLegacyComboSerializer.legacyConstructorInvoked = false; @SuppressWarnings("unchecked") Class<Serializer<Object>> serializerClass = (Class) StatefulLegacyComboSerializer.class; DefaultSerializerConfiguration<Object> configuration = new DefaultSerializerConfiguration<Object>(serializerClass, DefaultSerializerConfiguration.Type.VALUE); Serializer<Object> valueSerializer = provider.createValueSerializer(Object.class, ClassLoader.getSystemClassLoader(), configuration, getPersistenceSpaceIdentifierMock()); assertThat(valueSerializer, instanceOf(StatefulLegacyComboSerializer.class)); assertThat(StatefulLegacyComboSerializer.baseConstructorInvoked, is(true)); assertThat(StatefulLegacyComboSerializer.legacyConstructorInvoked, is(false)); } private PersistableResourceService.PersistenceSpaceIdentifier getPersistenceSpaceIdentifierMock() { PersistableResourceService.PersistenceSpaceIdentifier spaceIdentifier = mock(DiskResourceService.PersistenceSpaceIdentifier.class); when(spaceIdentifier.getServiceType()).thenReturn(DiskResourceService.class); return spaceIdentifier; } private DefaultSerializationProvider getStartedProvider() throws CachePersistenceException { DefaultSerializationProvider defaultProvider = new DefaultSerializationProvider(null); @SuppressWarnings("unchecked") ServiceProvider<Service> serviceProvider = mock(ServiceProvider.class); DiskResourceService diskResourceService = mock(DiskResourceService.class); when(diskResourceService.createPersistenceContextWithin(any(PersistableResourceService.PersistenceSpaceIdentifier.class), anyString())) .thenReturn(new FileBasedPersistenceContext() { @Override public File getDirectory() { try { return tempFolder.newFolder(); } catch (IOException e) { fail("unable to create persistence "); return null; } } }); when(serviceProvider.getService(DiskResourceService.class)).thenReturn(diskResourceService); defaultProvider.start(serviceProvider); return defaultProvider; } public static class TestSerializer<T> implements Serializer<T> { public TestSerializer(ClassLoader classLoader) { } @Override public ByteBuffer serialize(T object) { return null; } @Override public T read(ByteBuffer binary) { return null; } @Override public boolean equals(T object, ByteBuffer binary) { return false; } } public static class CloseableSerializer<T> implements Serializer<T>, Closeable { boolean closed = false; public CloseableSerializer() { } public CloseableSerializer(ClassLoader classLoader) { } @Override public void close() throws IOException { closed = true; } @Override public ByteBuffer serialize(Object object) throws SerializerException { return null; } @Override public T read(ByteBuffer binary) throws ClassNotFoundException, SerializerException { return null; } @Override public boolean equals(Object object, ByteBuffer binary) throws ClassNotFoundException, SerializerException { return false; } } public static class BaseSerializer<T> implements Serializer<T> { @Override public ByteBuffer serialize(final T object) throws SerializerException { return null; } @Override public T read(final ByteBuffer binary) throws ClassNotFoundException, SerializerException { return null; } @Override public boolean equals(final T object, final ByteBuffer binary) throws ClassNotFoundException, SerializerException { return false; } } public static class MinimalSerializer<T> extends BaseSerializer<T> { private static boolean baseConstructorInvoked = false; public MinimalSerializer(ClassLoader loader) { baseConstructorInvoked = true; } } //Stateful but no constructor public static class StatefulBaseSerializer<T> extends BaseSerializer<T> implements StatefulSerializer<T> { @Override public void init(final StateRepository stateRepository) { } } public static class MinimalStatefulSerializer<T> extends BaseSerializer<T> implements StatefulSerializer<T> { private static boolean baseConstructorInvoked = false; public MinimalStatefulSerializer(ClassLoader loader) { baseConstructorInvoked = true; } @Override public void init(final StateRepository stateRepository) { } } public static class LegacySerializer<T> extends BaseSerializer<T> { private static boolean legacyConstructorInvoked = false; public LegacySerializer(ClassLoader loader, FileBasedPersistenceContext context) { legacyConstructorInvoked = true; } } public static class LegacyComboSerializer<T> extends BaseSerializer<T> { private static boolean baseConstructorInvoked = false; private static boolean legacyConstructorInvoked = false; public LegacyComboSerializer(ClassLoader loader) { baseConstructorInvoked = true; } public LegacyComboSerializer(ClassLoader loader, FileBasedPersistenceContext context) { legacyConstructorInvoked = true; } } public static class StatefulLegacySerializer<T> extends StatefulBaseSerializer<T> { private static boolean legacyConstructorInvoked = false; public StatefulLegacySerializer(ClassLoader loader, FileBasedPersistenceContext context) { legacyConstructorInvoked = true; } } public static class StatefulLegacyComboSerializer<T> extends BaseSerializer<T> implements StatefulSerializer<T> { private static boolean baseConstructorInvoked = false; private static boolean legacyConstructorInvoked = false; public StatefulLegacyComboSerializer(final ClassLoader loader) { baseConstructorInvoked = true; } public StatefulLegacyComboSerializer(ClassLoader loader, FileBasedPersistenceContext context) { legacyConstructorInvoked = true; } @Override public void init(final StateRepository stateRepository) { } } }