package vnet.sms.gateway.nettytest.embedded; import static org.easymock.EasyMock.createNiceMock; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.DefaultExceptionEvent; import org.jboss.netty.channel.ExceptionEvent; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.UpstreamMessageEvent; import org.junit.Test; import com.google.common.base.Predicate; public class DefaultMessageEventsTest { @Test public final void assertThatOnChannelEventStoresSuppliedMessageEventForLaterRetrieval() { final MessageEvent suppliedMessageEvent = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); final DefaultMessageEvents objectUnderTest = new DefaultMessageEvents(); objectUnderTest.onEvent(suppliedMessageEvent); final MessageEvent storedMessageEvent = objectUnderTest .nextMessageEvent(); assertEquals( "onChannelEvent(...) should have stored supplied channel event for later retrieval", suppliedMessageEvent, storedMessageEvent); } @Test public final void assertThatOnExceptionEventFailsPreviouslyRegisteredFilteringMessageEventFuture() { final ExceptionEvent e = new DefaultExceptionEvent( createNiceMock(Channel.class), new RuntimeException( "assertThatOnExceptionEventFailsPreviouslyRegisteredFilteringMessageEventFuture")); final DefaultMessageEvents objectUnderTest = new DefaultMessageEvents(); final Future<? extends MessageEvent> future = objectUnderTest .waitForMatchingMessageEvent(MessageEventFilters .ofType(MessageEvent.class)); objectUnderTest.onExceptionEvent(e); assertTrue( "onExceptionEvent(...) should have failed any previously registered Futures that have not been completed yet", future.isDone()); } @Test public final void assertThatIsEmptyInitiallyReturnsTrue() { final DefaultMessageEvents objectUnderTest = new DefaultMessageEvents(); assertTrue( "isEmpty() should return true immediately after creating new DefaultMessageEvents instance", objectUnderTest.isEmpty()); } @Test public final void assertThatIteratorContainsPreviouslyAddedMessageEvent() { final MessageEvent suppliedMessageEvent = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); final DefaultMessageEvents objectUnderTest = new DefaultMessageEvents(); objectUnderTest.onEvent(suppliedMessageEvent); final MessageEvent retrievedMessageEvent = objectUnderTest.iterator() .next(); assertEquals( "Iterator returned from iterator() should contain previously added MessageEvent", suppliedMessageEvent, retrievedMessageEvent); } @Test public final void assertThatNextMessageEventReturnsFirstMessageEventInQueue() { final MessageEvent firstMessageEvent = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); final MessageEvent secondMessageEvent = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); final DefaultMessageEvents objectUnderTest = new DefaultMessageEvents(); objectUnderTest.onEvent(firstMessageEvent); objectUnderTest.onEvent(secondMessageEvent); final MessageEvent nextMessageEvent = objectUnderTest .nextMessageEvent(); assertSame( "nextMessageEvent() should have returned the first MessageEvent currently stored", firstMessageEvent, nextMessageEvent); } @Test public final void assertThatCallingNextMessageEventTwiceReturnsSecondMessageEventInQueue() { final MessageEvent firstMessageEvent = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); final MessageEvent secondMessageEvent = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); final DefaultMessageEvents objectUnderTest = new DefaultMessageEvents(); objectUnderTest.onEvent(firstMessageEvent); objectUnderTest.onEvent(secondMessageEvent); objectUnderTest.nextMessageEvent(); // Not interested in return value final MessageEvent nextMessageEvent = objectUnderTest .nextMessageEvent(); assertSame( "Calling nextMessageEvent() for the second time should have returned the second MessageEvent in queue", secondMessageEvent, nextMessageEvent); } @Test public final void assertThatNextMatchingMessageEventReturnsTheFirstMatchingMessageEvent() { final MessageEvent firstMessageEvent = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); final MessageEvent secondMessageEvent = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); final Predicate<MessageEvent> matchSecondEvent = new Predicate<MessageEvent>() { @Override public boolean apply(final MessageEvent input) { return input == secondMessageEvent; } }; final DefaultMessageEvents objectUnderTest = new DefaultMessageEvents(); objectUnderTest.onEvent(firstMessageEvent); objectUnderTest.onEvent(secondMessageEvent); final MessageEvent matchingMessageEvent = objectUnderTest .nextMatchingMessageEvent(matchSecondEvent); assertSame( "nextMatchingMessageEvent(...) should have returned the first matching MessageEvent", secondMessageEvent, matchingMessageEvent); } @Test public final void assertThatNextMatchingMessageEventRemovesMatchFromQueue() { final MessageEvent firstMessageEvent = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); final MessageEvent secondMessageEvent = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); final Predicate<MessageEvent> matchSecondEvent = new Predicate<MessageEvent>() { @Override public boolean apply(final MessageEvent input) { return input == secondMessageEvent; } }; final DefaultMessageEvents objectUnderTest = new DefaultMessageEvents(); objectUnderTest.onEvent(firstMessageEvent); objectUnderTest.onEvent(secondMessageEvent); objectUnderTest.nextMatchingMessageEvent(matchSecondEvent); final MessageEvent secondMatchingMessageEvent = objectUnderTest .nextMatchingMessageEvent(matchSecondEvent); assertNull( "nextMatchingMessageEvent(...) should have removed the matching MessageEvent from queue", secondMatchingMessageEvent); } @Test public final void assertThatAllMessageEventsReturnsAllStoredMessageEventsInTheOrderTheyArrived() { final MessageEvent firstMessageEvent = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); final MessageEvent secondMessageEvent = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); final DefaultMessageEvents objectUnderTest = new DefaultMessageEvents(); objectUnderTest.onEvent(firstMessageEvent); objectUnderTest.onEvent(secondMessageEvent); final MessageEvent[] allMessageEvents = objectUnderTest .allMessageEvents(); assertSame( "Array returned from allMessageEvents() should contain MessageEvent first added to queue as its first element", firstMessageEvent, allMessageEvents[0]); assertSame( "Array returned from allMessageEvents() should contain MessageEvent added to queue after first element as its second element", secondMessageEvent, allMessageEvents[1]); } @Test public final void assertThatWaitForMatchingMessageEventReturnsFirstMatchingMessageEventFuture() throws InterruptedException, ExecutionException { final MessageEvent firstMessageEvent = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); final MessageEvent secondMessageEvent = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); final Predicate<MessageEvent> matchSecondEvent = new Predicate<MessageEvent>() { @Override public boolean apply(final MessageEvent input) { return input == secondMessageEvent; } }; final DefaultMessageEvents objectUnderTest = new DefaultMessageEvents(); final Future<MessageEvent> matchingMessageEvent = objectUnderTest .waitForMatchingMessageEvent(matchSecondEvent); objectUnderTest.onEvent(firstMessageEvent); objectUnderTest.onEvent(secondMessageEvent); assertSame( "waitForMatchingMessageEvent(...) should have returned the first matching MessageEvent, wrapped in a Future", secondMessageEvent, matchingMessageEvent.get()); } @Test public final void assertThatTimedWaitForMatchingMessageEventReturnsFirstMatchingMessageEventFuture() throws InterruptedException, ExecutionException { final MessageEvent firstMessageEvent = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); final MessageEvent secondMessageEvent = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); final Predicate<MessageEvent> matchSecondEvent = new Predicate<MessageEvent>() { @Override public boolean apply(final MessageEvent input) { return input == secondMessageEvent; } }; final DefaultMessageEvents objectUnderTest = new DefaultMessageEvents(); final TimedFuture<MessageEvent> matchingMessageEvent = objectUnderTest .timedWaitForMatchingMessageEvent(matchSecondEvent); objectUnderTest.onEvent(firstMessageEvent); objectUnderTest.onEvent(secondMessageEvent); assertSame( "waitForMatchingMessageEvent(...) should have returned the first matching MessageEvent, wrapped in a Future", secondMessageEvent, matchingMessageEvent.get().get()); } }