package vnet.sms.gateway.transports.serialization.outgoing;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.net.InetSocketAddress;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.DownstreamMessageEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelDownstreamHandler;
import org.jboss.netty.channel.UpstreamMessageEvent;
import org.junit.Test;
import vnet.sms.common.messages.LoginRequest;
import vnet.sms.common.messages.LoginResponse;
import vnet.sms.common.messages.Msisdn;
import vnet.sms.common.messages.PingRequest;
import vnet.sms.common.messages.Sms;
import vnet.sms.common.wme.WindowedMessageEvent;
import vnet.sms.common.wme.acknowledge.SendLoginRequestAckEvent;
import vnet.sms.common.wme.acknowledge.SendLoginRequestNackEvent;
import vnet.sms.common.wme.receive.ReceivedLoginRequestEvent;
import vnet.sms.common.wme.send.SendPingRequestEvent;
import vnet.sms.common.wme.send.SendSmsContainer;
import vnet.sms.common.wme.send.SendSmsEvent;
import vnet.sms.gateway.nettytest.embedded.ChannelPipelineEmbedder;
import vnet.sms.gateway.nettytest.embedded.DefaultChannelPipelineEmbedder;
import vnet.sms.gateway.transports.serialization.ReferenceableMessageContainer;
public class SerializationTransportProtocolAdaptingDownstreamChannelHandlerTest {
private final SerializationTransportProtocolAdaptingDownstreamChannelHandler objectUnderTest = new SerializationTransportProtocolAdaptingDownstreamChannelHandler();
@Test
public final void assertThatTransportProtocolAdapterCorrectlyConvertsPingRequestToPdu()
throws Throwable {
final ChannelPipelineEmbedder embeddedPipeline = new DefaultChannelPipelineEmbedder(
this.objectUnderTest,
new MessageEventWrappingDownstreamChannelHandler());
embeddedPipeline.connectChannel();
embeddedPipeline.send(new PingRequest());
final MessageEvent convertedMessageEvent = embeddedPipeline
.downstreamMessageEvents().nextMessageEvent();
assertNotNull(
"OutgoingMessagesMonitoringChannelHandler converted PingRequest to null output",
convertedMessageEvent);
assertEquals(
"OutgoingMessagesMonitoringChannelHandler did not wrap converted PingRequest in DownstreamMessageEvent",
DownstreamMessageEvent.class, convertedMessageEvent.getClass());
assertEquals(
"OutgoingMessagesMonitoringChannelHandler did not convert PingRequest to ReferenceableMessageContainer",
ReferenceableMessageContainer.class, convertedMessageEvent
.getMessage().getClass());
assertEquals(
"OutgoingMessagesMonitoringChannelHandler did not put converted PingRequest in ReferenceableMessageContainer",
PingRequest.class,
ReferenceableMessageContainer.class
.cast(convertedMessageEvent.getMessage()).getMessage()
.getClass());
}
private static class MessageEventWrappingDownstreamChannelHandler extends
SimpleChannelDownstreamHandler {
MessageEventWrappingDownstreamChannelHandler() {
}
@Override
public void writeRequested(final ChannelHandlerContext ctx,
final MessageEvent e) throws Exception {
final WindowedMessageEvent<Integer, ?> result;
final Object message = e.getMessage();
if (message instanceof PingRequest) {
result = new SendPingRequestEvent<Integer>(Integer.valueOf(1),
e.getChannel(), (PingRequest) message);
} else {
throw new IllegalArgumentException("Unsupported message type: "
+ message);
}
ctx.sendDownstream(result);
}
}
@Test
public final void assertThatTransportProtocolAdapterCorrectlyConvertsAcceptedLoginRequestToPdu()
throws Throwable {
final ChannelPipelineEmbedder embeddedPipeline = new DefaultChannelPipelineEmbedder(
this.objectUnderTest,
new MessageEventWrappingDownstreamChannelHandler());
embeddedPipeline.connectChannel();
final LoginRequest acceptedLoginRequest = new LoginRequest(
"assertThatTransportProtocolAdapterCorrectlyConvertsAcceptedLoginRequestToPdu",
"secret");
final ReferenceableMessageContainer convertedMessageContainer = this.objectUnderTest
.convertLoginRequestAcceptedEventToPdu(SendLoginRequestAckEvent
.accept(new ReceivedLoginRequestEvent<Integer>(1,
new UpstreamMessageEvent(embeddedPipeline
.getPipeline().getChannel(),
acceptedLoginRequest,
new InetSocketAddress(3)),
acceptedLoginRequest)));
assertNotNull(
"OutgoingMessagesMonitoringChannelHandler converted accepted LoginRequest to null output",
convertedMessageContainer);
assertEquals(
"OutgoingMessagesMonitoringChannelHandler did not convert accepted LoginRequest to LoginResponse",
LoginResponse.class, convertedMessageContainer.getMessage()
.getClass());
final LoginResponse loginResponse = convertedMessageContainer
.getMessage(LoginResponse.class);
assertTrue(
"OutgoingMessagesMonitoringChannelHandler did not convert accepted LoginRequest to SUCCESSFUL LoginResponse",
loginResponse.loginSucceeded());
}
@Test
public final void assertThatTransportProtocolAdapterCorrectlyConvertsRejectedLoginRequestToPdu()
throws Throwable {
final ChannelPipelineEmbedder embeddedPipeline = new DefaultChannelPipelineEmbedder(
this.objectUnderTest,
new MessageEventWrappingDownstreamChannelHandler());
embeddedPipeline.connectChannel();
final LoginRequest rejectedLoginRequest = new LoginRequest(
"assertThatTransportProtocolAdapterCorrectlyConvertsRejectedLoginRequestToPdu",
"secret");
final ReferenceableMessageContainer convertedMessageContainer = this.objectUnderTest
.convertLoginRequestRejectedEventToPdu(SendLoginRequestNackEvent
.reject(new ReceivedLoginRequestEvent<Integer>(1,
new UpstreamMessageEvent(embeddedPipeline
.getPipeline().getChannel(),
rejectedLoginRequest,
new InetSocketAddress(3)),
rejectedLoginRequest)));
assertNotNull(
"OutgoingMessagesMonitoringChannelHandler converted rejected LoginRequest to null output",
convertedMessageContainer);
assertEquals(
"OutgoingMessagesMonitoringChannelHandler did not convert rejected LoginRequest to LoginResponse",
LoginResponse.class, convertedMessageContainer.getMessage()
.getClass());
final LoginResponse loginResponse = convertedMessageContainer
.getMessage(LoginResponse.class);
assertFalse(
"OutgoingMessagesMonitoringChannelHandler did not convert rejected LoginRequest to FAILED LoginResponse",
loginResponse.loginSucceeded());
}
@Test
public final void assertThatTransportProtocolAdapterCorrectlyConvertsSendSmsEventToPdu()
throws Throwable {
final ChannelPipelineEmbedder embeddedPipeline = new DefaultChannelPipelineEmbedder(
this.objectUnderTest,
new MessageEventWrappingDownstreamChannelHandler());
embeddedPipeline.connectChannel();
final Sms moSms = new Sms(new Msisdn("01686754432"), new Msisdn(
"01686754432"),
"assertThatTransportProtocolAdapterCorrectlyConvertsSendSmsEventToPdu");
final ReferenceableMessageContainer convertedMessageContainer = this.objectUnderTest
.convertSendSmsEventToPdu(SendSmsEvent
.convert(new DownstreamMessageEvent(embeddedPipeline
.getChannel(), Channels.future(embeddedPipeline
.getChannel()), new SendSmsContainer(moSms),
null)));
assertNotNull(
"OutgoingMessagesMonitoringChannelHandler converted SendSmsEvent to null output",
convertedMessageContainer);
assertEquals(
"OutgoingMessagesMonitoringChannelHandler did not convert SendSmsEvent to Sms",
Sms.class, convertedMessageContainer.getMessage().getClass());
}
}