package vnet.sms.gateway.nettytest.embedded;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import org.jboss.netty.channel.ChannelDownstreamHandler;
import org.jboss.netty.channel.ChannelEvent;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelUpstreamHandler;
import org.jboss.netty.channel.DefaultExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelDownstreamHandler;
import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
import org.jboss.netty.handler.timeout.DefaultIdleStateEvent;
import org.jboss.netty.handler.timeout.IdleState;
import org.jboss.netty.handler.timeout.IdleStateEvent;
import org.jboss.netty.logging.InternalLoggerFactory;
import org.jboss.netty.logging.Slf4JLoggerFactory;
import org.junit.Test;
import com.google.common.base.Predicate;
public class DefaultChannelPipelineEmbedderTest {
static {
InternalLoggerFactory.setDefaultFactory(new Slf4JLoggerFactory());
}
@Test
public final void assertThatReceivePropagatesReceivedMessageAsMessageEventToReceivedMessageEventsQueue()
throws Throwable {
final Object message = "assertThatReceivePropagatesReceivedMessageAsMessageEventToOutputQueue";
final ChannelUpstreamHandler passThroughHandler = new SimpleChannelUpstreamHandler();
final DefaultChannelPipelineEmbedder objectUnderTest = new DefaultChannelPipelineEmbedder(
passThroughHandler);
objectUnderTest.connectChannel();
objectUnderTest.receive(message);
final MessageEvent result = objectUnderTest.upstreamMessageEvents()
.nextMessageEvent();
assertNotNull("receive(" + message
+ ") did not propagate received message event to output queue",
result);
assertEquals("receive(" + message
+ ") propagated the wrong message to output queue", message,
result.getMessage());
}
@Test
public final void assertThatNextReceivedMessageEventConformsToChannelEventFilterPassedIn()
throws Throwable {
final Object firstMessage = "firstReceivedMessage";
final Object secondMessage = "secondReceivedMessage";
final ChannelUpstreamHandler passThroughHandler = new SimpleChannelUpstreamHandler();
final DefaultChannelPipelineEmbedder objectUnderTest = new DefaultChannelPipelineEmbedder(
passThroughHandler);
objectUnderTest.connectChannel();
objectUnderTest.receive(firstMessage);
objectUnderTest.receive(secondMessage);
final Predicate<MessageEvent> matchSecondMessage = MessageEventFilters
.payloadEquals(secondMessage);
final MessageEvent result = objectUnderTest.upstreamMessageEvents()
.nextMatchingMessageEvent(matchSecondMessage);
assertNotNull("nextReceivedMessageEvent(" + matchSecondMessage
+ ") returned null instead of expected second message", result);
assertEquals(
"nextReceivedMessageEvent("
+ matchSecondMessage
+ ") returned message event that does not match the filter passed in",
secondMessage, result.getMessage());
}
@Test(expected = SecurityException.class)
public final void assertThatReceiveRethrowsExceptionThrownByChannelHandler()
throws Throwable {
final Object message = "assertThatReceiveRethrowsExceptionThrownByChannelHandler";
final ChannelUpstreamHandler exceptionThrowingHandler = new SimpleChannelUpstreamHandler() {
@Override
public void messageReceived(final ChannelHandlerContext ctx,
final MessageEvent e) throws Exception {
ctx.sendUpstream(new DefaultExceptionEvent(
ctx.getChannel(),
new SecurityException(
"assertThatReceiveRethrowsExceptionThrownByChannelHandler")));
}
};
final DefaultChannelPipelineEmbedder objectUnderTest = new DefaultChannelPipelineEmbedder(
exceptionThrowingHandler);
objectUnderTest.connectChannel();
objectUnderTest.receive(message);
}
@Test
public final void assertThatReceivePropagatesNonMessageEventsCreatedInternallyToUpstreamChannelEventQueue()
throws Throwable {
final Object message = "assertThatReceivePropagatesNonMessageEventsCreatedInternallyToChannelEventQueue";
final ChannelUpstreamHandler channelEventGeneratingHandler = new SimpleChannelUpstreamHandler() {
@Override
public void messageReceived(final ChannelHandlerContext ctx,
final MessageEvent e) throws Exception {
ctx.sendUpstream(new DefaultIdleStateEvent(ctx.getChannel(),
IdleState.ALL_IDLE, System.currentTimeMillis()));
}
};
final DefaultChannelPipelineEmbedder objectUnderTest = new DefaultChannelPipelineEmbedder(
channelEventGeneratingHandler);
objectUnderTest.connectChannel();
objectUnderTest.receive(message);
final ChannelEvent result = objectUnderTest.upstreamChannelEvents()
.nextMatchingChannelEvent(
ChannelEventFilters.ofType(IdleStateEvent.class));
assertNotNull(
"receive("
+ message
+ ") did not propagate internally generated channel event to upstream channel event queue",
result);
assertEquals("receive(" + message
+ ") propagated the wrong message to output queue",
DefaultIdleStateEvent.class, result.getClass());
}
@Test
public final void assertThatReceivePropagatesAllNonMessageEventsToUpstreamChannelEventQueue()
throws Throwable {
final Object message = "assertThatReceivePropagatesAllNonMessageEventsToUpstreamChannelEventQueue";
final ChannelUpstreamHandler channelEventGeneratingHandler = new SimpleChannelUpstreamHandler() {
@Override
public void messageReceived(final ChannelHandlerContext ctx,
final MessageEvent e) throws Exception {
ctx.sendUpstream(new DefaultIdleStateEvent(ctx.getChannel(),
IdleState.ALL_IDLE, System.currentTimeMillis()));
}
};
final DefaultChannelPipelineEmbedder objectUnderTest = new DefaultChannelPipelineEmbedder(
channelEventGeneratingHandler);
objectUnderTest.connectChannel();
objectUnderTest.receive(message);
final int numberOfPropagatedChannelEvents = objectUnderTest
.upstreamChannelEvents().allChannelEvents().length;
assertEquals(
"receive("
+ message
+ ") should have propagated OPEN, BOUND, CONNECTED and IdleStateEvent to upstream channel event queue",
4, numberOfPropagatedChannelEvents);
}
@Test
public final void assertThatSendPropagatesSentMessageAsMessageEventToSentMessageEventsQueue()
throws Throwable {
final Object message = "assertThatSendPropagatesSentMessageAsMessageEventToSentMessageEventsQueue";
final ChannelDownstreamHandler passThroughHandler = new SimpleChannelDownstreamHandler();
final DefaultChannelPipelineEmbedder objectUnderTest = new DefaultChannelPipelineEmbedder(
passThroughHandler);
objectUnderTest.connectChannel();
objectUnderTest.send(message);
final MessageEvent result = objectUnderTest.downstreamMessageEvents()
.nextMessageEvent();
assertNotNull("send(" + message
+ ") did not propagate sent message event to output queue",
result);
assertEquals("send(" + message
+ ") propagated the wrong message to output queue", message,
result.getMessage());
}
@Test
public final void assertThatNextSentMessageEventConformsToChannelEventFilterPassedIn()
throws Throwable {
final Object firstMessage = "firstSentMessage";
final Object secondMessage = "secondSentMessage";
final ChannelDownstreamHandler passThroughHandler = new SimpleChannelDownstreamHandler();
final DefaultChannelPipelineEmbedder objectUnderTest = new DefaultChannelPipelineEmbedder(
passThroughHandler);
objectUnderTest.connectChannel();
objectUnderTest.send(firstMessage);
objectUnderTest.send(secondMessage);
final Predicate<MessageEvent> matchSecondMessage = MessageEventFilters
.payloadEquals(secondMessage);
final MessageEvent result = objectUnderTest.downstreamMessageEvents()
.nextMatchingMessageEvent(matchSecondMessage);
assertNotNull("nextSentMessageEvent(" + matchSecondMessage
+ ") returned null instead of expected second message", result);
assertEquals(
"nextSentMessageEvent("
+ matchSecondMessage
+ ") returned message event that does not match the filter passed in",
secondMessage, result.getMessage());
}
@Test(expected = SecurityException.class)
public final void assertThatSendRethrowsExceptionThrownByChannelHandler()
throws Throwable {
final Object message = "assertThatSendRethrowsExceptionThrownByChannelHandler";
final ChannelDownstreamHandler exceptionThrowingHandler = new SimpleChannelDownstreamHandler() {
@Override
public void writeRequested(final ChannelHandlerContext ctx,
final MessageEvent e) throws Exception {
ctx.sendDownstream(new DefaultExceptionEvent(
ctx.getChannel(),
new SecurityException(
"assertThatSendRethrowsExceptionThrownByChannelHandler")));
}
};
final DefaultChannelPipelineEmbedder objectUnderTest = new DefaultChannelPipelineEmbedder(
exceptionThrowingHandler);
objectUnderTest.connectChannel();
objectUnderTest.send(message);
}
@Test
public final void assertThatSendPropagatesNonMessageEventsCreatedInternallyToUpstreamChannelEventQueue()
throws Throwable {
final Object message = "assertThatSendPropagatesNonMessageEventsCreatedInternallyToChannelEventQueue";
final ChannelDownstreamHandler channelEventGeneratingHandler = new SimpleChannelDownstreamHandler() {
@Override
public void writeRequested(final ChannelHandlerContext ctx,
final MessageEvent e) throws Exception {
ctx.sendDownstream(new DefaultIdleStateEvent(ctx.getChannel(),
IdleState.ALL_IDLE, System.currentTimeMillis()));
}
};
final DefaultChannelPipelineEmbedder objectUnderTest = new DefaultChannelPipelineEmbedder(
channelEventGeneratingHandler);
objectUnderTest.connectChannel();
objectUnderTest.send(message);
final ChannelEvent result = objectUnderTest.downstreamChannelEvents()
.nextMatchingChannelEvent(
ChannelEventFilters.ofType(IdleStateEvent.class));
assertNotNull(
"send("
+ message
+ ") did not propagate internally generated channel event to downstream channel event queue",
result);
assertEquals(
"send("
+ message
+ ") propagated the wrong message to downstream channel event queue",
DefaultIdleStateEvent.class, result.getClass());
}
}