package vnet.sms.gateway.server.framework; import static org.junit.Assert.assertTrue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import javax.annotation.Resource; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.ObjectMessage; import javax.jms.Session; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.group.ChannelGroup; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.jms.core.JmsOperations; import org.springframework.jms.core.MessageCreator; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import vnet.sms.common.messages.Headers; import vnet.sms.common.messages.Msisdn; import vnet.sms.common.messages.Sms; import vnet.sms.common.wme.MessageEventType; import vnet.sms.gateway.server.framework.test.IntegrationTestClient; import vnet.sms.gateway.server.framework.test.MessageEventPredicate; import vnet.sms.gateway.transports.serialization.ReferenceableMessageContainer; @RunWith(SpringJUnit4ClassRunner.class) @ActiveProfiles("itest") @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) @ContextConfiguration({ "classpath:META-INF/services/gateway-server-application-context.xml", "classpath:META-INF/services/gateway-server-authentication-manager-context.xml", "classpath:META-INF/services/gateway-server-jms-client-context.xml", "classpath*:META-INF/module/module-context.xml", "classpath:META-INF/itest/itest-gateway-server-embedded-activemq-broker-context.xml", "classpath:META-INF/itest/itest-serialization-transport-plugin-context.xml", "classpath:META-INF/itest/itest-test-client-context.xml", "classpath:META-INF/itest/itest-test-jms-listener-context.xml", "classpath:META-INF/itest/itest-gateway-server-description-context.xml" }) public class SendOutgoingMoSmsIT { @Autowired private IntegrationTestClient testClient; @Autowired private JmsOperations jmsClient; @Resource(name = "vnet.sms.gateway.server.server-framework.allConnectedChannels") private ChannelGroup allConnectedChannels; @Value("#{ '${gateway.server.jmsserver.queues.outgoingMoSms}' }") private String outgoingMoSmsQueueName; @Before public void connectTestClient() throws Throwable { this.testClient.connect(); while (this.allConnectedChannels.size() < 1) { Thread.sleep(10L); } } @After public void disconnectTestClient() throws Throwable { this.testClient.disconnect(); } @Test public final void assertThatGatewayServerSendsMoSmsReceivedViaJmsToConnectedClient() throws Throwable { final Sms moSms = new Sms(new Msisdn("01686754432"), new Msisdn( "01686754432"), "assertThatGatewayServerSendsMoSmsReceivedViaJmsToConnectedClient"); final MessageEventPredicate moSmsReceived = new MessageEventPredicate() { @Override public boolean evaluate(final MessageEvent e) { if (!(e.getMessage() instanceof ReferenceableMessageContainer)) { return false; } return ReferenceableMessageContainer.class.cast(e.getMessage()) .getMessage().equals(moSms); } }; final CountDownLatch moSmsReceivedByClient = this.testClient .listen(moSmsReceived); this.jmsClient.send(this.outgoingMoSmsQueueName, new MessageCreator() { @Override public Message createMessage(final Session session) throws JMSException { final ObjectMessage moSmsObjectMessage = session .createObjectMessage(moSms); moSmsObjectMessage.setStringProperty(Headers.EVENT_TYPE, MessageEventType.SEND_SMS.name()); return moSmsObjectMessage; } }); assertTrue("GatewayServer should have sent MO SMS " + moSms + " received via JMS to connected client", moSmsReceivedByClient.await(2000L, TimeUnit.MILLISECONDS)); } }