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.math.BigInteger; import java.util.Collection; import java.util.Random; /** * Tests Nevado's implementation of TemporaryQueue. * * @author Carter Page <carter@skyscreamer.org> */ public class TemporaryQueueTest extends AbstractJMSTest { @Test public void testTemporaryQueue() throws Exception { NevadoSession session = createSession(); TemporaryQueue temporaryQueue = session.createTemporaryQueue(); Assert.assertFalse(temporaryQueue.getQueueName().endsWith("null")); TextMessage testMessage = session.createTextMessage(RandomData.readString()); session.createProducer(temporaryQueue).send(testMessage); Message msgOut = session.createConsumer(temporaryQueue).receive(); 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(); TemporaryQueue temporaryQueue = session.createTemporaryQueue(); Connection theWrongConnection = createConnection(getConnectionFactory()); Session theWrongSession = theWrongConnection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageConsumer consumer = theWrongSession.createConsumer(temporaryQueue); } @Test public void testTemporaryQueueSuffix() throws Exception { NevadoConnectionFactory connectionFactory = new NevadoConnectionFactory(_sqsConnectorFactory); String temporaryQueueSuffix = "_" + new BigInteger(32, new Random()).toString(32); Assert.assertTrue(temporaryQueueSuffix.length() > 0); connectionFactory.setTemporaryQueueSuffix(temporaryQueueSuffix); Connection connection = createConnection(connectionFactory); connection.start(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); TemporaryQueue queue = session.createTemporaryQueue(); Assert.assertTrue(queue.getQueueName().endsWith(temporaryQueueSuffix)); connection.close(); } // Because the queues returned by SQS ListQueues is not synchronous with creation and deletion of queues, 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 testTemporaryQueueDeletion() throws Exception { NevadoSession session = createSession(); TemporaryQueue temporaryQueue = session.createTemporaryQueue(); Collection<NevadoTemporaryQueue> allTemporaryQueues = getConnection().listAllTemporaryQueues(); Assert.assertTrue("Temporary queue should exist", allTemporaryQueues.contains(temporaryQueue)); getConnection().close(); allTemporaryQueues = getConnection().listAllTemporaryQueues(); Assert.assertFalse("Temporary queue should not exist", allTemporaryQueues.contains(temporaryQueue)); } //@Test public void testDeleteUnusedTemporaryQueues() throws Exception { NevadoConnection conn1; String suffix1; NevadoConnection conn2; String suffix2; { NevadoConnectionFactory connectionFactory = new NevadoConnectionFactory(_sqsConnectorFactory); suffix1 = "_" + new BigInteger(32, new Random()).toString(32); connectionFactory.setTemporaryQueueSuffix(suffix1); conn1 = createConnection(connectionFactory); } { NevadoConnectionFactory connectionFactory = new NevadoConnectionFactory(_sqsConnectorFactory); suffix2 = "_" + new BigInteger(32, new Random()).toString(32); connectionFactory.setTemporaryQueueSuffix(suffix2); conn2 = createConnection(connectionFactory); } try { conn1.start(); conn2.start(); NevadoTemporaryQueue queue1 = conn1.createSession(false, Session.AUTO_ACKNOWLEDGE).createTemporaryQueue(); NevadoTemporaryQueue queue2 = conn2.createSession(false, Session.AUTO_ACKNOWLEDGE).createTemporaryQueue(); Assert.assertTrue(conn1.listAllTemporaryQueues().contains(queue1)); Assert.assertTrue(conn2.listAllTemporaryQueues().contains(queue2)); conn1.deleteUnusedTemporaryQueues(suffix2 + "X"); Assert.assertTrue(conn1.listAllTemporaryQueues().contains(queue1)); Assert.assertTrue(conn2.listAllTemporaryQueues().contains(queue2)); conn1.deleteUnusedTemporaryQueues(suffix2); Assert.assertTrue(conn1.listAllTemporaryQueues().contains(queue1)); Assert.assertFalse(conn2.listAllTemporaryQueues().contains(queue2)); } 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); } } } }