/* * -----------------------------------------------------------------------\ * PerfCake *   * Copyright (C) 2010 - 2016 the original author or authors. *   * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * -----------------------------------------------------------------------/ */ package org.perfcake.message.sender; import org.perfcake.PerfCakeConst; import org.perfcake.PerfCakeException; import org.perfcake.util.ObjectFactory; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.testng.Arquillian; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.Serializable; import java.util.Properties; import javax.annotation.Resource; import javax.jms.BytesMessage; import javax.jms.ConnectionFactory; import javax.jms.Message; import javax.jms.ObjectMessage; import javax.jms.Queue; import javax.jms.TextMessage; /** * Tests {@link org.perfcake.message.sender.RequestResponseJms11Sender}. * * @author <a href="mailto:lenka@vecerovi.com">Lenka Večeřa</a> */ @Test(groups = { "ueber" }) public class RequestResponseJms11SenderTest extends Arquillian { private static final Logger log = LogManager.getLogger(RequestResponseJms11SenderTest.class); @Resource(mappedName = "jms/queue/test") private Queue queue; @Resource(mappedName = "jms/queue/test_reply") private Queue queueReply; @Resource(mappedName = "java:/ConnectionFactory") private ConnectionFactory factory; private String disableTemplatesProperty; @Deployment public static JavaArchive createDeployment() { return ShrinkWrap.create(JavaArchive.class).addPackages(true, "org.perfcake", "javassist", "org.apache.commons.beanutils", "org.apache.logging.log4j", "org.apache.commons.collections") .addAsResource("log4j2.xml") .deleteClass("org.perfcake.message.sender.WebSocketSender").deleteClass("org.perfcake.message.sender.WebSocketSender$PerfCakeClientEndpoint"); } @BeforeClass public void disableTemplates() { disableTemplatesProperty = System.getProperty(PerfCakeConst.DISABLE_TEMPLATES_PROPERTY); System.setProperty(PerfCakeConst.DISABLE_TEMPLATES_PROPERTY, "true"); } @AfterClass public void restoreTemplates() { if (disableTemplatesProperty != null) { System.setProperty(PerfCakeConst.DISABLE_TEMPLATES_PROPERTY, disableTemplatesProperty); } } @Test public void testResponseSend() throws Exception { final String queueName = "jms/queue/test"; final String replyQueueName = "jms/queue/test_reply"; final JmsHelper.Wiretap wiretap = JmsHelper.wiretap(queueName, replyQueueName); wiretap.start(); final Properties props = new Properties(); props.setProperty("messagetType", "STRING"); props.setProperty("target", queueName); props.setProperty("responseTarget", replyQueueName); props.setProperty("connectionFactory", "ConnectionFactory"); props.setProperty("transacted", "true"); props.setProperty("autoAck", "false"); final RequestResponseJms11Sender sender = (RequestResponseJms11Sender) ObjectFactory.summonInstance(RequestResponseJms11Sender.class.getName(), props); Assert.assertEquals(sender.getMessageType(), RequestResponseJms11Sender.MessageType.STRING); Assert.assertEquals(sender.getTarget(), queueName); Assert.assertEquals(sender.getResponseTarget(), replyQueueName); Assert.assertEquals(sender.isTransacted(), true); Assert.assertEquals(sender.isAutoAck(), false); try { sender.init(); // make sure the queues are empty Assert.assertNull(JmsHelper.readMessage(factory, 500, queue)); Assert.assertNull(JmsHelper.readMessage(factory, 500, queueReply)); // STRING org.perfcake.message.Message message = new org.perfcake.message.Message(); final String payload = "Hello World!"; message.setPayload(payload); sender.preSend(message, null); Serializable response = sender.send(message, null); sender.postSend(message); Assert.assertTrue(response instanceof String); Assert.assertEquals((String) response, payload); // what did the wiretap see Message jmsResponse = wiretap.getLastMessage(); Assert.assertTrue(jmsResponse instanceof TextMessage); Assert.assertEquals(((TextMessage) jmsResponse).getText(), payload); // OBJECT sender.setMessageType(Jms11Sender.MessageType.OBJECT); message = new org.perfcake.message.Message(); final Long payloadObject = 42L; message.setPayload(payloadObject); sender.preSend(message, null); response = sender.send(message, null); sender.postSend(message); Assert.assertTrue(response instanceof Long); Assert.assertEquals((Long) response, payloadObject); // what did the wiretap see jmsResponse = wiretap.getLastMessage(); Assert.assertTrue(jmsResponse instanceof ObjectMessage); Assert.assertTrue(((ObjectMessage) jmsResponse).getObject() instanceof Long); Assert.assertEquals((Long) ((ObjectMessage) jmsResponse).getObject(), payloadObject); // BYTEARRAY sender.setMessageType(Jms11Sender.MessageType.BYTEARRAY); message = new org.perfcake.message.Message(); message.setPayload(payload); sender.preSend(message, null); response = sender.send(message, null); sender.postSend(message); Assert.assertTrue(response instanceof byte[]); Assert.assertEquals(new String((byte[]) response, "UTF-8").trim(), payload); // what did the wiretap see jmsResponse = wiretap.getLastMessage(); Assert.assertTrue(jmsResponse instanceof BytesMessage); final BytesMessage bytesMessage = (BytesMessage) jmsResponse; bytesMessage.reset(); final byte[] bytes = new byte[(int) bytesMessage.getBodyLength()]; bytesMessage.readBytes(bytes, bytes.length); Assert.assertEquals(new String(bytes, "UTF-8").trim(), payload); wiretap.stop(); // make sure the queue is empty Assert.assertNull(JmsHelper.readMessage(factory, 500, queue)); Assert.assertNull(JmsHelper.readMessage(factory, 500, queueReply)); } finally { sender.close(); } } @Test public void testCorrelationId() throws Exception { final String queueName = "jms/queue/test"; final String replyQueueName = "jms/queue/test_reply"; final JmsHelper.Wiretap wiretap = JmsHelper.wiretap(queueName, replyQueueName); wiretap.start(); final Properties props = new Properties(); props.setProperty("messagetType", "STRING"); props.setProperty("target", queueName); props.setProperty("responseTarget", replyQueueName); props.setProperty("useCorrelationId", "true"); final RequestResponseJms11Sender sender = (RequestResponseJms11Sender) ObjectFactory.summonInstance(RequestResponseJms11Sender.class.getName(), props); Assert.assertEquals(sender.getMessageType(), RequestResponseJms11Sender.MessageType.STRING); Assert.assertEquals(sender.getTarget(), queueName); Assert.assertEquals(sender.getResponseTarget(), replyQueueName); Assert.assertEquals(sender.isUseCorrelationId(), true); try { sender.init(); // make sure the queue is empty Assert.assertNull(JmsHelper.readMessage(factory, 500, queue)); Assert.assertNull(JmsHelper.readMessage(factory, 500, queueReply)); // send colliding message final String collidePayload = "Collide Hello World!"; final Properties collideProps = new Properties(); collideProps.setProperty("messagetType", "STRING"); collideProps.setProperty("target", replyQueueName); final Jms11Sender collideSender = (Jms11Sender) ObjectFactory.summonInstance(Jms11Sender.class.getName(), collideProps); try { collideSender.init(); final org.perfcake.message.Message message = new org.perfcake.message.Message(); message.setPayload(collidePayload); collideSender.preSend(message, null); collideSender.send(message, null); collideSender.postSend(message); } finally { collideSender.close(); } final org.perfcake.message.Message message = new org.perfcake.message.Message(); final String payload = "Correlating Hello World!"; message.setPayload(payload); sender.preSend(message, null); final Serializable response = sender.send(message, null); sender.postSend(message); Assert.assertTrue(response instanceof String); Assert.assertEquals((String) response, payload); wiretap.stop(); final Message collidingMessage = JmsHelper.readMessage(factory, 500, queueReply); Assert.assertTrue(collidingMessage instanceof TextMessage); Assert.assertEquals(((TextMessage) collidingMessage).getText(), collidePayload); // make sure the queues are empty Assert.assertNull(JmsHelper.readMessage(factory, 500, queue)); Assert.assertNull(JmsHelper.readMessage(factory, 500, queueReply)); } finally { sender.close(); } } @Test public void testNegativeTimeout() throws Exception { final String queueName = "jms/queue/test"; final String replyQueueName = "jms/queue/test_reply"; final Properties props = new Properties(); props.setProperty("messagetType", "STRING"); props.setProperty("target", queueName); props.setProperty("responseTarget", replyQueueName); props.setProperty("receivingTimeout", "10"); props.setProperty("receiveAttempts", "2"); final RequestResponseJms11Sender sender = (RequestResponseJms11Sender) ObjectFactory.summonInstance(RequestResponseJms11Sender.class.getName(), props); Assert.assertEquals(sender.getMessageType(), RequestResponseJms11Sender.MessageType.STRING); Assert.assertEquals(sender.getTarget(), queueName); Assert.assertEquals(sender.getResponseTarget(), replyQueueName); Assert.assertEquals(sender.getReceivingTimeout(), 10); Assert.assertEquals(sender.getReceiveAttempts(), 2); try { sender.init(); // make sure the queue is empty Assert.assertNull(JmsHelper.readMessage(factory, 500, queue)); Assert.assertNull(JmsHelper.readMessage(factory, 500, queueReply)); final org.perfcake.message.Message message = new org.perfcake.message.Message(); final String payload = "Timeout Hello World!"; message.setPayload(payload); sender.preSend(message, null); try { final Serializable response = sender.send(message, null); Assert.assertFalse(true, "The expected exception was not thrown."); } catch (final PerfCakeException pce) { Assert.assertTrue(pce.getMessage().contains("No message")); } // read the original message from the queue final Message originalMessage = JmsHelper.readMessage(factory, 500, queue); Assert.assertTrue(originalMessage instanceof TextMessage, "Expected TextMessage, the message really is: " + (originalMessage == null ? null : originalMessage.getClass().getName())); Assert.assertEquals(((TextMessage) originalMessage).getText(), payload); // make sure the queues are empty Assert.assertNull(JmsHelper.readMessage(factory, 500, queue)); Assert.assertNull(JmsHelper.readMessage(factory, 500, queueReply)); } finally { sender.close(); } } }