package vnet.sms.gateway.nettytest.embedded; import static org.easymock.EasyMock.createNiceMock; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Queue; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelEvent; 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 FilteredChannelEventQueueTest { @Test public final void assertThatAddFilterReturnsDoneFutureIfFilteredChannelEventQueueContainsAMatchingChannelEvent() { final MessageEvent matchingEvent = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); final FilteredChannelEventQueue<ChannelEvent> objectUnderTest = newObjectUnderTest(matchingEvent); final FilteringChannelEventFuture<ChannelEvent> channelEventFuture = objectUnderTest .addFilter(new Predicate<ChannelEvent>() { @Override public boolean apply(final ChannelEvent input) { return input == matchingEvent; } }); assertTrue( "addFilter(...) should have returned a done Future since the FilteredChannelEventQueue that Predicate has been " + "added to contains a matching ChannelEvent", channelEventFuture.isDone()); } private FilteredChannelEventQueue<ChannelEvent> newObjectUnderTest( final MessageEvent... initialEvents) { final Queue<ChannelEvent> channelEvents = new LinkedList<ChannelEvent>(); for (final MessageEvent event : initialEvents) { channelEvents.add(event); } final FilteredChannelEventQueue<ChannelEvent> objectUnderTest = new FilteredChannelEventQueue<ChannelEvent>( channelEvents); return objectUnderTest; } @Test public final void assertThatAddTimedFilterReturnsDoneFutureIfFilteredChannelEventQueueContainsAMatchingChannelEvent() { final MessageEvent matchingEvent = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); final FilteredChannelEventQueue<ChannelEvent> objectUnderTest = newObjectUnderTest(matchingEvent); final TimedFilteringChannelEventFuture<ChannelEvent> channelEventFuture = objectUnderTest .addTimedFilter(new Predicate<ChannelEvent>() { @Override public boolean apply(final ChannelEvent input) { return input == matchingEvent; } }); assertTrue( "addTimedFilter(...) should have returned a done Future since the FilteredChannelEventQueue that Predicate has been " + "added to contains a matching ChannelEvent", channelEventFuture.isDone()); } @Test public final void assertThatAddFilterReturnsIncompleteFutureIfFilteredChannelEventQueueDoesNOTContainAMatchingChannelEvent() { final FilteredChannelEventQueue<ChannelEvent> objectUnderTest = newObjectUnderTest(); final FilteringChannelEventFuture<ChannelEvent> channelEventFuture = objectUnderTest .addFilter(new Predicate<ChannelEvent>() { @Override public boolean apply(final ChannelEvent input) { return false; } }); assertFalse( "addFilter(...) should have returned an incomplete Future since the FilteredChannelEventQueue that Predicate has been " + "added to does NOT contain a matching ChannelEvent", channelEventFuture.isDone()); } @Test public final void assertThatAddTimedFilterReturnsIncompleteFutureIfFilteredChannelEventQueueDoesNOTContainAMatchingChannelEvent() { final FilteredChannelEventQueue<ChannelEvent> objectUnderTest = newObjectUnderTest(); final TimedFilteringChannelEventFuture<ChannelEvent> channelEventFuture = objectUnderTest .addTimedFilter(new Predicate<ChannelEvent>() { @Override public boolean apply(final ChannelEvent input) { return false; } }); assertFalse( "addTimedFilter(...) should have returned an incomplete Future since the FilteredChannelEventQueue that Predicate has been " + "added to does NOT contain a matching ChannelEvent", channelEventFuture.isDone()); } @Test public final void assertThatOnChannelEventAddsChannelEventToUnderlyingQueue() { final MessageEvent matchingEvent = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); final FilteredChannelEventQueue<ChannelEvent> objectUnderTest = newObjectUnderTest(); objectUnderTest.onEvent(matchingEvent); assertTrue( "onChannelEvent(matchingEvent) should have added supplied ChannelEvent to underlying Queue", objectUnderTest.contains(matchingEvent)); } @Test public final void assertThatOnChannelEventCompletesAMatchingFilteredChannelEventFuture() { final MessageEvent matchingEvent = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); final Predicate<ChannelEvent> matchingFilter = new Predicate<ChannelEvent>() { @Override public boolean apply(final ChannelEvent input) { return input == matchingEvent; } }; final FilteredChannelEventQueue<ChannelEvent> objectUnderTest = newObjectUnderTest(); final FilteringChannelEventFuture<ChannelEvent> channelEventFuture = objectUnderTest .addFilter(matchingFilter); objectUnderTest.onEvent(matchingEvent); assertTrue( "onChannelEvent(matchingEvent) should have completed a previously added FilteringChannelEventFuture that matches the supplied ChannelEvent", channelEventFuture.isDone()); } @Test public final void assertThatOnExceptionEventCompletesAllRegisteredFilteringChannelEventFutures() { final int noFilters = 10; final List<FilteringChannelEventFuture<ChannelEvent>> filteringFutures = new ArrayList<FilteringChannelEventFuture<ChannelEvent>>( noFilters); final FilteredChannelEventQueue<ChannelEvent> objectUnderTest = newObjectUnderTest(); for (int i = 0; i < noFilters; i++) { final FilteringChannelEventFuture<ChannelEvent> channelEventFuture = objectUnderTest .addFilter(new Predicate<ChannelEvent>() { @Override public boolean apply(final ChannelEvent input) { return false; } }); filteringFutures.add(channelEventFuture); } final Exception error = new RuntimeException(); final ExceptionEvent exceptionEvent = new DefaultExceptionEvent( createNiceMock(Channel.class), error); objectUnderTest.onExceptionEvent(exceptionEvent); for (final FilteringChannelEventFuture<ChannelEvent> future : filteringFutures) { assertTrue( "onExceptionEvent(exceptionEvent) should have completed all registered FilteringChannelEventFutures", future.isDone()); } } @Test(expected = UnsupportedOperationException.class) public final void assertThatAddThrowsUnsupportedOperationException() { final FilteredChannelEventQueue<ChannelEvent> objectUnderTest = newObjectUnderTest(); final UpstreamMessageEvent e = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); objectUnderTest.add(e); } @Test(expected = UnsupportedOperationException.class) public final void assertThatAddAllThrowsUnsupportedOperationException() { final FilteredChannelEventQueue<ChannelEvent> objectUnderTest = newObjectUnderTest(); final UpstreamMessageEvent e = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); objectUnderTest.addAll(Collections.singleton(e)); } @Test(expected = UnsupportedOperationException.class) public final void assertThatClearThrowsUnsupportedOperationException() { final FilteredChannelEventQueue<ChannelEvent> objectUnderTest = newObjectUnderTest(); objectUnderTest.clear(); } @Test(expected = UnsupportedOperationException.class) public final void assertThatOfferThrowsUnsupportedOperationException() { final FilteredChannelEventQueue<ChannelEvent> objectUnderTest = newObjectUnderTest(); final UpstreamMessageEvent e = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); objectUnderTest.offer(e); } @Test(expected = UnsupportedOperationException.class) public final void assertThatRemoveThrowsUnsupportedOperationException() { final FilteredChannelEventQueue<ChannelEvent> objectUnderTest = newObjectUnderTest(); objectUnderTest.remove(); } @Test public final void assertThatRemoveObjectDoesRemoveSuppliedChannelEventFromQueue() { final FilteredChannelEventQueue<ChannelEvent> objectUnderTest = newObjectUnderTest(); final UpstreamMessageEvent e = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); objectUnderTest.remove(e); assertFalse( "remove(e) should have removed e from FilteredChannelEventQueue", objectUnderTest.contains(e)); } @Test(expected = UnsupportedOperationException.class) public final void assertThatRemoveAllThrowsUnsupportedOperationException() { final FilteredChannelEventQueue<ChannelEvent> objectUnderTest = newObjectUnderTest(); final UpstreamMessageEvent e = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); objectUnderTest.removeAll(Collections.singleton(e)); } @Test(expected = UnsupportedOperationException.class) public final void assertThatRetainAllThrowsUnsupportedOperationException() { final FilteredChannelEventQueue<ChannelEvent> objectUnderTest = newObjectUnderTest(); final UpstreamMessageEvent e = new UpstreamMessageEvent( createNiceMock(Channel.class), new Object(), null); objectUnderTest.retainAll(Collections.singleton(e)); } }