package vnet.sms.gateway.transport.plugin.context; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; import java.util.concurrent.atomic.AtomicReference; import org.jboss.netty.handler.codec.serialization.ClassResolvers; import org.jboss.netty.handler.codec.serialization.ObjectDecoder; import org.jboss.netty.handler.codec.serialization.ObjectEncoder; import org.junit.Test; import org.springframework.context.support.StaticApplicationContext; import vnet.sms.gateway.transport.plugin.TransportProtocolExtensionPoint; import vnet.sms.gateway.transport.spi.DefaultTransportProtocolPlugin; import vnet.sms.gateway.transport.spi.TransportProtocolPlugin; import vnet.sms.gateway.transports.serialization.MonotonicallyIncreasingMessageReferenceGenerator; import vnet.sms.gateway.transports.serialization.ReferenceableMessageContainer; import vnet.sms.gateway.transports.serialization.incoming.SerializationTransportProtocolAdaptingUpstreamChannelHandler; import vnet.sms.gateway.transports.serialization.outgoing.SerializationTransportProtocolAdaptingDownstreamChannelHandler; public class TransportProtocolPluginInjectorTest { @Test public final void assertThatPostProcessBeforeInitializationReturnsBeanPassedIn() { final Object beanPassedIn = new Object(); final TransportProtocolPluginInjector objectUnderTest = new TransportProtocolPluginInjector(); final Object returnedBean = objectUnderTest .postProcessBeforeInitialization(beanPassedIn, "assertThatPostProcessBeforeInitializationReturnsBeanPassedIn"); assertSame( "postProcessBeforeInitialization() did not return the bean that has been passed in", beanPassedIn, returnedBean); } @Test public final void assertThatPostProcessAfterInitializationReturnsBeanPassedIn() { final Object beanPassedIn = new Object(); final TransportProtocolPluginInjector objectUnderTest = new TransportProtocolPluginInjector(); final Object returnedBean = objectUnderTest .postProcessAfterInitialization(beanPassedIn, "assertThatPostProcessAfterInitializationReturnsBeanPassedIn"); assertSame( "postProcessAfterInitialization() did not return the bean that has been passed in", beanPassedIn, returnedBean); } @Test(expected = IllegalStateException.class) public final void assertThatPostProcessBeforeInitializationRecognizesMissingApplicationContext() { final AtomicReference<TransportProtocolPlugin<Integer, ReferenceableMessageContainer>> transportProtocolPluginHolder = new AtomicReference<TransportProtocolPlugin<Integer, ReferenceableMessageContainer>>(); final TransportProtocolExtensionPoint<Integer, ReferenceableMessageContainer> extensionPoint = new TransportProtocolExtensionPoint<Integer, ReferenceableMessageContainer>() { @Override public void plugin( final TransportProtocolPlugin<Integer, ReferenceableMessageContainer> plugin) { transportProtocolPluginHolder.set(plugin); } }; final TransportProtocolPluginInjector objectUnderTest = new TransportProtocolPluginInjector(); objectUnderTest .postProcessBeforeInitialization(extensionPoint, "assertThatPostProcessBeforeInitializationRecognizesMissingApplicationContext"); } @Test public final void assertThatPostProcessBeforeInitializationInjectsTransportProtocolPluginIntoTransportProtocolExtensionPoint() { final AtomicReference<TransportProtocolPlugin<Integer, ReferenceableMessageContainer>> transportProtocolPluginHolder = new AtomicReference<TransportProtocolPlugin<Integer, ReferenceableMessageContainer>>(); final TransportProtocolExtensionPoint<Integer, ReferenceableMessageContainer> extensionPoint = new TransportProtocolExtensionPoint<Integer, ReferenceableMessageContainer>() { @Override public void plugin( final TransportProtocolPlugin<Integer, ReferenceableMessageContainer> plugin) { transportProtocolPluginHolder.set(plugin); } }; final StaticApplicationContext appContext = new StaticApplicationContext(); appContext .registerSingleton( "assertThatPostProcessAfterInitializationInjectsTransportProtocolPluginIntoTransportProtocolExtensionPoint", TestTransportProtocolPlugin.class); final TransportProtocolPluginInjector objectUnderTest = new TransportProtocolPluginInjector(); objectUnderTest.setApplicationContext(appContext); objectUnderTest .postProcessBeforeInitialization( extensionPoint, "assertThatPostProcessBeforeInitializationInjectsTransportProtocolPluginIntoTransportProtocolExtensionPoint"); assertNotNull( "postProcessBeforeInitialization() did NOT inject TransportProtocolPlugin into TransportProtocolExtensionPoint", transportProtocolPluginHolder.get()); } private static class TestTransportProtocolPlugin extends DefaultTransportProtocolPlugin<Integer, ReferenceableMessageContainer> { TestTransportProtocolPlugin() { super( ReferenceableMessageContainer.class, new ObjectDecoder(ClassResolvers.cacheDisabled(null)), null, new ObjectEncoder(), new SerializationTransportProtocolAdaptingUpstreamChannelHandler(), new SerializationTransportProtocolAdaptingDownstreamChannelHandler(), new MonotonicallyIncreasingMessageReferenceGenerator()); } } @Test(expected = IllegalArgumentException.class) public final void assertThatSetApplicationContextRejectsNullApplicationContext() { final TransportProtocolPluginInjector objectUnderTest = new TransportProtocolPluginInjector(); objectUnderTest.setApplicationContext(null); } }