blob: e13337a2cd8216b55aed9e15c3f33c3f5f3927df [file] [log] [blame]
/*
* 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");
}
}
}