package org.springframework.flex.messaging.jms;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQTopic;
import org.junit.After;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.support.StaticApplicationContext;
import org.springframework.flex.core.AbstractMessageBrokerTests;
import flex.messaging.FlexContext;
import flex.messaging.MessageBroker;
import flex.messaging.MessageDestination;
import flex.messaging.messages.AsyncMessage;
import flex.messaging.messages.CommandMessage;
import flex.messaging.services.MessageService;
public class JmsAdapterTests extends AbstractMessageBrokerTests {
private static final String DEST_ID = "testJmsAdapter";
@Mock
private ApplicationEventPublisher publisher;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@After
public void tearDown() throws Exception {
getMessageService().removeDestination(DEST_ID);
}
@Test
public void destinationSubscribeSendUnsubscribe() throws Exception {
JmsAdapter adapter = createAdapter();
FlexContext.setThreadLocalFlexClient(getMessageBroker().getFlexClientManager().getFlexClient("foo"));
CommandMessage subscribeMessage = new CommandMessage(CommandMessage.SUBSCRIBE_OPERATION);
subscribeMessage.setClientId("1234");
subscribeMessage.setDestination(DEST_ID);
adapter.manage(subscribeMessage);
assertTrue("MessageListener not initialized", adapter.getMessageListenerContainer().isActive());
assertTrue("MessageListener not running",adapter.getMessageListenerContainer().isRunning());
AsyncMessage testMessage = new AsyncMessage();
testMessage.setBody("test");
adapter.invoke(testMessage);
CommandMessage unsubscribeMessage = new CommandMessage(CommandMessage.UNSUBSCRIBE_OPERATION);
unsubscribeMessage.setClientId("1234");
unsubscribeMessage.setDestination(DEST_ID);
adapter.manage(unsubscribeMessage);
assertFalse("MessageListener not stopped",adapter.getMessageListenerContainer().isRunning());
assertFalse("MessageListener should be shut down", adapter.getMessageListenerContainer().isActive());
}
@Test
public void destinationSubscribeTwiceSendUnsubscribe() throws Exception {
JmsAdapter adapter = createAdapter();
CommandMessage subscribeMessage = new CommandMessage(CommandMessage.SUBSCRIBE_OPERATION);
subscribeMessage.setClientId("1234");
subscribeMessage.setDestination(DEST_ID);
adapter.manage(subscribeMessage);
assertTrue("MessageListener not initialized", adapter.getMessageListenerContainer().isActive());
assertTrue("MessageListener not running",adapter.getMessageListenerContainer().isRunning());
CommandMessage subscribeMessage2 = new CommandMessage(CommandMessage.SUBSCRIBE_OPERATION);
subscribeMessage2.setClientId("5678");
subscribeMessage2.setDestination(DEST_ID);
adapter.manage(subscribeMessage2);
AsyncMessage testMessage = new AsyncMessage();
testMessage.setBody("test");
adapter.invoke(testMessage);
CommandMessage unsubscribeMessage = new CommandMessage(CommandMessage.UNSUBSCRIBE_OPERATION);
unsubscribeMessage.setClientId("1234");
unsubscribeMessage.setDestination(DEST_ID);
adapter.manage(unsubscribeMessage);
assertTrue("MessageListener stopped unexpectedly",adapter.getMessageListenerContainer().isRunning());
assertTrue("MessageListener shut down unexpectedly", adapter.getMessageListenerContainer().isActive());
}
@Test
public void subscribeUnsubscribeStop() throws Exception{
JmsAdapter adapter = createAdapter();
CommandMessage subscribeMessage = new CommandMessage(CommandMessage.SUBSCRIBE_OPERATION);
subscribeMessage.setClientId("1234");
subscribeMessage.setDestination(DEST_ID);
adapter.manage(subscribeMessage);
assertTrue("MessageListener not initialized", adapter.getMessageListenerContainer().isActive());
assertTrue("MessageListener not running",adapter.getMessageListenerContainer().isRunning());
CommandMessage unsubscribeMessage = new CommandMessage(CommandMessage.UNSUBSCRIBE_OPERATION);
unsubscribeMessage.setClientId("1234");
unsubscribeMessage.setDestination(DEST_ID);
adapter.manage(unsubscribeMessage);
assertFalse("MessageListener not stopped",adapter.getMessageListenerContainer().isRunning());
assertFalse("MessageListener not shut down", adapter.getMessageListenerContainer().isActive());
adapter.stop();
assertFalse("MessageListener not shut down", adapter.getMessageListenerContainer().isActive());
}
@Test
public void subscribeTwiceUnsubscribeStop() throws Exception{
JmsAdapter adapter = createAdapter();
CommandMessage subscribeMessage = new CommandMessage(CommandMessage.SUBSCRIBE_OPERATION);
subscribeMessage.setClientId("1234");
subscribeMessage.setDestination(DEST_ID);
adapter.manage(subscribeMessage);
assertTrue("MessageListener not initialized", adapter.getMessageListenerContainer().isActive());
assertTrue("MessageListener not running",adapter.getMessageListenerContainer().isRunning());
CommandMessage subscribeMessage2 = new CommandMessage(CommandMessage.SUBSCRIBE_OPERATION);
subscribeMessage2.setClientId("5678");
subscribeMessage2.setDestination(DEST_ID);
adapter.manage(subscribeMessage2);
CommandMessage unsubscribeMessage = new CommandMessage(CommandMessage.UNSUBSCRIBE_OPERATION);
unsubscribeMessage.setClientId("1234");
unsubscribeMessage.setDestination(DEST_ID);
adapter.manage(unsubscribeMessage);
assertTrue("MessageListener stopped unexpectedly",adapter.getMessageListenerContainer().isRunning());
assertTrue("MessageListener shut down unexpectedly", adapter.getMessageListenerContainer().isActive());
adapter.stop();
assertFalse("MessageListener not shut down", adapter.getMessageListenerContainer().isActive());
}
@Test
public void subscribeStop() throws Exception{
JmsAdapter adapter = createAdapter();
CommandMessage subscribeMessage = new CommandMessage(CommandMessage.SUBSCRIBE_OPERATION);
subscribeMessage.setClientId("1234");
subscribeMessage.setDestination(DEST_ID);
adapter.manage(subscribeMessage);
assertTrue("MessageListener not initialized", adapter.getMessageListenerContainer().isActive());
assertTrue("MessageListener not running",adapter.getMessageListenerContainer().isRunning());
adapter.stop();
assertFalse("MessageListener not stopped",adapter.getMessageListenerContainer().isRunning());
assertFalse("MessageListener not shut down", adapter.getMessageListenerContainer().isActive());
}
@Test
public void stop() throws Exception{
JmsAdapter adapter = createAdapter();
adapter.stop();
assertFalse("MessageListener not stopped",adapter.getMessageListenerContainer().isRunning());
assertFalse("MessageListener not shut down", adapter.getMessageListenerContainer().isActive());
}
@Test
public void stopRestart() throws Exception {
JmsAdapter adapter = createAdapter();
adapter.stop();
assertFalse("MessageListener not stopped",adapter.getMessageListenerContainer().isRunning());
assertFalse("MessageListener not shut down", adapter.getMessageListenerContainer().isActive());
adapter.start();
assertTrue("MessageListener not initialized", adapter.getMessageListenerContainer().isActive());
assertFalse("MessageListener running unexpectedly",adapter.getMessageListenerContainer().isRunning());
}
@Test
public void subscribeStopRestart() throws Exception{
JmsAdapter adapter = createAdapter();
CommandMessage subscribeMessage = new CommandMessage(CommandMessage.SUBSCRIBE_OPERATION);
subscribeMessage.setClientId("1234");
subscribeMessage.setDestination(DEST_ID);
adapter.manage(subscribeMessage);
assertTrue("MessageListener not initialized", adapter.getMessageListenerContainer().isActive());
assertTrue("MessageListener not running",adapter.getMessageListenerContainer().isRunning());
adapter.stop();
assertFalse("MessageListener not stopped",adapter.getMessageListenerContainer().isRunning());
assertFalse("MessageListener not shut down", adapter.getMessageListenerContainer().isActive());
adapter.start();
assertTrue("MessageListener not initialized", adapter.getMessageListenerContainer().isActive());
assertFalse("MessageListener running unexpectedly",adapter.getMessageListenerContainer().isRunning());
}
private JmsAdapter createAdapter() throws Exception {
String adapterBeanName = "test-jms-adapter";
MutablePropertyValues properties = new MutablePropertyValues();
ConnectionFactory cf = new ActiveMQConnectionFactory("vm:(broker:(tcp://localhost:61616)?persistent=false)?marshal=false");
Destination dest = new ActiveMQTopic("test.topic");
properties.addPropertyValue("connectionFactory", cf);
properties.addPropertyValue("jmsDestination", dest);
StaticApplicationContext context = new StaticApplicationContext();
context.registerPrototype(adapterBeanName, JmsAdapter.class, properties);
JmsAdapter adapter = (JmsAdapter) context.getBean(adapterBeanName);
MessageDestination destination = new MessageDestination();
destination.setId(DEST_ID);
destination.setService(getMessageService());
adapter.setDestination(destination);
adapter.setApplicationEventPublisher(publisher);
adapter.start();
return adapter;
}
private MessageService getMessageService() throws Exception {
MessageBroker broker = getMessageBroker();
return (MessageService) broker.getServiceByType(MessageService.class.getName());
}
}