package vnet.sms.gateway.nettysupport.window.incoming; import static org.easymock.EasyMock.createNiceMock; import static org.easymock.EasyMock.replay; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.net.InetSocketAddress; import java.util.Map; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.UpstreamMessageEvent; import org.junit.Test; import vnet.sms.common.messages.GsmPdu; import vnet.sms.common.messages.PingRequest; import vnet.sms.common.wme.receive.ReceivedPingRequestEvent; public class IncomingWindowStoreTest { @Test public final void assertThatGetCurrentMessageCountReturnsNumberOfCurrentlyStoredMessages() throws IllegalArgumentException, InterruptedException { final int expectedNumberOfMessages = 234; final IncomingWindowStore<Integer> objectUnderTest = new IncomingWindowStore<Integer>( 10000, 10); final Channel mockChannel = createNiceMock(Channel.class); replay(mockChannel); for (int i = 1; i <= expectedNumberOfMessages; i++) { final PingRequest pingRequest = new PingRequest(); objectUnderTest .tryAcquireWindow(new ReceivedPingRequestEvent<Integer>( Integer.valueOf(i), new UpstreamMessageEvent( mockChannel, pingRequest, new InetSocketAddress(0)), pingRequest)); } assertEquals( "getCurrentMessageCount() did not return the correct number of currently stored messages", expectedNumberOfMessages, objectUnderTest.getCurrentMessageCount()); } @Test public final void assertThatTryAcquireWindowSucceedsIfAWindowIsAvailable() throws IllegalArgumentException, InterruptedException { final int windowStoreCapacity = 234; final IncomingWindowStore<Integer> objectUnderTest = new IncomingWindowStore<Integer>( windowStoreCapacity, 10); final Channel mockChannel = createNiceMock(Channel.class); replay(mockChannel); for (int i = 1; i < windowStoreCapacity; i++) { final PingRequest pingRequest = new PingRequest(); objectUnderTest .tryAcquireWindow(new ReceivedPingRequestEvent<Integer>( Integer.valueOf(i), new UpstreamMessageEvent( mockChannel, pingRequest, new InetSocketAddress(0)), pingRequest)); } final PingRequest pingRequest = new PingRequest(); final boolean windowAcquired = objectUnderTest .tryAcquireWindow(new ReceivedPingRequestEvent<Integer>(Integer .valueOf(windowStoreCapacity), new UpstreamMessageEvent(mockChannel, pingRequest, new InetSocketAddress(0)), pingRequest)); assertTrue( "tryAcquireWindow(...) failed although a window is still available", windowAcquired); } @Test public final void assertThatTryAcquireWindowFailsIfNoWindowIsAvailable() throws IllegalArgumentException, InterruptedException { final int windowStoreCapacity = 234; final IncomingWindowStore<Integer> objectUnderTest = new IncomingWindowStore<Integer>( windowStoreCapacity, 10); final Channel mockChannel = createNiceMock(Channel.class); replay(mockChannel); for (int i = 1; i <= windowStoreCapacity; i++) { final PingRequest pingRequest = new PingRequest(); objectUnderTest .tryAcquireWindow(new ReceivedPingRequestEvent<Integer>( Integer.valueOf(i), new UpstreamMessageEvent( mockChannel, pingRequest, new InetSocketAddress(0)), pingRequest)); } final PingRequest pingRequest = new PingRequest(); final boolean windowAcquired = objectUnderTest .tryAcquireWindow(new ReceivedPingRequestEvent<Integer>(Integer .valueOf(windowStoreCapacity + 1), new UpstreamMessageEvent(mockChannel, pingRequest, new InetSocketAddress(0)), pingRequest)); assertFalse( "tryAcquireWindow(...) succeeded although no window is available", windowAcquired); } @Test public final void assertThatTryAcquireWindowWaitsConfiguredTimespanForAWindowToBecomeAvailable() throws IllegalArgumentException, InterruptedException { final int windowStoreCapacity = 234; final int waitTimeMillis = 500; final IncomingWindowStore<Integer> objectUnderTest = new IncomingWindowStore<Integer>( windowStoreCapacity, waitTimeMillis); final Channel mockChannel = createNiceMock(Channel.class); replay(mockChannel); for (int i = 1; i <= windowStoreCapacity; i++) { final PingRequest pingRequest = new PingRequest(); objectUnderTest .tryAcquireWindow(new ReceivedPingRequestEvent<Integer>( Integer.valueOf(i), new UpstreamMessageEvent( mockChannel, pingRequest, new InetSocketAddress(0)), pingRequest)); } final PingRequest pingRequest = new PingRequest(); final long before = System.currentTimeMillis(); objectUnderTest.tryAcquireWindow(new ReceivedPingRequestEvent<Integer>( Integer.valueOf(windowStoreCapacity + 1), new UpstreamMessageEvent(mockChannel, pingRequest, new InetSocketAddress(0)), pingRequest)); final long after = System.currentTimeMillis(); assertTrue("tryAcquireWindow(...) did not wait for " + waitTimeMillis + " ms for a window to become available", (after - before) > (waitTimeMillis - 100)); } @Test public final void assertThatReleaseWindowFreesAWindow() throws IllegalArgumentException, InterruptedException { final Integer freedWindowId = Integer.valueOf(23); final int windowStoreCapacity = 234; final IncomingWindowStore<Integer> objectUnderTest = new IncomingWindowStore<Integer>( windowStoreCapacity, 10); final Channel mockChannel = createNiceMock(Channel.class); replay(mockChannel); for (int i = 1; i <= windowStoreCapacity; i++) { final PingRequest pingRequest = new PingRequest(); objectUnderTest .tryAcquireWindow(new ReceivedPingRequestEvent<Integer>( Integer.valueOf(i), new UpstreamMessageEvent( mockChannel, pingRequest, new InetSocketAddress(0)), pingRequest)); } objectUnderTest.releaseWindow(freedWindowId); final PingRequest pingRequest = new PingRequest(); final boolean windowAcquired = objectUnderTest .tryAcquireWindow(new ReceivedPingRequestEvent<Integer>( freedWindowId, new UpstreamMessageEvent(mockChannel, pingRequest, new InetSocketAddress(0)), pingRequest)); assertTrue("tryAcquireWindow(...) failed although the windowId " + freedWindowId + " used has just been released", windowAcquired); } @Test public final void assertThatShutdownReturnsPendingMessages() throws IllegalArgumentException, InterruptedException { final int windowStoreCapacity = 234; final IncomingWindowStore<Integer> objectUnderTest = new IncomingWindowStore<Integer>( windowStoreCapacity, 10); final Channel mockChannel = createNiceMock(Channel.class); replay(mockChannel); for (int i = 1; i <= windowStoreCapacity; i++) { final PingRequest pingRequest = new PingRequest(); objectUnderTest .tryAcquireWindow(new ReceivedPingRequestEvent<Integer>( Integer.valueOf(i), new UpstreamMessageEvent( mockChannel, pingRequest, new InetSocketAddress(0)), pingRequest)); } final Map<Integer, GsmPdu> pendingMessages = objectUnderTest.shutDown(); assertEquals( "shutDown() did not return the expected number of pending messages", windowStoreCapacity, pendingMessages.size()); } }