package vnet.sms.gateway.nettysupport.publish.outgoing;
import static org.junit.Assert.assertEquals;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicReference;
import org.jboss.netty.channel.group.ChannelGroup;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import vnet.sms.common.messages.GsmPdu;
import vnet.sms.common.messages.Msisdn;
import vnet.sms.common.messages.Sms;
import vnet.sms.common.wme.acknowledge.MessageAcknowledgementContainer;
import vnet.sms.common.wme.acknowledge.SendSmsAckContainer;
import vnet.sms.common.wme.acknowledge.SendSmsNackContainer;
import vnet.sms.common.wme.send.SendSmsContainer;
import vnet.sms.gateway.nettysupport.test.ReceivedMessagesListener;
import vnet.sms.gateway.nettysupport.test.ReceivedMessagesPublishingServer;
import vnet.sms.gateway.nettysupport.test.TestClient;
public class DefaultOutgoingMessagesSenderIT {
private final ReceivedMessagesPublishingServer testServer = new ReceivedMessagesPublishingServer();
private final TestClient testClient = new TestClient();
@Before
public void startTestServer() throws Exception {
this.testServer.start();
}
@Before
public void startTestClient() throws Exception {
this.testClient.start();
}
@After
public void stopTestClient() throws Exception {
this.testClient.stop();
}
@After
public void stopTestServer() throws Exception {
this.testServer.stop();
}
@Test(timeout = 2000)
public final void assertThatSendSmsDoesSendSmsToConnectedServer()
throws Exception {
final Sms sms = new Sms(new Msisdn("01686754432"), new Msisdn(
"01686754432"), "assertThatSendSmsDoesSendSmsToConnectedServer");
final SendSmsContainer smsContainer = new SendSmsContainer(sms);
final AtomicReference<Object> receivedMessage = new AtomicReference<Object>();
final CountDownLatch messageReceived = new CountDownLatch(1);
final ReceivedMessagesListener listener = new ReceivedMessagesListener() {
@Override
public void messageReceived(final Object message) {
receivedMessage.set(message);
messageReceived.countDown();
}
};
this.testServer.addListener(listener);
final ChannelGroup connectedChannels = this.testClient.connect(10,
this.testServer.getPort());
final DefaultOutgoingMessagesSender<String> objectUnderTest = new DefaultOutgoingMessagesSender<String>(
connectedChannels);
objectUnderTest.sendSms(smsContainer);
messageReceived.await();
assertEquals("sendSms(" + smsContainer
+ ") did not send expected sms container", smsContainer,
receivedMessage.get());
}
@Test(timeout = 2000, expected = IllegalStateException.class)
public final void assertThatSendSmsThrowsIllegalStateExceptionIfNoChannelIsConnected()
throws Exception {
final Sms sms = new Sms(new Msisdn("01686754432"), new Msisdn(
"01686754432"),
"assertThatSendSmsThrowsIllegalStateExceptionIfNoChannelIsConnected");
final SendSmsContainer smsContainer = new SendSmsContainer(sms);
final ChannelGroup connectedChannels = this.testClient.connect(0,
this.testServer.getPort());
final DefaultOutgoingMessagesSender<String> objectUnderTest = new DefaultOutgoingMessagesSender<String>(
connectedChannels);
objectUnderTest.sendSms(smsContainer);
}
@Test(timeout = 2000, expected = IllegalStateException.class)
public final void assertThatSendSmsCallsListenerIfNoChannelIsConnected()
throws Exception {
final Sms sms = new Sms(new Msisdn("01686754432"), new Msisdn(
"01686754432"),
"assertThatSendSmsCallsListenerIfNoChannelIsConnected");
final SendSmsContainer smsContainer = new SendSmsContainer(sms);
final CountDownLatch listenerCalled = new CountDownLatch(1);
final OutgoingMessagesSender.Listener<String> listener = new OutgoingMessagesSender.Listener<String>() {
@Override
public void sendSmsFailed(final SendSmsContainer failedSms,
final Throwable error) {
listenerCalled.countDown();
}
@Override
public void acknowldgeReceivedSmsFailed(
final MessageAcknowledgementContainer<String, ? extends GsmPdu> acknowledgement,
final Throwable error) {
// Noop
}
};
final ChannelGroup connectedChannels = this.testClient.connect(0,
this.testServer.getPort());
final DefaultOutgoingMessagesSender<String> objectUnderTest = new DefaultOutgoingMessagesSender<String>(
connectedChannels);
objectUnderTest.addListener(listener);
objectUnderTest.sendSms(smsContainer);
listenerCalled.await();
}
@Test(timeout = 2000)
public final void assertThatAckReceivedSmsDoesSendAckToConnectedServer()
throws Exception {
final Sms sms = new Sms(new Msisdn("01686754432"), new Msisdn(
"01686754432"),
"assertThatAckReceivedSmsDoesSendAckToConnectedServer");
final AtomicReference<Object> receivedMessage = new AtomicReference<Object>();
final CountDownLatch messageReceived = new CountDownLatch(1);
final ReceivedMessagesListener listener = new ReceivedMessagesListener() {
@Override
public void messageReceived(final Object message) {
receivedMessage.set(message);
messageReceived.countDown();
}
};
this.testServer.addListener(listener);
final ChannelGroup connectedChannels = this.testClient.connect(10,
this.testServer.getPort());
final SendSmsAckContainer<String> ackContainer = new SendSmsAckContainer<String>(
"1", connectedChannels.iterator().next().getId(), sms);
final DefaultOutgoingMessagesSender<String> objectUnderTest = new DefaultOutgoingMessagesSender<String>(
connectedChannels);
objectUnderTest.ackReceivedSms(ackContainer);
messageReceived.await();
assertEquals("ackReceivedSms(" + ackContainer
+ ") did not send expected ack container", ackContainer,
receivedMessage.get());
}
@Test(timeout = 2000, expected = IllegalStateException.class)
public final void assertThatAckReceivedmsThrowsIllegalStateExceptionIfReceivingChannelIsNotConnectedAnymore()
throws Exception {
final Sms sms = new Sms(
new Msisdn("01686754432"),
new Msisdn("01686754432"),
"assertThatAckReceivedmsThrowsIllegalStateExceptionIfReceivingChannelIsNotConnectedAnymore");
final SendSmsAckContainer<String> ackContainer = new SendSmsAckContainer<String>(
"1", -1, sms);
final ChannelGroup connectedChannels = this.testClient.connect(0,
this.testServer.getPort());
final DefaultOutgoingMessagesSender<String> objectUnderTest = new DefaultOutgoingMessagesSender<String>(
connectedChannels);
objectUnderTest.ackReceivedSms(ackContainer);
}
@Test(timeout = 2000, expected = IllegalStateException.class)
public final void assertThatAckReceivedSmsCallsListenerIfReceivingChannelIsNotConnectedAnymore()
throws Exception {
final Sms sms = new Sms(new Msisdn("01686754432"), new Msisdn(
"01686754432"),
"assertThatAckReceivedSmsCallsListenerIfReceivingChannelIsNotConnectedAnymore");
final SendSmsAckContainer<String> ackContainer = new SendSmsAckContainer<String>(
"1", -1, sms);
final CountDownLatch listenerCalled = new CountDownLatch(1);
final OutgoingMessagesSender.Listener<String> listener = new OutgoingMessagesSender.Listener<String>() {
@Override
public void sendSmsFailed(final SendSmsContainer failedSms,
final Throwable error) {
// Noop
}
@Override
public void acknowldgeReceivedSmsFailed(
final MessageAcknowledgementContainer<String, ? extends GsmPdu> acknowledgement,
final Throwable error) {
listenerCalled.countDown();
}
};
final ChannelGroup connectedChannels = this.testClient.connect(0,
this.testServer.getPort());
final DefaultOutgoingMessagesSender<String> objectUnderTest = new DefaultOutgoingMessagesSender<String>(
connectedChannels);
objectUnderTest.addListener(listener);
objectUnderTest.ackReceivedSms(ackContainer);
listenerCalled.await();
}
@Test(timeout = 2000)
public final void assertThatNackReceivedSmsDoesSendNackToConnectedServer()
throws Exception {
final Sms sms = new Sms(new Msisdn("01686754432"), new Msisdn(
"01686754432"),
"assertThatNackReceivedSmsDoesSendNackToConnectedServer");
final AtomicReference<Object> receivedMessage = new AtomicReference<Object>();
final CountDownLatch messageReceived = new CountDownLatch(1);
final ReceivedMessagesListener listener = new ReceivedMessagesListener() {
@Override
public void messageReceived(final Object message) {
receivedMessage.set(message);
messageReceived.countDown();
}
};
this.testServer.addListener(listener);
final ChannelGroup connectedChannels = this.testClient.connect(10,
this.testServer.getPort());
final SendSmsNackContainer<String> ackContainer = new SendSmsNackContainer<String>(
1, "error", "1", connectedChannels.iterator().next().getId(),
sms);
final DefaultOutgoingMessagesSender<String> objectUnderTest = new DefaultOutgoingMessagesSender<String>(
connectedChannels);
objectUnderTest.nackReceivedSms(ackContainer);
messageReceived.await();
assertEquals("ackReceivedSms(" + ackContainer
+ ") did not send expected ack container", ackContainer,
receivedMessage.get());
}
@Test(timeout = 2000, expected = IllegalStateException.class)
public final void assertThatNackReceivedmsThrowsIllegalStateExceptionIfReceivingChannelIsNotConnectedAnymore()
throws Exception {
final Sms sms = new Sms(
new Msisdn("01686754432"),
new Msisdn("01686754432"),
"assertThatNackReceivedmsThrowsIllegalStateExceptionIfReceivingChannelIsNotConnectedAnymore");
final SendSmsNackContainer<String> ackContainer = new SendSmsNackContainer<String>(
1, "error", "1", -1, sms);
final ChannelGroup connectedChannels = this.testClient.connect(0,
this.testServer.getPort());
final DefaultOutgoingMessagesSender<String> objectUnderTest = new DefaultOutgoingMessagesSender<String>(
connectedChannels);
objectUnderTest.nackReceivedSms(ackContainer);
}
@Test(timeout = 2000, expected = IllegalStateException.class)
public final void assertThatNackReceivedSmsCallsListenerIfReceivingChannelIsNotConnectedAnymore()
throws Exception {
final Sms sms = new Sms(new Msisdn("01686754432"), new Msisdn(
"01686754432"),
"assertThatNackReceivedSmsCallsListenerIfReceivingChannelIsNotConnectedAnymore");
final SendSmsNackContainer<String> ackContainer = new SendSmsNackContainer<String>(
1, "error", "1", -1, sms);
final CountDownLatch listenerCalled = new CountDownLatch(1);
final OutgoingMessagesSender.Listener<String> listener = new OutgoingMessagesSender.Listener<String>() {
@Override
public void sendSmsFailed(final SendSmsContainer failedSms,
final Throwable error) {
// Noop
}
@Override
public void acknowldgeReceivedSmsFailed(
final MessageAcknowledgementContainer<String, ? extends GsmPdu> acknowledgement,
final Throwable error) {
listenerCalled.countDown();
}
};
final ChannelGroup connectedChannels = this.testClient.connect(0,
this.testServer.getPort());
final DefaultOutgoingMessagesSender<String> objectUnderTest = new DefaultOutgoingMessagesSender<String>(
connectedChannels);
objectUnderTest.addListener(listener);
objectUnderTest.nackReceivedSms(ackContainer);
listenerCalled.await();
}
}