package org.skyscreamer.nevado.jms.facilities;
import junit.framework.Assert;
import org.junit.Test;
import org.skyscreamer.nevado.jms.*;
import org.skyscreamer.nevado.jms.destination.NevadoQueue;
import org.skyscreamer.nevado.jms.util.RandomData;
import org.skyscreamer.nevado.jms.util.TestMessageListener;
import javax.jms.*;
import javax.jms.IllegalStateException;
/**
* Test closing a connection (JMS 1.1, sec. 4.3.5)
*
* @author Carter Page <carter@skyscreamer.org>
*/
public class ConnectionCloseTest extends AbstractJMSTest {
@Test
public void testPendingMessages() throws JMSException
{
Connection connection = getConnection();
NevadoSession session = createSession();
connection.stop();
TextMessage msg = session.createTextMessage(RandomData.readString());
Queue testQueue = createTempQueue(session);
session.createProducer(testQueue).send(msg);
MessageConsumer consumer = session.createConsumer(testQueue);
TestMessageListener listener = new TestMessageListener(false);
consumer.setMessageListener(listener);
connection.start();
connection.close();
Assert.assertNull(listener.getMessage(100));
}
@Test(expected = IllegalStateException.class)
public void testReceiveAfterClose() throws JMSException
{
Connection connection = getConnection();
NevadoSession session = createSession();
MessageConsumer consumer = session.createConsumer(new NevadoQueue("unusedQueue"));
connection.close();
consumer.receiveNoWait();
}
/**
* Test that a connection rolls back a transaction when it is closed.
*
* @throws JMSException
*/
@Test
public void testRollbackTransaction() throws JMSException
{
// A temporary queue (but not a TemporaryQueue!) is needed here since we're testing across connections
NevadoQueue testQueue = new NevadoQueue("testQueue" + RandomData.readInt());
// Do some stuff, roll it back
Connection testConnection = createConnection(getConnectionFactory());
testConnection.start();
Session controlSession = createSession();
TextMessage msg1 = controlSession.createTextMessage(RandomData.readString());
controlSession.createProducer(testQueue).send(msg1);
Session session = testConnection.createSession(true, Session.SESSION_TRANSACTED);
TextMessage msgOut = (TextMessage)session.createConsumer(testQueue).receive(1000);
Assert.assertEquals(msg1.getText(), msgOut.getText());
TextMessage msg2 = session.createTextMessage(RandomData.readString());
session.createProducer(testQueue).send(msg2);
testConnection.close();
// Confirm the rollback worked
Session testSession = createSession();
MessageConsumer consumer = testSession.createConsumer(testQueue);
TextMessage afterTxMsg = (TextMessage)consumer.receive(1000);
Assert.assertNotNull(afterTxMsg);
Assert.assertEquals(msg1.getText(), afterTxMsg.getText());
Assert.assertNull(consumer.receive(100));
// Clean up
deleteQueue(testQueue);
}
@Test
public void testRecursiveClose() throws JMSException
{
NevadoConnection testConnection = getConnection();
NevadoSession session = (NevadoSession)testConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue testQueue = createTempQueue(session);
NevadoMessageConsumer consumer = session.createConsumer(testQueue);
NevadoMessageProducer producer = session.createProducer(testQueue);
testConnection.close();
Assert.assertFalse(testConnection.isRunning());
Assert.assertTrue(testConnection.isClosed());
Assert.assertTrue(session.isClosed());
Assert.assertTrue(consumer.isClosed());
Assert.assertTrue(producer.isClosed());
}
@Test
public void testRecursiveSessionClose() throws JMSException
{
NevadoSession session = createSession();
Queue testQueue = createTempQueue(session);
NevadoMessageConsumer consumer = session.createConsumer(testQueue);
NevadoMessageProducer producer = session.createProducer(testQueue);
session.close();
Assert.assertTrue(session.isClosed());
Assert.assertTrue(consumer.isClosed());
Assert.assertTrue(producer.isClosed());
}
@Test(expected = IllegalStateException.class)
public void testAcknowledgeMessage() throws JMSException
{
NevadoConnection testConnection = getConnection();
NevadoSession session = (NevadoSession)testConnection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
Queue testQueue = createTempQueue(session);
session.createProducer(testQueue).send(session.createMessage());
Message msg = session.createConsumer(testQueue).receive(1000);
Assert.assertNotNull(msg);
testConnection.close();
msg.acknowledge();
}
@Test
public void reClose() throws JMSException
{
NevadoConnection testConnection = getConnection();
testConnection.close();
testConnection.close(); // This must not throw an exception
}
@Test
public void reCloseSession() throws JMSException
{
Session session = createSession();
session.close();
session.close(); // This must not throw an exception
}
@Test(expected = IllegalStateException.class)
public void testSessionAfterClose() throws JMSException
{
NevadoConnection testConnection = getConnection();
NevadoSession session = (NevadoSession)testConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
testConnection.close();
session.createMessage();
}
@Test(expected = IllegalStateException.class)
public void testConsumerAfterClose() throws JMSException
{
NevadoConnection testConnection = getConnection();
NevadoSession session = (NevadoSession)testConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer consumer = session.createConsumer(createTempQueue(session));
testConnection.close();
consumer.receiveNoWait();
}
@Test(expected = IllegalStateException.class)
public void testProducerAfterClose() throws JMSException
{
NevadoConnection testConnection = getConnection();
NevadoSession session = (NevadoSession)testConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Message msg = session.createMessage();
MessageProducer producer = session.createProducer(createTempQueue(session));
testConnection.close();
producer.send(msg);
}
}