package vnet.sms.gateway.server.framework.internal.channel; import static org.easymock.EasyMock.createNiceMock; import static org.junit.Assert.assertNotNull; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.group.DefaultChannelGroup; 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.jboss.netty.util.HashedWheelTimer; import org.junit.Test; import org.springframework.jmx.export.MBeanExporter; import org.springframework.jmx.export.notification.NotificationPublisher; import vnet.sms.common.messages.LoginRequest; import vnet.sms.common.messages.LoginResponse; import vnet.sms.gateway.nettysupport.monitor.incoming.InitialChannelEventsMonitor; import vnet.sms.gateway.nettytest.embedded.ChannelPipelineEmbedder; import vnet.sms.gateway.nettytest.embedded.DefaultChannelPipelineEmbedder; import vnet.sms.gateway.server.framework.internal.jmsbridge.IncomingMessagesForwardingJmsBridge; import vnet.sms.gateway.server.framework.test.AcceptAllAuthenticationManager; import vnet.sms.gateway.server.framework.test.NoopJmsTemplate; import vnet.sms.gateway.server.framework.test.SerialIntegersMessageReferenceGenerator; import vnet.sms.gateway.transports.serialization.ReferenceableMessageContainer; import vnet.sms.gateway.transports.serialization.incoming.SerializationTransportProtocolAdaptingUpstreamChannelHandler; import vnet.sms.gateway.transports.serialization.outgoing.SerializationTransportProtocolAdaptingDownstreamChannelHandler; import com.google.common.base.Predicate; import com.yammer.metrics.Metrics; public class GatewayServerChannelPipelineFactoryLoginTest { @Test public final void assertThatGatewayServerChannelPipelineRespondsWithASuccessfulLoginResponseToASuccessfulLoginRequest() throws Throwable { final int messageReference = 1; final LoginRequest successfulLoginRequest = new LoginRequest( "assertThatGatewayServerChannelPipelineRespondsWithASuccessfulLoginResponseToASuccessfulLoginRequest", "whatever"); final GatewayServerChannelPipelineFactory<Integer, ReferenceableMessageContainer> objectUnderTest = newGatewayServerChannelPipelineFactory(); final ChannelPipelineEmbedder embedder = new DefaultChannelPipelineEmbedder( objectUnderTest); embedder.connectChannel(); embedder.receive(ReferenceableMessageContainer.wrap(messageReference, successfulLoginRequest).encode()); final MessageEvent response = embedder.downstreamMessageEvents() .nextMatchingMessageEvent(new Predicate<MessageEvent>() { @Override public boolean apply(final MessageEvent event) { if (!ChannelBuffer.class.isInstance(event.getMessage())) { return false; } final ChannelBuffer cb = ChannelBuffer.class.cast(event .getMessage()); final ReferenceableMessageContainer rmc = ReferenceableMessageContainer .decode(cb); return ((rmc != null) && (rmc.getMessage() instanceof LoginResponse)) && LoginResponse.class.cast(rmc.getMessage()) .loginSucceeded(); } }); assertNotNull("GatewayServer should have returned LoginResponse", response); } private GatewayServerChannelPipelineFactory<Integer, ReferenceableMessageContainer> newGatewayServerChannelPipelineFactory() { final InitialChannelEventsMonitor initialChannelEventsMonitor = new InitialChannelEventsMonitor(); initialChannelEventsMonitor .setNotificationPublisher(createNiceMock(NotificationPublisher.class)); return new GatewayServerChannelPipelineFactory<Integer, ReferenceableMessageContainer>( "newObjectUnderTest", ReferenceableMessageContainer.class, new ObjectDecoder(ClassResolvers.cacheDisabled(null)), null, new ObjectEncoder(), new SerializationTransportProtocolAdaptingUpstreamChannelHandler(), new SerializationTransportProtocolAdaptingDownstreamChannelHandler(), new IncomingMessagesForwardingJmsBridge<Integer>( new NoopJmsTemplate()), 100, 10000, new AcceptAllAuthenticationManager(), 10000, new SerialIntegersMessageReferenceGenerator(), 100, 20000, new MBeanExporter(), initialChannelEventsMonitor, Metrics .defaultRegistry(), new HashedWheelTimer(), new DefaultChannelGroup()); } }