package vnet.sms.gateway.server.framework; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import javax.jms.ObjectMessage; import org.jboss.netty.channel.local.DefaultLocalServerChannelFactory; import org.jboss.netty.channel.local.LocalAddress; import org.junit.Test; import org.springframework.jms.core.JmsTemplate; import org.springframework.security.authentication.AuthenticationManager; import vnet.sms.common.messages.Msisdn; import vnet.sms.common.messages.Sms; import vnet.sms.gateway.server.framework.internal.channel.GatewayServerChannelPipelineFactory; import vnet.sms.gateway.server.framework.spi.GatewayServerDescription; import vnet.sms.gateway.server.framework.test.AcceptAllAuthenticationManager; import vnet.sms.gateway.server.framework.test.LocalClient; import vnet.sms.gateway.transports.serialization.ReferenceableMessageContainer; public class IncomingWindowingTest extends AbstractGatewayServerTest { @Test public final void assertThatGatewayServerForwardsUpToWindowSizeManySmsToJmsServer() throws Throwable { final LocalAddress serverAddress = new LocalAddress( "test:server:assertThatGatewayServerForwardsUpToWindowSizeManySmsToJmsServer"); final int availableIncomingWindows = 101; final long incomingWindowWaitTimeMillis = 1L; final long failedLoginResponseMillis = 100L; final int pingIntervalSeconds = 1; final long pingResponseTimeoutMillis = 200000L; final AuthenticationManager authenticationManager = new AcceptAllAuthenticationManager(); final JmsTemplate jmsTemplate = newJmsTemplate(); final GatewayServerChannelPipelineFactory<Integer, ReferenceableMessageContainer> channelPipelineFactory = newGatewayServerChannelPipelineFactory( "assertThatGatewayServerForwardsUpToWindowSizeManySmsToJmsServer", availableIncomingWindows, incomingWindowWaitTimeMillis, failedLoginResponseMillis, pingIntervalSeconds, pingResponseTimeoutMillis, authenticationManager, jmsTemplate); final GatewayServer<Integer, ReferenceableMessageContainer> objectUnderTest = new GatewayServer<Integer, ReferenceableMessageContainer>( new TestGatewayServerDescription(), "assertThatGatewayServerForwardsUpToWindowSizeManySmsToJmsServer", serverAddress, new DefaultLocalServerChannelFactory(), channelPipelineFactory); objectUnderTest.start(); final LocalClient client = new LocalClient(serverAddress); // Should start ping timeout client.connect(); // Login. Otherwise, our LoginResponse will be discarded client.login( 1, "assertThatGatewayServerForwardsUpToWindowSizeManySmsToJmsServer", "whatever"); // Discard forwarded LoginRequest jmsTemplate.receive(); // Login request uses up one window for (int i = 2; i <= availableIncomingWindows; i++) { final Sms sms = new Sms(new Msisdn("01686754432"), new Msisdn( "01686754432"), "assertThatGatewayServerForwardsUpToWindowSizeManySmsToJmsServer-" + i); client.sendMessage(i, sms); } client.disconnect(); for (int i = 2; i <= availableIncomingWindows; i++) { final ObjectMessage forwardedMessage = (ObjectMessage) jmsTemplate .receive(); assertNotNull("GatewayServer should have forwarded " + (i - 1) + "th SMS passed in to JMS server, yet it didn't", forwardedMessage); assertEquals( "GatewayServer should have forwarded SMS passed in to JMS server", Sms.class, forwardedMessage.getObject().getClass()); } objectUnderTest.stop(); } @SuppressWarnings("serial") private static final class TestGatewayServerDescription extends GatewayServerDescription { public TestGatewayServerDescription() { super("Test", 1, 0, 0, "BETA", "15"); } } @Test public final void assertThatGatewayServerDoesNotForwardMoreThanWindowSizeManySmsToJmsServer() throws Throwable { final LocalAddress serverAddress = new LocalAddress( "test:server:assertThatGatewayServerDoesNotForwardMoreThanWindowSizeManySmsToJmsServer"); final int availableIncomingWindows = 101; final long incomingWindowWaitTimeMillis = 1L; final long failedLoginResponseMillis = 100L; final int pingIntervalSeconds = 1; final long pingResponseTimeoutMillis = 200000L; final AuthenticationManager authenticationManager = new AcceptAllAuthenticationManager(); final JmsTemplate jmsTemplate = newJmsTemplate(); final GatewayServerChannelPipelineFactory<Integer, ReferenceableMessageContainer> channelPipelineFactory = newGatewayServerChannelPipelineFactory( "assertThatGatewayServerDoesNotForwardMoreThanWindowSizeManySmsToJmsServer", availableIncomingWindows, incomingWindowWaitTimeMillis, failedLoginResponseMillis, pingIntervalSeconds, pingResponseTimeoutMillis, authenticationManager, jmsTemplate); final GatewayServer<Integer, ReferenceableMessageContainer> objectUnderTest = new GatewayServer<Integer, ReferenceableMessageContainer>( new TestGatewayServerDescription(), "assertThatGatewayServerDoesNotForwardMoreThanWindowSizeManySmsToJmsServer", serverAddress, new DefaultLocalServerChannelFactory(), channelPipelineFactory); objectUnderTest.start(); final LocalClient client = new LocalClient(serverAddress); // Should start ping timeout client.connect(); // Login. Otherwise, our LoginResponse will be discarded client.login( 1, "assertThatGatewayServerDoesNotForwardMoreThanWindowSizeManySmsToJmsServer", "whatever"); // Discard forwarded LoginRequest jmsTemplate.receive(); // Login request uses up one window for (int i = 2; i <= availableIncomingWindows; i++) { final Sms sms = new Sms(new Msisdn("01686754432"), new Msisdn( "01686754432"), "assertThatGatewayServerDoesNotForwardMoreThanWindowSizeManySmsToJmsServer-" + i); client.sendMessage(i, sms); } client.disconnect(); for (int i = 2; i <= availableIncomingWindows; i++) { jmsTemplate.receive(); } final ObjectMessage forwardedMessage = (ObjectMessage) jmsTemplate .receive(); assertNull("GatewayServer should NOT have forwarded more that " + availableIncomingWindows + " messages to JMS server, yet it did", forwardedMessage); objectUnderTest.stop(); } }