/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.qpid.jms.message; import static org.apache.qpid.jms.message.JmsMessageSupport.ACCEPTED; import static org.apache.qpid.jms.message.JmsMessageSupport.JMS_AMQP_ACK_TYPE; import static org.apache.qpid.jms.message.JmsMessageSupport.RELEASED; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.Serializable; import java.util.Enumeration; import java.util.Map; import java.util.UUID; import javax.jms.BytesMessage; import javax.jms.DeliveryMode; import javax.jms.JMSException; import javax.jms.MapMessage; import javax.jms.Message; import javax.jms.MessageFormatException; import javax.jms.MessageNotWriteableException; import javax.jms.ObjectMessage; import javax.jms.StreamMessage; import javax.jms.TextMessage; import org.apache.qpid.jms.JmsAcknowledgeCallback; import org.apache.qpid.jms.JmsConnection; import org.apache.qpid.jms.JmsDestination; import org.apache.qpid.jms.JmsSession; import org.apache.qpid.jms.JmsTopic; import org.apache.qpid.jms.message.facade.JmsMessageFacade; import org.apache.qpid.jms.message.facade.test.JmsTestMessageFacade; import org.apache.qpid.jms.message.facade.test.JmsTestMessageFactory; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class JmsMessageTest { private static final Logger LOG = LoggerFactory.getLogger(JmsMessageTest.class); private final JmsMessageFactory factory = new JmsTestMessageFactory(); private String jmsMessageID; private String jmsCorrelationID; private JmsDestination jmsDestination; private JmsDestination jmsReplyTo; private int jmsDeliveryMode; private boolean jmsRedelivered; private String jmsType; private long jmsExpiration; private int jmsPriority; private long jmsTimestamp; private long[] consumerIDs; @Before public void setUp() throws Exception { this.jmsMessageID = "ID:TEST-ID:0:0:0:1"; this.jmsCorrelationID = "testcorrelationid"; this.jmsDestination = new JmsTopic("test.topic"); this.jmsReplyTo = new JmsTopic("test.replyto.topic:001"); this.jmsDeliveryMode = Message.DEFAULT_DELIVERY_MODE; this.jmsRedelivered = true; this.jmsType = "test type"; this.jmsExpiration = 100000; this.jmsPriority = 5; this.jmsTimestamp = System.currentTimeMillis(); this.consumerIDs = new long[3]; for (int i = 0; i < this.consumerIDs.length; i++) { this.consumerIDs[i] = i; } } @Test public void testMessageSetToReadOnlyOnSend() throws Exception { JmsMessage msg = factory.createMessage(); assertFalse(msg.isReadOnlyBody()); assertFalse(msg.isReadOnlyProperties()); msg.onSend(0); assertTrue(msg.isReadOnly()); } @Test public void testMessageSetToReadOnlyOnDispatch() throws Exception { JmsMessage msg = factory.createMessage(); assertFalse(msg.isReadOnlyBody()); assertFalse(msg.isReadOnlyProperties()); msg.onDispatch(); assertTrue(msg.isReadOnlyBody()); assertTrue(msg.isReadOnlyProperties()); } @Test public void testToString() throws Exception { JmsMessage msg = factory.createMessage(); assertTrue(msg.toString().startsWith("JmsMessage")); } @Test public void testHashCode() throws Exception { JmsMessage msg = factory.createMessage(); msg.setJMSMessageID(this.jmsMessageID); assertEquals(msg.getJMSMessageID().hashCode(), jmsMessageID.hashCode()); assertEquals(msg.hashCode(), jmsMessageID.hashCode()); } @Test public void testHashCodeWhenNoMessageIDAssigned() throws Exception { JmsMessage msg1 = factory.createMessage(); JmsMessage msg2 = factory.createMessage(); assertFalse(msg1.hashCode() == msg2.hashCode()); assertTrue(msg1.hashCode() == msg1.hashCode()); } @Test public void testSetReadOnly() throws JMSException { JmsMessage msg = factory.createMessage(); msg.setReadOnlyProperties(true); boolean test = false; try { msg.setIntProperty("test", 1); } catch (MessageNotWriteableException me) { test = true; } catch (JMSException e) { e.printStackTrace(System.err); test = false; } assertTrue(test); } @Test public void testSetToForeignJMSID() throws Exception { JmsMessage msg = factory.createMessage(); msg.setJMSMessageID("ID:EMS-SERVER.8B443C380083:429"); } @Test public void testEqualsObject() throws Exception { JmsMessage msg1 = factory.createMessage(); JmsMessage msg2 = factory.createMessage(); msg1.setJMSMessageID(this.jmsMessageID); assertTrue(!msg1.equals(msg2)); assertTrue(!msg2.equals(msg1)); msg2.setJMSMessageID(this.jmsMessageID); assertTrue(msg1.equals(msg2)); assertTrue(msg2.equals(msg1)); msg2.setJMSMessageID(this.jmsMessageID + "More"); assertTrue(!msg1.equals(msg2)); assertTrue(!msg2.equals(msg1)); assertTrue(msg1.equals(msg1)); assertFalse(msg1.equals(null)); assertFalse(msg1.equals("")); } @Test public void testEqualsObjectNullMessageIds() throws Exception { JmsMessage msg1 = factory.createMessage(); JmsMessage msg2 = factory.createMessage(); assertFalse(msg2.equals(msg1)); assertFalse(msg1.equals(msg2)); } @Test public void testShallowCopy() throws Exception { JmsMessage msg1 = factory.createMessage(); msg1.setJMSMessageID(jmsMessageID); JmsMessage msg2 = msg1.copy(); assertTrue(msg1 != msg2 && msg1.equals(msg2)); } @Test public void testCopy() throws Exception { this.jmsMessageID = "testid"; this.jmsCorrelationID = "testcorrelationid"; this.jmsDestination = new JmsTopic("test.topic"); this.jmsReplyTo = new JmsTopic("test.replyto.topic:001"); this.jmsDeliveryMode = Message.DEFAULT_DELIVERY_MODE; this.jmsRedelivered = true; this.jmsType = "test type"; this.jmsExpiration = 100000; this.jmsPriority = 5; this.jmsTimestamp = System.currentTimeMillis(); JmsConnection connection = Mockito.mock(JmsConnection.class); JmsMessage msg1 = factory.createMessage(); msg1.setJMSMessageID(this.jmsMessageID); msg1.setJMSCorrelationID(this.jmsCorrelationID); msg1.setJMSDestination(this.jmsDestination); msg1.setJMSReplyTo(this.jmsReplyTo); msg1.setJMSDeliveryMode(this.jmsDeliveryMode); msg1.setJMSRedelivered(this.jmsRedelivered); msg1.setJMSType(this.jmsType); msg1.setJMSExpiration(this.jmsExpiration); msg1.setJMSPriority(this.jmsPriority); msg1.setJMSTimestamp(this.jmsTimestamp); msg1.setReadOnlyProperties(true); msg1.setConnection(connection); boolean isValidate = !msg1.isValidatePropertyNames(); msg1.setValidatePropertyNames(isValidate); JmsMessage msg2 = msg1.copy(); assertEquals(msg1.getJMSMessageID(), msg2.getJMSMessageID()); assertTrue(msg2.isReadOnlyProperties()); assertTrue(msg1.getJMSCorrelationID().equals(msg2.getJMSCorrelationID())); assertTrue(msg1.getJMSDestination().equals(msg2.getJMSDestination())); assertTrue(msg1.getJMSReplyTo().equals(msg2.getJMSReplyTo())); assertEquals(msg1.getJMSDeliveryMode(), msg2.getJMSDeliveryMode()); assertEquals(msg1.getJMSRedelivered(), msg2.getJMSRedelivered()); assertEquals(msg1.getJMSType(), msg2.getJMSType()); assertEquals(msg1.getJMSExpiration(), msg2.getJMSExpiration()); assertEquals(msg1.getJMSPriority(), msg2.getJMSPriority()); assertEquals(msg1.getJMSTimestamp(), msg2.getJMSTimestamp()); assertEquals(msg1.getConnection(), msg2.getConnection()); assertEquals(msg1.isValidatePropertyNames(), msg2.isValidatePropertyNames()); LOG.info("Message is: " + msg1); } @Test public void testGetAndSetJMSMessageID() throws Exception { JmsMessage msg = factory.createMessage(); assertNull(msg.getJMSMessageID()); msg.setJMSMessageID(this.jmsMessageID); assertEquals(msg.getJMSMessageID(), this.jmsMessageID); } @Test public void testGetJMSMessageIDAlwaysHasIdPrefix() throws Exception { JmsMessageFacade facade = Mockito.mock(JmsMessageFacade.class); Mockito.when(facade.getMessageId()).thenReturn("123456"); JmsMessage msg = new JmsMessage(facade); assertTrue(msg.getJMSMessageID().startsWith("ID:")); } @Test public void testGetAndSetJMSTimestamp() throws JMSException { JmsMessage msg = factory.createMessage(); msg.setJMSTimestamp(this.jmsTimestamp); assertTrue(msg.getJMSTimestamp() == this.jmsTimestamp); } @Test public void testGetJMSCorrelationIDAsBytes() throws Exception { JmsMessage msg = factory.createMessage(); msg.setJMSCorrelationID(this.jmsCorrelationID); byte[] testbytes = msg.getJMSCorrelationIDAsBytes(); String str2 = new String(testbytes); assertTrue(this.jmsCorrelationID.equals(str2)); } @Test public void testSetJMSCorrelationIDAsBytes() throws Exception { JmsMessage msg = factory.createMessage(); byte[] testbytes = this.jmsCorrelationID.getBytes(); msg.setJMSCorrelationIDAsBytes(testbytes); testbytes = msg.getJMSCorrelationIDAsBytes(); String str2 = new String(testbytes); assertTrue(this.jmsCorrelationID.equals(str2)); } @Test public void testGetAndSetJMSCorrelationID() throws JMSException { JmsMessage msg = factory.createMessage(); msg.setJMSCorrelationID(this.jmsCorrelationID); assertTrue(msg.getJMSCorrelationID().equals(this.jmsCorrelationID)); } @Test public void testGetAndSetJMSReplyTo() throws JMSException { JmsMessage msg = factory.createMessage(); msg.setJMSReplyTo(this.jmsReplyTo); assertTrue(msg.getJMSReplyTo().equals(this.jmsReplyTo)); } @Test public void testGetAndSetJMSDestination() throws Exception { JmsMessage msg = factory.createMessage(); msg.setJMSDestination(this.jmsDestination); assertTrue(msg.getJMSDestination().equals(this.jmsDestination)); } @Test public void testGetAndSetJMSDeliveryMode() throws JMSException { JmsMessage msg = factory.createMessage(); msg.setJMSDeliveryMode(this.jmsDeliveryMode); assertTrue(msg.getJMSDeliveryMode() == this.jmsDeliveryMode); msg.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT); assertEquals(DeliveryMode.NON_PERSISTENT, msg.getJMSDeliveryMode()); msg.setJMSDeliveryMode(DeliveryMode.PERSISTENT); assertEquals(DeliveryMode.PERSISTENT, msg.getJMSDeliveryMode()); } @Test public void testSetJMSDeliveryModeWithInvalidValue() throws JMSException { JmsMessage msg = factory.createMessage(); assertEquals(Message.DEFAULT_DELIVERY_MODE, msg.getJMSDeliveryMode()); try { msg.setJMSDeliveryMode(-1); fail("Should have thrown an exception"); } catch (JMSException ex) { LOG.debug("Caught expected exception: {}", ex.getMessage()); } try { msg.setJMSDeliveryMode(3); fail("Should have thrown an exception"); } catch (JMSException ex) { LOG.debug("Caught expected exception: {}", ex.getMessage()); } assertEquals(Message.DEFAULT_DELIVERY_MODE, msg.getJMSDeliveryMode()); } @Test public void testGetAndSetMSRedelivered() throws JMSException { JmsMessage msg = factory.createMessage(); msg.setJMSRedelivered(this.jmsRedelivered); assertTrue(msg.getJMSRedelivered() == this.jmsRedelivered); } @Test public void testGetAndSetJMSType() throws JMSException { JmsMessage msg = factory.createMessage(); msg.setJMSType(this.jmsType); assertTrue(msg.getJMSType().equals(this.jmsType)); } @Test public void testGetAndSetJMSExpiration() throws JMSException { JmsMessage msg = factory.createMessage(); msg.setJMSExpiration(this.jmsExpiration); assertTrue(msg.getJMSExpiration() == this.jmsExpiration); } @Test public void testGetAndSetJMSPriority() throws JMSException { JmsMessage message = factory.createMessage(); assertEquals(Message.DEFAULT_PRIORITY, message.getJMSPriority()); try { message.setJMSPriority(-1); fail("Should have thrown an exception"); } catch (JMSException ex) { LOG.debug("Caught expected exception: {}", ex.getMessage()); } try { message.setJMSPriority(10); fail("Should have thrown an exception"); } catch (JMSException ex) { LOG.debug("Caught expected exception: {}", ex.getMessage()); } assertEquals(Message.DEFAULT_PRIORITY, message.getJMSPriority()); } @Test public void testClearProperties() throws JMSException { JmsMessage msg = factory.createMessage(); msg.setStringProperty("test", "test"); msg.setJMSMessageID(this.jmsMessageID); msg.clearProperties(); assertNull(msg.getStringProperty("test")); assertNotNull(msg.getJMSMessageID()); } @Test public void testClearPropertiesClearsReadOnly() throws Exception { JmsMessage msg = factory.createMessage(); msg.onDispatch(); try { msg.setObjectProperty("test", "value"); fail("should throw exception"); } catch (MessageNotWriteableException e) { // Expected } assertTrue(msg.isReadOnlyProperties()); msg.clearProperties(); msg.setObjectProperty("test", "value"); assertFalse(msg.isReadOnlyProperties()); } @Test public void testClearPropertiesClearsFacadeGroupSequence() throws JMSException { JmsMessageFacade facade = Mockito.mock(JmsMessageFacade.class); JmsMessage msg = new JmsMessage(facade); msg.clearProperties(); Mockito.verify(facade).setGroupSequence(0); } @Test public void testPropertyExists() throws JMSException { JmsMessage msg = factory.createMessage(); msg.setStringProperty("test", "test"); assertTrue(msg.propertyExists("test")); msg.setIntProperty("JMSXDeliveryCount", 1); assertTrue(msg.propertyExists("JMSXDeliveryCount")); } @Test public void testPropertyExistsWithInvalidName() throws JMSException { doPropertyExistsWithInvalidNameTestImpl(false); } private void doPropertyExistsWithInvalidNameTestImpl(boolean disableValidation) throws JMSException { String invalidPropName = "my-invalid-property"; String valueA = "valueA"; JmsMessage msg = factory.createMessage(); if(disableValidation) { msg.setValidatePropertyNames(false); } assertTrue(msg.getFacade() instanceof JmsTestMessageFacade); JmsTestMessageFacade testFacade = (JmsTestMessageFacade) msg.getFacade(); assertFalse(testFacade.propertyExists(invalidPropName)); testFacade.setProperty(invalidPropName, valueA); assertTrue(testFacade.propertyExists(invalidPropName)); if(!disableValidation) { assertFalse("Property should be indicated to not exist", msg.propertyExists(invalidPropName)); } else { assertTrue("Property should be indicated to exist", msg.propertyExists(invalidPropName)); } } @Test public void testGetBooleanProperty() throws JMSException { JmsMessage msg = factory.createMessage(); String name = "booleanProperty"; msg.setBooleanProperty(name, true); assertTrue(msg.getBooleanProperty(name)); } @Test public void testGetByteProperty() throws JMSException { JmsMessage msg = factory.createMessage(); String name = "byteProperty"; msg.setByteProperty(name, (byte) 1); assertTrue(msg.getByteProperty(name) == 1); } @Test public void testGetShortProperty() throws JMSException { JmsMessage msg = factory.createMessage(); String name = "shortProperty"; msg.setShortProperty(name, (short) 1); assertTrue(msg.getShortProperty(name) == 1); } @Test public void testGetIntProperty() throws JMSException { JmsMessage msg = factory.createMessage(); String name = "intProperty"; msg.setIntProperty(name, 1); assertTrue(msg.getIntProperty(name) == 1); } @Test public void testGetLongProperty() throws JMSException { JmsMessage msg = factory.createMessage(); String name = "longProperty"; msg.setLongProperty(name, 1); assertTrue(msg.getLongProperty(name) == 1); } @Test public void testGetFloatProperty() throws JMSException { JmsMessage msg = factory.createMessage(); String name = "floatProperty"; msg.setFloatProperty(name, 1.3f); assertTrue(msg.getFloatProperty(name) == 1.3f); } @Test public void testGetDoubleProperty() throws JMSException { JmsMessage msg = factory.createMessage(); String name = "doubleProperty"; msg.setDoubleProperty(name, 1.3d); assertTrue(msg.getDoubleProperty(name) == 1.3); } @Test public void testGetStringProperty() throws JMSException { JmsMessage msg = factory.createMessage(); String name = "stringProperty"; msg.setStringProperty(name, name); assertTrue(msg.getStringProperty(name).equals(name)); } @Test public void testGetObjectProperty() throws JMSException { JmsMessage msg = factory.createMessage(); String name = "floatProperty"; msg.setFloatProperty(name, 1.3f); assertTrue(msg.getObjectProperty(name) instanceof Float); assertTrue(((Float) msg.getObjectProperty(name)).floatValue() == 1.3f); } @Test public void testGetObjectPropertyWithInvalidNameThrowsIAEByDefault() throws JMSException { doGetObjectPropertyNameValidationTestImpl(false); } private void doGetObjectPropertyNameValidationTestImpl(boolean disableValidation) throws JMSException { String invalidPropName1 = "my-invalid-property"; String valueA = "valueA"; JmsMessage msg = factory.createMessage(); if(disableValidation) { msg.setValidatePropertyNames(false); } assertTrue(msg.getFacade() instanceof JmsTestMessageFacade); JmsTestMessageFacade testFacade = (JmsTestMessageFacade) msg.getFacade(); assertNull(testFacade.getProperty(invalidPropName1)); testFacade.setProperty(invalidPropName1, valueA); assertEquals(valueA, testFacade.getProperty(invalidPropName1)); if (!disableValidation) { try { msg.getObjectProperty(invalidPropName1); fail("expected rejection of identifier"); } catch (IllegalArgumentException iae) { //expected } } else { assertEquals(valueA, msg.getObjectProperty(invalidPropName1)); } } @Test public void testGetPropertyNames() throws JMSException { JmsMessage msg = factory.createMessage(); String propName = "floatProperty"; msg.setFloatProperty(propName, 1.3f); String jmsxName = "JMSXDeliveryCount"; msg.setIntProperty(jmsxName, 1); String headerName = "JMSRedelivered"; msg.setBooleanProperty(headerName, false); boolean propNameFound = false; boolean jmsxNameFound = false; boolean headerNameFound1 = false; for (Enumeration<?> iter = msg.getPropertyNames(); iter.hasMoreElements();) { Object element = iter.nextElement(); propNameFound |= element.equals(propName); jmsxNameFound |= element.equals(jmsxName); headerNameFound1 |= element.equals(headerName); } assertTrue("prop name not found", propNameFound); assertTrue("jmsx prop name not found", jmsxNameFound); // spec compliance, only non-'JMS header' props returned assertFalse("header name should not have been found", headerNameFound1); } @Test public void testGetPropertyNamesReturnsValidNamesByDefault() throws JMSException { doGetPropertyNamesResultFilteringTestImpl(false); } private void doGetPropertyNamesResultFilteringTestImpl(boolean disableValidation) throws JMSException { String invalidPropName1 = "my-invalid-property1"; String invalidPropName2 = "my.invalid.property2"; String validPropName = "my_valid_property"; String valueA = "valueA"; String valueB = "valueB"; String valueC = "valueC"; JmsMessage msg = factory.createMessage(); if(disableValidation) { msg.setValidatePropertyNames(false); } assertTrue(msg.getFacade() instanceof JmsTestMessageFacade); JmsTestMessageFacade testFacade = (JmsTestMessageFacade) msg.getFacade(); assertNull(testFacade.getProperty(invalidPropName1)); assertNull(testFacade.getProperty(invalidPropName2)); assertNull(testFacade.getProperty(validPropName)); testFacade.setProperty(invalidPropName1, valueA); testFacade.setProperty(invalidPropName2, valueB); testFacade.setProperty(validPropName, valueC); assertEquals(valueA, testFacade.getProperty(invalidPropName1)); assertEquals(valueB, testFacade.getProperty(invalidPropName2)); assertEquals(valueC, testFacade.getProperty(validPropName)); boolean invalidPropName1Found = false; boolean invalidPropName2Found = false; boolean validPropNameFound = false; for (Enumeration<?> iter = msg.getPropertyNames(); iter.hasMoreElements();) { Object element = iter.nextElement(); invalidPropName1Found |= element.equals(invalidPropName1); invalidPropName2Found |= element.equals(invalidPropName2); validPropNameFound |= element.equals(validPropName); } if (!disableValidation) { assertFalse("Invalid prop name 1 was found", invalidPropName1Found); assertFalse("Invalid prop name 2 was found", invalidPropName2Found); } else { assertTrue("Invalid prop name 1 was not found", invalidPropName1Found); assertTrue("Invalid prop name 2 was not found", invalidPropName2Found); } assertTrue("valid prop name was not found", validPropNameFound); } @Test @SuppressWarnings("rawtypes") public void testGetAllPropertyNames() throws JMSException { JmsMessage msg = factory.createMessage(); String name1 = "floatProperty"; msg.setFloatProperty(name1, 1.3f); String name2 = "JMSXDeliveryCount"; msg.setIntProperty(name2, 1); String name3 = "JMSRedelivered"; msg.setBooleanProperty(name3, false); boolean found1 = false; boolean found2 = false; boolean found3 = false; for (Enumeration iter = msg.getAllPropertyNames(); iter.hasMoreElements();) { Object element = iter.nextElement(); found1 |= element.equals(name1); found2 |= element.equals(name2); found3 |= element.equals(name3); } assertTrue("prop name1 found", found1); assertTrue("prop name2 found", found2); assertTrue("prop name4 found", found3); } @Test public void testSetObjectProperty() throws JMSException { JmsMessage msg = factory.createMessage(); String name = "property"; try { msg.setObjectProperty(name, "string"); msg.setObjectProperty(name, Byte.valueOf("1")); msg.setObjectProperty(name, Short.valueOf("1")); msg.setObjectProperty(name, Integer.valueOf("1")); msg.setObjectProperty(name, Long.valueOf("1")); msg.setObjectProperty(name, Float.valueOf("1.1f")); msg.setObjectProperty(name, Double.valueOf("1.1")); msg.setObjectProperty(name, Boolean.TRUE); msg.setObjectProperty(name, null); } catch (MessageFormatException e) { fail("should accept object primitives and String"); } try { msg.setObjectProperty(name, new byte[5]); fail("should accept only object primitives and String"); } catch (MessageFormatException e) { } try { msg.setObjectProperty(name, new Object()); fail("should accept only object primitives and String"); } catch (MessageFormatException e) { } } @Test public void testConvertProperties() throws Exception { JmsMessage msg = factory.createMessage(); msg.setStringProperty("stringProperty", "string"); msg.setByteProperty("byteProperty", Byte.valueOf("1")); msg.setShortProperty("shortProperty", Short.valueOf("1")); msg.setIntProperty("intProperty", Integer.valueOf("1")); msg.setLongProperty("longProperty", Long.valueOf("1")); msg.setFloatProperty("floatProperty", Float.valueOf("1.1f")); msg.setDoubleProperty("doubleProperty", Double.valueOf("1.1")); msg.setBooleanProperty("booleanProperty", Boolean.TRUE); msg.setObjectProperty("nullProperty", null); assertEquals(msg.getFacade().getProperty("stringProperty"), "string"); assertEquals(((Byte) msg.getFacade().getProperty("byteProperty")).byteValue(), 1); assertEquals(((Short) msg.getFacade().getProperty("shortProperty")).shortValue(), 1); assertEquals(((Integer) msg.getFacade().getProperty("intProperty")).intValue(), 1); assertEquals(((Long) msg.getFacade().getProperty("longProperty")).longValue(), 1); assertEquals(((Float) msg.getFacade().getProperty("floatProperty")).floatValue(), 1.1f, 0); assertEquals(((Double) msg.getFacade().getProperty("doubleProperty")).doubleValue(), 1.1, 0); assertEquals(((Boolean) msg.getFacade().getProperty("booleanProperty")).booleanValue(), true); assertNull(msg.getFacade().getProperty("nullProperty")); } @Test public void testSetNullProperty() throws JMSException { Message msg = factory.createMessage(); String name = "cheese"; msg.setStringProperty(name, "Cheddar"); assertEquals("Cheddar", msg.getStringProperty(name)); msg.setStringProperty(name, null); assertEquals(null, msg.getStringProperty(name)); } @Test public void testSetNullPropertyName() throws JMSException { JmsMessage msg = factory.createMessage(); try { msg.setStringProperty(null, "Cheese"); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { LOG.info("Worked, caught: " + e); } } @Test public void testSetEmptyPropertyName() throws JMSException { JmsMessage msg = factory.createMessage(); try { msg.setStringProperty("", "Cheese"); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { LOG.info("Worked, caught: " + e); } } @Test public void testGetAndSetJMSXDeliveryCount() throws JMSException { JmsMessage msg = factory.createMessage(); msg.setIntProperty("JMSXDeliveryCount", 1); int count = msg.getIntProperty("JMSXDeliveryCount"); assertTrue("expected delivery count = 1 - got: " + count, count == 1); } @Test public void testClearBody() throws JMSException { JmsBytesMessage message = factory.createBytesMessage(); message.clearBody(); assertFalse(message.isReadOnlyBody()); message.reset(); assertEquals(0, message.getBodyLength()); } @Test public void testBooleanPropertyConversion() throws JMSException { JmsMessage msg = factory.createMessage(); String propertyName = "property"; msg.setBooleanProperty(propertyName, true); assertEquals(((Boolean) msg.getObjectProperty(propertyName)).booleanValue(), true); assertTrue(msg.getBooleanProperty(propertyName)); assertEquals(msg.getStringProperty(propertyName), "true"); try { msg.getByteProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getShortProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getIntProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getLongProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getFloatProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getDoubleProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } } @Test public void testBytePropertyConversion() throws JMSException { JmsMessage msg = factory.createMessage(); String propertyName = "property"; msg.setByteProperty(propertyName, (byte) 1); assertEquals(((Byte) msg.getObjectProperty(propertyName)).byteValue(), 1); assertEquals(msg.getByteProperty(propertyName), 1); assertEquals(msg.getShortProperty(propertyName), 1); assertEquals(msg.getIntProperty(propertyName), 1); assertEquals(msg.getLongProperty(propertyName), 1); assertEquals(msg.getStringProperty(propertyName), "1"); try { msg.getBooleanProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getFloatProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getDoubleProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } } @Test public void testShortPropertyConversion() throws JMSException { JmsMessage msg = factory.createMessage(); String propertyName = "property"; msg.setShortProperty(propertyName, (short) 1); assertEquals(((Short) msg.getObjectProperty(propertyName)).shortValue(), 1); assertEquals(msg.getShortProperty(propertyName), 1); assertEquals(msg.getIntProperty(propertyName), 1); assertEquals(msg.getLongProperty(propertyName), 1); assertEquals(msg.getStringProperty(propertyName), "1"); try { msg.getBooleanProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getByteProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getFloatProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getDoubleProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } } @Test public void testIntPropertyConversion() throws JMSException { JmsMessage msg = factory.createMessage(); String propertyName = "property"; msg.setIntProperty(propertyName, 1); assertEquals(((Integer) msg.getObjectProperty(propertyName)).intValue(), 1); assertEquals(msg.getIntProperty(propertyName), 1); assertEquals(msg.getLongProperty(propertyName), 1); assertEquals(msg.getStringProperty(propertyName), "1"); try { msg.getBooleanProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getByteProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getShortProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getFloatProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getDoubleProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } } @Test public void testLongPropertyConversion() throws JMSException { JmsMessage msg = factory.createMessage(); String propertyName = "property"; msg.setLongProperty(propertyName, 1); assertEquals(((Long) msg.getObjectProperty(propertyName)).longValue(), 1); assertEquals(msg.getLongProperty(propertyName), 1); assertEquals(msg.getStringProperty(propertyName), "1"); try { msg.getBooleanProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getByteProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getShortProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getIntProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getFloatProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getDoubleProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } } @Test public void testFloatPropertyConversion() throws JMSException { JmsMessage msg = factory.createMessage(); String propertyName = "property"; msg.setFloatProperty(propertyName, (float) 1.5); assertEquals(((Float) msg.getObjectProperty(propertyName)).floatValue(), 1.5, 0); assertEquals(msg.getFloatProperty(propertyName), 1.5, 0); assertEquals(msg.getDoubleProperty(propertyName), 1.5, 0); assertEquals(msg.getStringProperty(propertyName), "1.5"); try { msg.getBooleanProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getByteProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getShortProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getIntProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getLongProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } } @Test public void testDoublePropertyConversion() throws JMSException { JmsMessage msg = factory.createMessage(); String propertyName = "property"; msg.setDoubleProperty(propertyName, 1.5); assertEquals(((Double) msg.getObjectProperty(propertyName)).doubleValue(), 1.5, 0); assertEquals(msg.getDoubleProperty(propertyName), 1.5, 0); assertEquals(msg.getStringProperty(propertyName), "1.5"); try { msg.getBooleanProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getByteProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getShortProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getIntProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getLongProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getFloatProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } } @Test public void testStringPropertyConversion() throws JMSException { JmsMessage msg = factory.createMessage(); String propertyName = "property"; String stringValue = "true"; msg.setStringProperty(propertyName, stringValue); assertEquals(msg.getStringProperty(propertyName), stringValue); assertEquals(msg.getObjectProperty(propertyName), stringValue); assertEquals(msg.getBooleanProperty(propertyName), true); stringValue = "1"; msg.setStringProperty(propertyName, stringValue); assertEquals(msg.getByteProperty(propertyName), 1); assertEquals(msg.getShortProperty(propertyName), 1); assertEquals(msg.getIntProperty(propertyName), 1); assertEquals(msg.getLongProperty(propertyName), 1); stringValue = "1.5"; msg.setStringProperty(propertyName, stringValue); assertEquals(msg.getFloatProperty(propertyName), 1.5, 0); assertEquals(msg.getDoubleProperty(propertyName), 1.5, 0); stringValue = "bad"; msg.setStringProperty(propertyName, stringValue); try { msg.getByteProperty(propertyName); fail("Should have thrown exception"); } catch (NumberFormatException e) { } try { msg.getShortProperty(propertyName); fail("Should have thrown exception"); } catch (NumberFormatException e) { } try { msg.getIntProperty(propertyName); fail("Should have thrown exception"); } catch (NumberFormatException e) { } try { msg.getLongProperty(propertyName); fail("Should have thrown exception"); } catch (NumberFormatException e) { } try { msg.getFloatProperty(propertyName); fail("Should have thrown exception"); } catch (NumberFormatException e) { } try { msg.getDoubleProperty(propertyName); fail("Should have thrown exception"); } catch (NumberFormatException e) { } assertFalse(msg.getBooleanProperty(propertyName)); } @Test public void testObjectPropertyConversion() throws JMSException { JmsMessage msg = factory.createMessage(); String propertyName = "property"; Object obj = new Object(); msg.getFacade().setProperty(propertyName, obj); try { msg.getObjectProperty(null); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { } try { msg.getStringProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getBooleanProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getByteProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getShortProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getIntProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getLongProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getFloatProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } try { msg.getDoubleProperty(propertyName); fail("Should have thrown exception"); } catch (MessageFormatException e) { } } @Test public void testReadOnlyProperties() throws JMSException { JmsMessage msg = factory.createMessage(); String propertyName = "property"; msg.setReadOnlyProperties(true); try { msg.setObjectProperty(propertyName, new Object()); fail("Should have thrown exception"); } catch (MessageNotWriteableException e) { } try { msg.setStringProperty(propertyName, "test"); fail("Should have thrown exception"); } catch (MessageNotWriteableException e) { } try { msg.setBooleanProperty(propertyName, true); fail("Should have thrown exception"); } catch (MessageNotWriteableException e) { } try { msg.setByteProperty(propertyName, (byte) 1); fail("Should have thrown exception"); } catch (MessageNotWriteableException e) { } try { msg.setShortProperty(propertyName, (short) 1); fail("Should have thrown exception"); } catch (MessageNotWriteableException e) { } try { msg.setIntProperty(propertyName, 1); fail("Should have thrown exception"); } catch (MessageNotWriteableException e) { } try { msg.setLongProperty(propertyName, 1); fail("Should have thrown exception"); } catch (MessageNotWriteableException e) { } try { msg.setFloatProperty(propertyName, (float) 1.5); fail("Should have thrown exception"); } catch (MessageNotWriteableException e) { } try { msg.setDoubleProperty(propertyName, 1.5); fail("Should have thrown exception"); } catch (MessageNotWriteableException e) { } } @Test public void testAcknowledgeWithNoCallbackDoesNotThrow() throws JMSException { JmsMessage msg = factory.createMessage(); msg.acknowledge(); } //---- Test that message property getters throw expected exceptions ------// /** * When a property is not set, the behaviour of JMS specifies that it is equivalent to a null value, * and the primitive property accessors should behave in the same fashion as <primitive>.valueOf(String). * Test that this is the case. * * @throws Exception if an error occurs during the test. */ @Test public void testGetMissingPrimitivePropertyResultsInExpectedBehaviour() throws Exception { String propertyName = "does_not_exist"; JmsMessage testMessage = factory.createMessage(); //expect false from Boolean.valueOf(null). assertFalse(testMessage.getBooleanProperty(propertyName)); //expect an NFE from the primitive integral <type>.valueOf(null) conversions assertGetMissingPropertyThrowsNumberFormatException(testMessage, propertyName, Byte.class); assertGetMissingPropertyThrowsNumberFormatException(testMessage, propertyName, Short.class); assertGetMissingPropertyThrowsNumberFormatException(testMessage, propertyName, Integer.class); assertGetMissingPropertyThrowsNumberFormatException(testMessage, propertyName, Long.class); // expect an NPE from the primitive floating point .valueOf(null) // conversions try { testMessage.getFloatProperty(propertyName); fail("expected NPE from Float.valueOf(null) was not thrown"); } catch (NullPointerException npe) { } try { testMessage.getDoubleProperty(propertyName); fail("expected NPE from Double.valueOf(null) was not thrown"); } catch (NullPointerException npe) { } } //---------- Test Message Properties enforce compliant names -------------// /** * Property 'identifiers' (i.e. names) must begin with a letter for which * {@link Character#isJavaLetter(char)} is true, as described in * {@link javax.jms.Message}. Verify an IAE is thrown if setting a property * beginning with a non-letter character. * * @throws Exception if an error occurs during the test. */ @Test public void testSetPropertyWithNonLetterAsFirstCharacterThrowsIAE() throws Exception { String propertyName = "1name"; JmsMessage testMessage = factory.createMessage(); try { testMessage.setObjectProperty(propertyName, "value"); fail("expected rejection of identifier starting with non-letter character"); } catch (IllegalArgumentException iae) { } } /** * Property 'identifiers' (i.e. names) must continue with a letter or digit * for which {@link Character#isJavaLetterOrDigit(char)} is true, as * described in {@link javax.jms.Message}. Verify an IAE is thrown if * setting a property continuing with a non-letter-or-digit character. * * @throws Exception if an error occurs during the test. */ @Test public void testSetPropertyWithNonLetterOrDigitCharacterThrowsIAE() throws Exception { doSetObjectPropertyWithNonLetterOrDigitCharacterTestImpl(false); } private void doSetObjectPropertyWithNonLetterOrDigitCharacterTestImpl(boolean disableValidation) throws JMSException { String invalidPropertyName = "name-invalid"; String valueA = "value"; JmsMessage msg = factory.createMessage(); if(disableValidation) { msg.setValidatePropertyNames(false); } assertTrue(msg.getFacade() instanceof JmsTestMessageFacade); JmsTestMessageFacade testFacade = (JmsTestMessageFacade) msg.getFacade(); if (!disableValidation) { try { msg.setObjectProperty(invalidPropertyName, valueA); fail("expected rejection of identifier starting with non-letter character"); } catch (IllegalArgumentException iae) { // Expected } } else { msg.setObjectProperty(invalidPropertyName, valueA); assertEquals(valueA, testFacade.getProperty(invalidPropertyName)); } } /** * Property 'identifiers' (i.e. names) are not allowed to be NULL, TRUE, or * FALSE, as described in {@link javax.jms.Message}. Verify an IAE is thrown * if setting a property with these values. * * @throws Exception if an error occurs during the test. */ @Test public void testSetPropertyWithNameNULL() throws Exception { JmsMessage testMessage = factory.createMessage(); try { testMessage.setObjectProperty("NULL", "value"); fail("expected rejection of identifier named NULL"); } catch (IllegalArgumentException iae) { } } /** * Property 'identifiers' (i.e. names) are not allowed to be NULL, TRUE, or * FALSE, as described in {@link javax.jms.Message}. Verify an IAE is thrown * if setting a property with these values. * * @throws Exception if an error occurs during the test. */ @Test public void testSetPropertyWithNameTRUE() throws Exception { JmsMessage testMessage = factory.createMessage(); try { testMessage.setObjectProperty("TRUE", "value"); fail("expected rejection of identifier named TRUE"); } catch (IllegalArgumentException iae) { } } /** * Property 'identifiers' (i.e. names) are not allowed to be NULL, TRUE, or * FALSE, as described in {@link javax.jms.Message}. Verify an IAE is thrown * if setting a property with these values. * * @throws Exception if an error occurs during the test. */ @Test public void testSetPropertyWithNameFALSE() throws Exception { JmsMessage testMessage = factory.createMessage(); try { testMessage.setObjectProperty("FALSE", "value"); fail("expected rejection of identifier named FALSE"); } catch (IllegalArgumentException iae) { } } /** * Property 'identifiers' (i.e. names) are not allowed to be NOT, AND, OR, * BETWEEN, LIKE, IN, IS, or ESCAPE, as described in * {@link javax.jms.Message}. Verify an IAE is thrown if setting a property * with these values. * * @throws Exception if an error occurs during the test. */ @Test public void testSetPropertyWithNameNOT() throws Exception { JmsMessage testMessage = factory.createMessage(); try { testMessage.setObjectProperty("NOT", "value"); fail("expected rejection of identifier named NOT"); } catch (IllegalArgumentException iae) { } } /** * Property 'identifiers' (i.e. names) are not allowed to be NOT, AND, OR, * BETWEEN, LIKE, IN, IS, or ESCAPE, as described in * {@link javax.jms.Message}. Verify an IAE is thrown if setting a property * with these values. * * @throws Exception if an error occurs during the test. */ @Test public void testSetPropertyWithNameAND() throws Exception { JmsMessage testMessage = factory.createMessage(); try { testMessage.setObjectProperty("AND", "value"); fail("expected rejection of identifier named AND"); } catch (IllegalArgumentException iae) { } } /** * Property 'identifiers' (i.e. names) are not allowed to be NOT, AND, OR, * BETWEEN, LIKE, IN, IS, or ESCAPE, as described in * {@link javax.jms.Message}. Verify an IAE is thrown if setting a property * with these values. * * @throws Exception if an error occurs during the test. */ @Test public void testSetPropertyWithNameOR() throws Exception { JmsMessage testMessage = factory.createMessage(); try { testMessage.setObjectProperty("OR", "value"); fail("expected rejection of identifier named OR"); } catch (IllegalArgumentException iae) { } } /** * Property 'identifiers' (i.e. names) are not allowed to be NOT, AND, OR, * BETWEEN, LIKE, IN, IS, or ESCAPE, as described in * {@link javax.jms.Message}. Verify an IAE is thrown if setting a property * with these values. * * @throws Exception if an error occurs during the test. */ @Test public void testSetPropertyWithNameBETWEEN() throws Exception { JmsMessage testMessage = factory.createMessage(); try { testMessage.setObjectProperty("BETWEEN", "value"); fail("expected rejection of identifier named BETWEEN"); } catch (IllegalArgumentException iae) { } } /** * Property 'identifiers' (i.e. names) are not allowed to be NOT, AND, OR, * BETWEEN, LIKE, IN, IS, or ESCAPE, as described in * {@link javax.jms.Message}. Verify an IAE is thrown if setting a property * with these values. * * @throws Exception if an error occurs during the test. */ @Test public void testSetPropertyWithNameLIKE() throws Exception { JmsMessage testMessage = factory.createMessage(); try { testMessage.setObjectProperty("LIKE", "value"); fail("expected rejection of identifier named LIKE"); } catch (IllegalArgumentException iae) { } } /** * Property 'identifiers' (i.e. names) are not allowed to be NOT, AND, OR, * BETWEEN, LIKE, IN, IS, or ESCAPE, as described in * {@link javax.jms.Message}. Verify an IAE is thrown if setting a property * with these values. * * @throws Exception if an error occurs during the test. */ @Test public void testSetPropertyWithNameIN() throws Exception { JmsMessage testMessage = factory.createMessage(); try { testMessage.setObjectProperty("IN", "value"); fail("expected rejection of identifier named IN"); } catch (IllegalArgumentException iae) { } } /** * Property 'identifiers' (i.e. names) are not allowed to be NOT, AND, OR, * BETWEEN, LIKE, IN, IS, or ESCAPE, as described in * {@link javax.jms.Message}. Verify an IAE is thrown if setting a property * with these values. * * @throws Exception if an error occurs during the test. */ @Test public void testSetPropertyWithNameIS() throws Exception { JmsMessage testMessage = factory.createMessage(); try { testMessage.setObjectProperty("IS", "value"); fail("expected rejection of identifier named IS"); } catch (IllegalArgumentException iae) { } } /** * Property 'identifiers' (i.e. names) are not allowed to be NOT, AND, OR, * BETWEEN, LIKE, IN, IS, or ESCAPE, as described in * {@link javax.jms.Message}. Verify an IAE is thrown if setting a property * with these values. * * @throws Exception if an error occurs during the test. */ @Test public void testSetPropertyWithNameESCAPE() throws Exception { JmsMessage testMessage = factory.createMessage(); try { testMessage.setObjectProperty("ESCAPE", "value"); fail("expected rejection of identifier named ESCAPE"); } catch (IllegalArgumentException iae) { } } //---------- Test disabling Message Properties name validation -------------// @Test public void testGetPropertyNamesReturnsAllNamesWithValidationDisabled() throws JMSException { doGetPropertyNamesResultFilteringTestImpl(true); } @Test public void testGetObjectPropertyWithInvalidNameAndValidationDisabled() throws JMSException { doGetObjectPropertyNameValidationTestImpl(true); } @Test public void testSetObjectPropertyWithInvalidNameAndValidationDisabled() throws Exception { doSetObjectPropertyWithNonLetterOrDigitCharacterTestImpl(true); } @Test public void testPropertyExistsWithInvalidNameAndValidationDisabled() throws JMSException { doPropertyExistsWithInvalidNameTestImpl(true); } //---------- Test ack type modifier property -------------// /** * Basic test that the JMS_AMQP_ACK_TYPE property is intercepted and has * effect on messages with an acknowledgement callback. More detailed tests * of usage and effect of this property is performed elsewhere. * * @throws Exception if an error occurs during the test. */ @Test public void testSetPropertyJMS_AMQP_ACK_TYPE() throws Exception { JmsMessage message = factory.createMessage(); JmsSession session = Mockito.mock(JmsSession.class); JmsAcknowledgeCallback callback = new JmsAcknowledgeCallback(session); message.setAcknowledgeCallback(callback); assertEquals("Unexpected ack type value", ACCEPTED, callback.getAckType()); message.setIntProperty(JMS_AMQP_ACK_TYPE, RELEASED); assertEquals("Unexpected ack type value after setting prop", RELEASED, callback.getAckType()); } //--------- Test isBodyAssignableTo method -------------------------------// @Test public void testMessageIsBodyAssignableTo() throws Exception { Message message = factory.createMessage(); assertTrue(message.isBodyAssignableTo(String.class)); assertTrue(message.isBodyAssignableTo(Boolean.class)); assertTrue(message.isBodyAssignableTo(Object.class)); assertTrue(message.isBodyAssignableTo(Map.class)); } @Test public void testTextMessageIsBodyAssignableTo() throws Exception { JmsTextMessage message = factory.createTextMessage(); assertTrue(message.isBodyAssignableTo(String.class)); assertTrue(message.isBodyAssignableTo(Boolean.class)); assertTrue(message.isBodyAssignableTo(Map.class)); assertTrue(message.isBodyAssignableTo(Object.class)); message.setText("test"); assertTrue(message.isBodyAssignableTo(String.class)); assertFalse(message.isBodyAssignableTo(Boolean.class)); assertFalse(message.isBodyAssignableTo(Map.class)); assertTrue(message.isBodyAssignableTo(Object.class)); } @Test public void testStreamMessageIsBodyAssignableTo() throws Exception { JmsStreamMessage message = factory.createStreamMessage(); assertFalse(message.isBodyAssignableTo(String.class)); assertFalse(message.isBodyAssignableTo(Boolean.class)); assertFalse(message.isBodyAssignableTo(Map.class)); assertFalse(message.isBodyAssignableTo(Object.class)); message.writeBoolean(false); assertFalse(message.isBodyAssignableTo(String.class)); assertFalse(message.isBodyAssignableTo(Boolean.class)); assertFalse(message.isBodyAssignableTo(Map.class)); assertFalse(message.isBodyAssignableTo(Object.class)); } @Test public void testMapMessageIsBodyAssignableTo() throws Exception { JmsMapMessage message = factory.createMapMessage(); assertTrue(message.isBodyAssignableTo(String.class)); assertTrue(message.isBodyAssignableTo(Boolean.class)); assertTrue(message.isBodyAssignableTo(Map.class)); assertTrue(message.isBodyAssignableTo(Object.class)); message.setBoolean("Boolean", true); assertFalse(message.isBodyAssignableTo(String.class)); assertFalse(message.isBodyAssignableTo(Boolean.class)); assertTrue(message.isBodyAssignableTo(Map.class)); assertTrue(message.isBodyAssignableTo(Object.class)); } @Test public void testBytesMessageIsBodyAssignableTo() throws Exception { JmsBytesMessage message = factory.createBytesMessage(); assertTrue(message.isBodyAssignableTo(byte[].class)); assertTrue(message.isBodyAssignableTo(Boolean.class)); assertTrue(message.isBodyAssignableTo(Map.class)); assertTrue(message.isBodyAssignableTo(String.class)); assertTrue(message.isBodyAssignableTo(Object.class)); message.writeBoolean(false); // The message doesn't technically have a body until it is reset message.reset(); assertTrue(message.isBodyAssignableTo(byte[].class)); assertFalse(message.isBodyAssignableTo(Boolean.class)); assertFalse(message.isBodyAssignableTo(Map.class)); assertFalse(message.isBodyAssignableTo(String.class)); assertTrue(message.isBodyAssignableTo(Object.class)); } @Test public void testObjectMessageIsBodyAssignableTo() throws Exception { JmsObjectMessage message = factory.createObjectMessage(); assertTrue(message.isBodyAssignableTo(Boolean.class)); assertTrue(message.isBodyAssignableTo(Map.class)); assertTrue(message.isBodyAssignableTo(String.class)); assertTrue(message.isBodyAssignableTo(Serializable.class)); assertTrue(message.isBodyAssignableTo(Object.class)); message.setObject(UUID.randomUUID()); assertFalse(message.isBodyAssignableTo(Boolean.class)); assertFalse(message.isBodyAssignableTo(Map.class)); assertFalse(message.isBodyAssignableTo(String.class)); assertTrue(message.isBodyAssignableTo(Serializable.class)); assertTrue(message.isBodyAssignableTo(Object.class)); assertTrue(message.isBodyAssignableTo(UUID.class)); } //--------- Test for getBody method --------------------------------------// @Test public void testGetBodyOnMessage() throws Exception { Message message = factory.createMessage(); assertNull(message.getBody(String.class)); assertNull(message.getBody(Boolean.class)); assertNull(message.getBody(byte[].class)); assertNull(message.getBody(Object.class)); } @Test public void testGetBodyOnTextMessage() throws Exception { TextMessage message = factory.createTextMessage(); assertNull(message.getBody(String.class)); assertNull(message.getBody(Boolean.class)); assertNull(message.getBody(byte[].class)); assertNull(message.getBody(Object.class)); message.setText("test"); assertNotNull(message.getBody(String.class)); assertNotNull(message.getBody(Object.class)); try { message.getBody(Boolean.class); fail("Should have thrown an exception"); } catch (MessageFormatException mfe) { LOG.info("caught expected MessageFormatException"); } try { message.getBody(Map.class); fail("Should have thrown an exception"); } catch (MessageFormatException mfe) { LOG.info("caught expected MessageFormatException"); } try { message.getBody(byte[].class); fail("Should have thrown an exception"); } catch (MessageFormatException mfe) { LOG.info("caught expected MessageFormatException"); } } @Test public void testGetBodyOnMapMessage() throws Exception { MapMessage message = factory.createMapMessage(); assertNull(message.getBody(String.class)); assertNull(message.getBody(Boolean.class)); assertNull(message.getBody(byte[].class)); assertNull(message.getBody(Object.class)); message.setString("test", "test"); assertNotNull(message.getBody(Map.class)); assertNotNull(message.getBody(Object.class)); try { message.getBody(Boolean.class); fail("Should have thrown an exception"); } catch (MessageFormatException mfe) { LOG.info("caught expected MessageFormatException"); } try { message.getBody(String.class); fail("Should have thrown an exception"); } catch (MessageFormatException mfe) { LOG.info("caught expected MessageFormatException"); } try { message.getBody(byte[].class); fail("Should have thrown an exception"); } catch (MessageFormatException mfe) { LOG.info("caught expected MessageFormatException"); } } @Test public void testGetBodyOnObjectMessage() throws Exception { ObjectMessage message = factory.createObjectMessage(); assertNull(message.getBody(String.class)); assertNull(message.getBody(Boolean.class)); assertNull(message.getBody(byte[].class)); assertNull(message.getBody(Serializable.class)); assertNull(message.getBody(Object.class)); message.setObject(UUID.randomUUID()); assertNotNull(message.getBody(UUID.class)); assertNotNull(message.getBody(Serializable.class)); assertNotNull(message.getBody(Object.class)); try { message.getBody(Boolean.class); fail("Should have thrown an exception"); } catch (MessageFormatException mfe) { LOG.info("caught expected MessageFormatException"); } try { message.getBody(String.class); fail("Should have thrown an exception"); } catch (MessageFormatException mfe) { LOG.info("caught expected MessageFormatException"); } try { message.getBody(byte[].class); fail("Should have thrown an exception"); } catch (MessageFormatException mfe) { LOG.info("caught expected MessageFormatException"); } } @Test public void testGetBodyOnBytesMessage() throws Exception { BytesMessage message = factory.createBytesMessage(); assertNull(message.getBody(String.class)); assertNull(message.getBody(Boolean.class)); assertNull(message.getBody(byte[].class)); assertNull(message.getBody(Object.class)); message.clearBody(); message.writeUTF("test"); message.reset(); assertNotNull(message.getBody(byte[].class)); assertNotNull(message.getBody(Object.class)); try { message.getBody(Boolean.class); fail("Should have thrown an exception"); } catch (MessageFormatException mfe) { LOG.info("caught expected MessageFormatException"); } try { message.getBody(Map.class); fail("Should have thrown an exception"); } catch (MessageFormatException mfe) { LOG.info("caught expected MessageFormatException"); } try { message.getBody(String.class); fail("Should have thrown an exception"); } catch (MessageFormatException mfe) { LOG.info("caught expected MessageFormatException"); } } @Test public void testGetBodyOnStreamMessage() throws Exception { StreamMessage message = factory.createStreamMessage(); try { message.getBody(Object.class); fail("Should have thrown an exception"); } catch (MessageFormatException mfe) { LOG.info("caught expected MessageFormatException"); } try { message.getBody(Boolean.class); fail("Should have thrown an exception"); } catch (MessageFormatException mfe) { LOG.info("caught expected MessageFormatException"); } try { message.getBody(String.class); fail("Should have thrown an exception"); } catch (MessageFormatException mfe) { LOG.info("caught expected MessageFormatException"); } try { message.getBody(byte[].class); fail("Should have thrown an exception"); } catch (MessageFormatException mfe) { LOG.info("caught expected MessageFormatException"); } message.writeBoolean(false); try { message.getBody(Object.class); fail("Should have thrown an exception"); } catch (MessageFormatException mfe) { LOG.info("caught expected MessageFormatException"); } try { message.getBody(Boolean.class); fail("Should have thrown an exception"); } catch (MessageFormatException mfe) { LOG.info("caught expected MessageFormatException"); } try { message.getBody(String.class); fail("Should have thrown an exception"); } catch (MessageFormatException mfe) { LOG.info("caught expected MessageFormatException"); } try { message.getBody(byte[].class); fail("Should have thrown an exception"); } catch (MessageFormatException mfe) { LOG.info("caught expected MessageFormatException"); } } //--------- Test support method ------------------------------------------// private void assertGetMissingPropertyThrowsNumberFormatException(JmsMessage testMessage, String propertyName, Class<?> clazz) throws JMSException { try { getMessagePropertyUsingTypeMethod(testMessage, propertyName, clazz); fail("expected exception to be thrown"); } catch (NumberFormatException nfe) { } } private Object getMessagePropertyUsingTypeMethod(JmsMessage testMessage, String propertyName, Class<?> clazz) throws JMSException { if (clazz == Boolean.class) { return testMessage.getBooleanProperty(propertyName); } else if (clazz == Byte.class) { return testMessage.getByteProperty(propertyName); } else if (clazz == Short.class) { return testMessage.getShortProperty(propertyName); } else if (clazz == Integer.class) { return testMessage.getIntProperty(propertyName); } else if (clazz == Long.class) { return testMessage.getLongProperty(propertyName); } else if (clazz == Float.class) { return testMessage.getFloatProperty(propertyName); } else if (clazz == Double.class) { return testMessage.getDoubleProperty(propertyName); } else if (clazz == String.class) { return testMessage.getStringProperty(propertyName); } else { throw new RuntimeException("Unexpected property type class"); } } }