package org.skyscreamer.nevado.jms.facilities;
import junit.framework.Assert;
import org.junit.Test;
import org.skyscreamer.nevado.jms.AbstractJMSTest;
import org.skyscreamer.nevado.jms.NevadoConnection;
import org.skyscreamer.nevado.jms.NevadoSession;
import org.skyscreamer.nevado.jms.destination.NevadoTopic;
import org.skyscreamer.nevado.jms.util.RandomData;
import javax.jms.*;
/**
* Tests for durable topics
*
* @author Carter Page <carter@skyscreamer.org>
*/
public class DurableTopicTest extends AbstractJMSTest {
@Test
public void testDurableTopic() throws JMSException {
String durableTopicName = "testTopicSub" + RandomData.readShort();
String testTopicName = "testTopic" + RandomData.readShort();
NevadoSession session = createSession();
NevadoTopic topic = session.createTopic(testTopicName);
TopicSubscriber subscriber = session.createDurableSubscriber(topic, durableTopicName);
TextMessage msg1 = session.createTextMessage(RandomData.readString());
TextMessage msg2 = session.createTextMessage(RandomData.readString());
TextMessage msg3 = session.createTextMessage(RandomData.readString());
MessageProducer producer = session.createProducer(topic);
producer.send(msg1);
Assert.assertEquals(msg1, subscriber.receive(2000));
producer.send(msg2);
producer.send(msg3);
getConnection().close();
NevadoConnection conn = createConnection(getConnectionFactory());
conn.start();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
subscriber = session.createDurableSubscriber(topic, durableTopicName);
Message msgOut = subscriber.receive(2000);
Assert.assertNotNull(msgOut);
if (!msg2.equals(msgOut) && !msg3.equals(msgOut))
{
Assert.fail("Got " + msgOut + " ; expected " + msg2 + " or " + msg3);
}
subscriber.close();
session.unsubscribe(durableTopicName);
boolean exceptionThrown = false;
Message msgAfterUnsubscribe = null;
try {
_log.warn("EXPECTING EXCEPTION HERE:");
subscriber = session.createDurableSubscriber(topic, durableTopicName);
msgAfterUnsubscribe = subscriber.receive(500);
}
catch (JMSException e) {
exceptionThrown = true;
}
if (!exceptionThrown && msgAfterUnsubscribe != null) {
Assert.fail("Should not have been able to get message after unsubscribing from topic: "
+ msgAfterUnsubscribe);
}
conn.deleteTopic(topic);
conn.close();
}
@Test
public void testDurableTopicDifferentClientIDs() throws JMSException {
getConnection().close(); // Don't use the provided connection
String durableTopicName = "testTopicSub" + RandomData.readShort();
String testTopicName = "testTopic" + RandomData.readShort();
NevadoConnection conn = createConnection(getConnectionFactory());
conn.setClientID("abc");
conn.start();
NevadoSession session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
NevadoTopic topic = session.createTopic(testTopicName);
TopicSubscriber subscriber = session.createDurableSubscriber(topic, durableTopicName);
TextMessage msg1 = session.createTextMessage(RandomData.readString());
MessageProducer producer = session.createProducer(topic);
producer.send(msg1);
conn.close();
conn = createConnection(getConnectionFactory());
conn.setClientID("def");
conn.start();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
subscriber = session.createDurableSubscriber(topic, durableTopicName);
Message msgOut = subscriber.receive(2000);
Assert.assertNull(msgOut);
subscriber.close();
session.unsubscribe(durableTopicName);
conn.close();
conn = createConnection(getConnectionFactory());
conn.setClientID("abc");
conn.start();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
subscriber = session.createDurableSubscriber(topic, durableTopicName);
msgOut = subscriber.receive(2000);
Assert.assertEquals(msg1, msgOut);
subscriber.close();
session.unsubscribe(durableTopicName);
conn.deleteTopic(topic);
conn.close();
}
@Test
public void testUnsubscribeWithActiveSubscriber() throws JMSException {
String durableTopicName = "testTopicSub" + RandomData.readShort();
NevadoSession session = createSession();
NevadoTopic topic = createTempTopic(session);
TopicSubscriber subscriber = session.createDurableSubscriber(topic, durableTopicName);
boolean throwsException = false;
try {
session.unsubscribe(durableTopicName);
}
catch(JMSException e) {
throwsException = true;
}
// Clean up
if (throwsException)
{
subscriber.close();
session.unsubscribe(durableTopicName);
}
else
{
Assert.fail("Expected exception to be thrown when trying to unsubscribe an active topic subscription");
}
}
@Test
public void testUnsubscribeWithUnackedMsg() throws JMSException {
String durableTopicName = "testTopicSub" + RandomData.readShort();
NevadoSession session = getConnection().createSession(false, Session.CLIENT_ACKNOWLEDGE);
NevadoTopic topic = createTempTopic(session);
TopicSubscriber subscriber = session.createDurableSubscriber(topic, durableTopicName);
session.createProducer(topic).send(session.createMessage());
Message message = subscriber.receive(2000); // Don't acknowledge
boolean throwsException = false;
try {
session.unsubscribe(durableTopicName);
}
catch(JMSException e) {
throwsException = true;
}
if (throwsException)
{
// Clean up
message.acknowledge();
subscriber.close();
session.unsubscribe(durableTopicName);
}
else
{
Assert.fail("Expected exception to be thrown when trying to unsubscribe a topic with an unacked msg");
}
}
@Test
public void testDoubleSubscribe() throws JMSException {
String durableTopicName = "testTopicSub" + RandomData.readShort();
NevadoSession session = createSession();
NevadoTopic topic = createTempTopic(session);
TopicSubscriber subscriber = session.createDurableSubscriber(topic, durableTopicName);
boolean throwsException = false;
try {
session.createDurableSubscriber(topic, durableTopicName);
}
catch(JMSException e) {
throwsException = true;
}
if (throwsException)
{
// Clean up
subscriber.close();
session.unsubscribe(durableTopicName);
}
else
{
Assert.fail("Expected exception to be thrown when trying to double-subscribe an durable topic");
}
}
}