package org.skyscreamer.nevado.jms.facilities; 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.NevadoSession; import org.skyscreamer.nevado.jms.util.RandomData; import org.skyscreamer.nevado.jms.util.TestMessageListener; import javax.jms.*; /** * Tests starting and stopping connections (JMS 1.1, Sec. 4.3.3 & 4.3.4) * * @author Carter Page <carter@skyscreamer.org> */ public class ConnectionStopStartTest extends AbstractJMSTest { @Test public void testClientStart() throws Exception { // Set up session for sync messages NevadoConnection conn = createConnection(getConnectionFactory()); NevadoSession session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); Queue tempQueue = createTempQueue(session); MessageProducer producer = session.createProducer(tempQueue); String testBody = RandomData.readString(); TextMessage testMessage = session.createTextMessage(testBody); producer.send(testMessage); MessageConsumer consumer = session.createConsumer(tempQueue); Message msg = consumer.receive(500); Assert.assertNull(msg); conn.start(); msg = consumer.receiveNoWait(); msg.acknowledge(); Assert.assertTrue(msg instanceof TextMessage); Assert.assertEquals(testBody, ((TextMessage)msg).getText()); conn.close(); } @Test public void testAsyncClientStart() throws Exception { // Set up session for async messages NevadoConnection conn = createConnection(getConnectionFactory()); NevadoSession asyncSession = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); TestMessageListener messageListener = new TestMessageListener(false); Queue tempQueue = createTempQueue(asyncSession); asyncSession.createConsumer(tempQueue).setMessageListener(messageListener); MessageProducer asyncProducer = asyncSession.createProducer(tempQueue); String asyncTestBody = RandomData.readString(); TextMessage asyncTestMessage = asyncSession.createTextMessage(asyncTestBody); asyncProducer.send(asyncTestMessage); Thread.sleep(200); Assert.assertTrue(messageListener.isEmpty()); conn.start(); TextMessage message = (TextMessage)messageListener.getMessage(1000); Assert.assertEquals(asyncTestBody, message.getText()); conn.close(); } @Test public void testClientPause() throws Exception { // Set up and send two messages NevadoConnection conn = getConnection(); NevadoSession session = createSession(); String testBody1 = RandomData.readString(); String testBody2 = RandomData.readString(); Queue tempQueue = createTempQueue(session); MessageProducer producer = session.createProducer(tempQueue); producer.send(session.createTextMessage(testBody1)); producer.send(session.createTextMessage(testBody2)); // Wait for the first message MessageConsumer consumer = session.createConsumer(tempQueue); TextMessage msg = (TextMessage)consumer.receive(); msg.acknowledge(); if (testBody1.equals(msg.getText())) { // OK } else if (testBody2.equals(msg.getText())) { // Order's mixed up. Switch the two. String tmp = testBody1; testBody1 = testBody2; testBody2 = tmp; } else { Assert.fail("Message does not match either message sent"); } // Pause and ensure the second message isn't coming conn.stop(); Assert.assertNull(consumer.receive(500)); // Restart and pick up second message conn.start(); msg = (TextMessage)consumer.receiveNoWait(); Assert.assertNotNull(msg); msg.acknowledge(); Assert.assertTrue(msg instanceof TextMessage); Assert.assertEquals(testBody2, ((TextMessage) msg).getText()); } @Test(timeout = 10000) public void testAsyncClientPause() throws Exception { // Set up listener NevadoConnection conn = getConnection(); NevadoSession session = createSession(); TextMessage testMsg1 = session.createTextMessage(RandomData.readString()); TextMessage testMsg2 = session.createTextMessage(RandomData.readString()); Queue tempQueue = createTempQueue(session); MessageProducer producer = session.createProducer(tempQueue); producer.send(testMsg1); producer.send(testMsg2); // Add listener TestMessageListener messageListener = new TestMessageListener(false); session.createConsumer(tempQueue).setMessageListener(messageListener); TextMessage msgOut1 = (TextMessage)messageListener.getMessage(1000); TextMessage msgOut2 = (TextMessage)messageListener.getMessage(1000); compareTextMessages(new TextMessage[] { testMsg1, testMsg2}, new TextMessage[] { msgOut1, msgOut2 }); Assert.assertTrue(messageListener.isEmpty()); // Pause conn.stop(); String testBody3 = RandomData.readString(); producer.send(session.createTextMessage(testBody3)); Thread.sleep(200); Assert.assertTrue(messageListener.isEmpty()); conn.start(); Assert.assertEquals(testBody3, ((TextMessage)messageListener.getMessage(1000)).getText()); Assert.assertTrue(messageListener.isEmpty()); } }