package org.skyscreamer.nevado.jms.destination;
import org.junit.Assert;
import org.junit.Test;
import org.skyscreamer.nevado.jms.AbstractJMSTest;
import org.skyscreamer.nevado.jms.NevadoConnection;
import org.skyscreamer.nevado.jms.NevadoConnectionFactory;
import org.skyscreamer.nevado.jms.NevadoSession;
import org.skyscreamer.nevado.jms.util.RandomData;
import javax.jms.*;
import java.util.Collection;
import java.util.UUID;
/**
* Test temporary topics
*
* @author Carter Page <carter@skyscreamer.org>
*/
public class TemporaryTopicTest extends AbstractJMSTest {
@Test
public void testTemporaryTopic() throws Exception {
NevadoSession session = createSession();
TemporaryTopic temporaryTopic = session.createTemporaryTopic();
Assert.assertFalse(temporaryTopic.getTopicName().endsWith("null"));
TextMessage testMessage = session.createTextMessage(RandomData.readString());
MessageProducer producer = session.createProducer(temporaryTopic);
MessageConsumer consumer = session.createConsumer(temporaryTopic);
producer.send(testMessage);
Message msgOut = consumer.receive(5000);
Assert.assertTrue(msgOut instanceof TextMessage);
Assert.assertEquals("Message body not equal", testMessage.getText(), ((TextMessage) msgOut).getText());
}
@Test(expected = InvalidDestinationException.class)
public void testTemporaryQueueAcrossConnections() throws Exception
{
NevadoSession session = createSession();
TemporaryTopic temporaryTopic = session.createTemporaryTopic();
Connection theWrongConnection = createConnection(getConnectionFactory());
Session theWrongSession = theWrongConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
theWrongSession.createConsumer(temporaryTopic);
}
@Test
public void testTemporaryTopicSuffix() throws Exception
{
NevadoConnectionFactory connectionFactory = new NevadoConnectionFactory(_sqsConnectorFactory);
String temporaryTopicSuffix = UUID.randomUUID().toString();
Assert.assertTrue(temporaryTopicSuffix.length() > 0);
connectionFactory.setTemporaryTopicSuffix(temporaryTopicSuffix);
Connection connection = createConnection(connectionFactory);
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
TemporaryTopic topic = session.createTemporaryTopic();
Assert.assertTrue(topic.getTopicName().endsWith(temporaryTopicSuffix));
connection.close();
}
@Test
public void testDeleteUnusedTemporaryTopics() throws Exception {
NevadoConnection conn1;
String suffix1;
NevadoConnection conn2;
String suffix2;
{
NevadoConnectionFactory connectionFactory = new NevadoConnectionFactory(_sqsConnectorFactory);
suffix1 = UUID.randomUUID().toString();
connectionFactory.setTemporaryTopicSuffix(suffix1);
conn1 = createConnection(connectionFactory);
}
{
NevadoConnectionFactory connectionFactory = new NevadoConnectionFactory(_sqsConnectorFactory);
suffix2 = UUID.randomUUID().toString();
connectionFactory.setTemporaryTopicSuffix(suffix2);
conn2 = createConnection(connectionFactory);
}
try {
conn1.start();
conn2.start();
NevadoTemporaryTopic topic1 = conn1.createSession(false, Session.AUTO_ACKNOWLEDGE).createTemporaryTopic();
NevadoTemporaryTopic topic2 = conn2.createSession(false, Session.AUTO_ACKNOWLEDGE).createTemporaryTopic();
Assert.assertTrue(conn1.listAllTemporaryTopics().contains(topic1));
Assert.assertTrue(conn2.listAllTemporaryTopics().contains(topic2));
conn1.deleteUnusedTemporaryTopics(suffix2 + "X");
Assert.assertTrue(conn1.listAllTemporaryTopics().contains(topic1));
Assert.assertTrue(conn2.listAllTemporaryTopics().contains(topic2));
conn1.deleteUnusedTemporaryTopics(suffix2);
Assert.assertTrue(conn1.listAllTemporaryTopics().contains(topic1));
Assert.assertFalse(conn2.listAllTemporaryTopics().contains(topic2));
}
finally {
try {
conn1.close();
}
catch (Throwable t) {
_log.error("Unable to close connection 1", t);
}
try {
conn2.close();
}
catch (Throwable t) {
_log.error("Unable to close connection 1", t);
}
}
}
// Because the queues returned by SNS ListTopics is not synchronous with creation and deletion of topics, it is
// too flaky to test in a quick, automated fashion. This could be done with thie very slow test
// but we'll leave it disabled so our overall suite can remain fast.
@Test
public void testTemporaryTopicDeletion() throws Exception {
NevadoSession session = createSession();
TemporaryTopic temporaryTopic = session.createTemporaryTopic();
Collection<NevadoTemporaryTopic> allTemporaryTopics = getConnection().listAllTemporaryTopics();
Assert.assertTrue("Temporary topic should exist", allTemporaryTopics.contains(temporaryTopic));
getConnection().close();
allTemporaryTopics = getConnection().listAllTemporaryTopics();
Assert.assertFalse("Temporary topic should not exist", allTemporaryTopics.contains(temporaryTopic));
}
}