blob: 89bbdd6980177c988d160cad0ec36a8afcf8ab9f [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.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
import javax.jms.JMSException;
import javax.jms.MessageFormatException;
import javax.jms.MessageNotWriteableException;
import org.apache.qpid.jms.message.facade.JmsMapMessageFacade;
import org.apache.qpid.jms.message.facade.test.JmsTestMapMessageFacade;
import org.apache.qpid.jms.message.facade.test.JmsTestMessageFactory;
import org.junit.Test;
/**
* Test that the JMS level JmsMapMessage using a simple default message facade follows
* the JMS spec.
*/
public class JmsMapMessageTest {
private final JmsMessageFactory factory = new JmsTestMessageFactory();
// ======= general =========
@Test
public void testToString() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
assertTrue(mapMessage.toString().startsWith("JmsMapMessage"));
}
@Test
public void testGetMapNamesWithNewMessageToSendReturnsEmptyEnumeration() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
Enumeration<?> names = mapMessage.getMapNames();
assertFalse("Expected new message to have no map names", names.hasMoreElements());
}
/**
* Test that we are able to retrieve the names and values of map entries on a received
* message
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testGetMapNamesUsingReceivedMessageReturnsExpectedEnumeration() throws Exception {
JmsMapMessageFacade facade = new JmsTestMapMessageFacade();
String myKey1 = "key1";
String myKey2 = "key2";
facade.put(myKey1, "value1");
facade.put(myKey2, "value2");
JmsMapMessage mapMessage = new JmsMapMessage(facade);
Enumeration<?> names = mapMessage.getMapNames();
int count = 0;
List<Object> elements = new ArrayList<Object>();
while (names.hasMoreElements()) {
count++;
elements.add(names.nextElement());
}
assertEquals("expected 2 map keys in enumeration", 2, count);
assertTrue("expected key was not found: " + myKey1, elements.contains(myKey1));
assertTrue("expected key was not found: " + myKey2, elements.contains(myKey2));
}
/**
* Test that we enforce the requirement that map message key names not be null or the empty
* string.
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetObjectWithNullOrEmptyKeyNameThrowsIAE() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
try {
mapMessage.setObject(null, "value");
fail("Expected exception not thrown");
} catch (IllegalArgumentException iae) {
// expected
}
try {
mapMessage.setObject("", "value");
fail("Expected exception not thrown");
} catch (IllegalArgumentException iae) {
// expected
}
}
/**
* Test that we are not able to write to a received message without calling
* {@link JmsMapMessage#clearBody()}
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testReceivedMessageIsReadOnlyAndThrowsMNWE() throws Exception {
JmsMapMessageFacade facade = new JmsTestMapMessageFacade();
String myKey1 = "key1";
facade.put(myKey1, "value1");
JmsMapMessage mapMessage = new JmsMapMessage(facade);
mapMessage.onDispatch();
try {
mapMessage.setObject("name", "value");
fail("expected exception to be thrown");
} catch (MessageNotWriteableException mnwe) {
// expected
}
}
/**
* Test that calling {@link JmsMapMessage#clearBody()} makes a received message writable
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testClearBodyMakesReceivedMessageWritable() throws Exception {
JmsMapMessageFacade facade = new JmsTestMapMessageFacade();
String myKey1 = "key1";
facade.put(myKey1, "value1");
JmsMapMessage mapMessage = new JmsMapMessage(facade);
mapMessage.onDispatch();
assertTrue("expected message to be read-only", mapMessage.isReadOnlyBody());
mapMessage.clearBody();
assertFalse("expected message to be writable", mapMessage.isReadOnlyBody());
mapMessage.setObject("name", "value");
}
/**
* Test that calling {@link JmsMapMessage#clearBody()} clears the underlying message body
* map.
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testClearBodyClearsUnderlyingMessageMap() throws Exception {
JmsMapMessageFacade facade = new JmsTestMapMessageFacade();
String myKey1 = "key1";
facade.put(myKey1, "value1");
JmsMapMessage mapMessage = new JmsMapMessage(facade);
assertTrue("key should exist: " + myKey1, mapMessage.itemExists(myKey1));
mapMessage.clearBody();
assertFalse("key should not exist", mapMessage.itemExists(myKey1));
}
/**
* When a map entry is not set, the behaviour of JMS specifies that it is equivalent to a
* null value, and the accessors should either return null, throw NPE, or 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 testGetMissingMapEntryResultsInExpectedBehaviour() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "does_not_exist";
// expect null
assertNull(mapMessage.getBytes(name));
assertNull(mapMessage.getString(name));
// expect false from Boolean.valueOf(null).
assertFalse(mapMessage.getBoolean(name));
// expect an NFE from the primitive integral <type>.valueOf(null) conversions
assertGetMapEntryThrowsNumberFormatException(mapMessage, name, Byte.class);
assertGetMapEntryThrowsNumberFormatException(mapMessage, name, Short.class);
assertGetMapEntryThrowsNumberFormatException(mapMessage, name, Integer.class);
assertGetMapEntryThrowsNumberFormatException(mapMessage, name, Long.class);
// expect an NPE from the primitive float, double, and char <type>.valuleOf(null)
// conversions
assertGetMapEntryThrowsNullPointerException(mapMessage, name, Float.class);
assertGetMapEntryThrowsNullPointerException(mapMessage, name, Double.class);
assertGetMapEntryThrowsNullPointerException(mapMessage, name, Character.class);
}
// ======= object =========
/**
* Test that the {@link JmsMapMessage#setObject(String, Object)} method rejects Objects of
* unexpected types
*
* @throws Exception if an error occurs during the test.
*/
@Test(expected=MessageFormatException.class)
public void testSetObjectWithIllegalTypeThrowsMFE() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
mapMessage.setObject("myPKey", new Exception());
}
@Test
public void testSetGetObject() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String keyName = "myProperty";
Object entryValue = null;
mapMessage.setObject(keyName, entryValue);
assertEquals(entryValue, mapMessage.getObject(keyName));
entryValue = Boolean.valueOf(false);
mapMessage.setObject(keyName, entryValue);
assertEquals(entryValue, mapMessage.getObject(keyName));
entryValue = Byte.valueOf((byte) 1);
mapMessage.setObject(keyName, entryValue);
assertEquals(entryValue, mapMessage.getObject(keyName));
entryValue = Short.valueOf((short) 2);
mapMessage.setObject(keyName, entryValue);
assertEquals(entryValue, mapMessage.getObject(keyName));
entryValue = Integer.valueOf(3);
mapMessage.setObject(keyName, entryValue);
assertEquals(entryValue, mapMessage.getObject(keyName));
entryValue = Long.valueOf(4);
mapMessage.setObject(keyName, entryValue);
assertEquals(entryValue, mapMessage.getObject(keyName));
entryValue = Float.valueOf(5.01F);
mapMessage.setObject(keyName, entryValue);
assertEquals(entryValue, mapMessage.getObject(keyName));
entryValue = Double.valueOf(6.01);
mapMessage.setObject(keyName, entryValue);
assertEquals(entryValue, mapMessage.getObject(keyName));
entryValue = "string";
mapMessage.setObject(keyName, entryValue);
assertEquals(entryValue, mapMessage.getObject(keyName));
entryValue = Character.valueOf('c');
mapMessage.setObject(keyName, entryValue);
assertEquals(entryValue, mapMessage.getObject(keyName));
byte[] bytes = new byte[] { (byte) 1, (byte) 0, (byte) 1 };
mapMessage.setObject(keyName, bytes);
Object retrieved = mapMessage.getObject(keyName);
assertTrue(retrieved instanceof byte[]);
assertTrue(Arrays.equals(bytes, (byte[]) retrieved));
}
// ======= Strings =========
@Test
public void testSetGetString() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
// null value
String name = "myNullString";
String value = null;
assertFalse(mapMessage.itemExists(name));
mapMessage.setString(name, value);
assertTrue(mapMessage.itemExists(name));
assertEquals(value, mapMessage.getString(name));
// non-null value
name = "myName";
value = "myValue";
assertFalse(mapMessage.itemExists(name));
mapMessage.setString(name, value);
assertTrue(mapMessage.itemExists(name));
assertEquals(value, mapMessage.getString(name));
}
/**
* Set a String, then retrieve it as all of the legal type combinations to verify it is
* parsed correctly
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetStringGetLegal() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myStringName";
String value;
// boolean
value = "true";
mapMessage.setString(name, value);
assertGetMapEntryEquals(mapMessage, name, Boolean.valueOf(value), Boolean.class);
// byte
value = String.valueOf(Byte.MAX_VALUE);
mapMessage.setString(name, value);
assertGetMapEntryEquals(mapMessage, name, Byte.valueOf(value), Byte.class);
// short
value = String.valueOf(Short.MAX_VALUE);
mapMessage.setString(name, value);
assertGetMapEntryEquals(mapMessage, name, Short.valueOf(value), Short.class);
// int
value = String.valueOf(Integer.MAX_VALUE);
mapMessage.setString(name, value);
assertGetMapEntryEquals(mapMessage, name, Integer.valueOf(value), Integer.class);
// long
value = String.valueOf(Long.MAX_VALUE);
mapMessage.setString(name, value);
assertGetMapEntryEquals(mapMessage, name, Long.valueOf(value), Long.class);
// float
value = String.valueOf(Float.MAX_VALUE);
mapMessage.setString(name, value);
assertGetMapEntryEquals(mapMessage, name, Float.valueOf(value), Float.class);
// double
value = String.valueOf(Double.MAX_VALUE);
mapMessage.setString(name, value);
assertGetMapEntryEquals(mapMessage, name, Double.valueOf(value), Double.class);
}
/**
* Set a String, then retrieve it as all of the illegal type combinations to verify it fails
* as expected
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetStringGetIllegal() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
String value = "myStringValue";
mapMessage.setString(name, value);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, byte[].class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Character.class);
}
// ======= boolean =========
/**
* Set a boolean, then retrieve it as all of the legal type combinations to verify it is
* parsed correctly
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetBooleanGetLegal() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
boolean value = true;
mapMessage.setBoolean(name, value);
assertEquals("value not as expected", value, mapMessage.getBoolean(name));
assertGetMapEntryEquals(mapMessage, name, String.valueOf(value), String.class);
mapMessage.setBoolean(name, !value);
assertEquals("value not as expected", !value, mapMessage.getBoolean(name));
assertGetMapEntryEquals(mapMessage, name, String.valueOf(!value), String.class);
}
/**
* Set a boolean, then retrieve it as all of the illegal type combinations to verify it
* fails as expected
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetBooleanGetIllegal() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
boolean value = true;
mapMessage.setBoolean(name, value);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, byte[].class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Character.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Byte.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Short.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Integer.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Long.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Float.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Double.class);
}
// ======= byte =========
/**
* Set a byte, then retrieve it as all of the legal type combinations to verify it is parsed
* correctly
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetByteGetLegalProperty() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
byte value = (byte) 1;
mapMessage.setByte(name, value);
assertEquals(value, mapMessage.getByte(name));
assertGetMapEntryEquals(mapMessage, name, String.valueOf(value), String.class);
assertGetMapEntryEquals(mapMessage, name, Short.valueOf(value), Short.class);
assertGetMapEntryEquals(mapMessage, name, Integer.valueOf(value), Integer.class);
assertGetMapEntryEquals(mapMessage, name, Long.valueOf(value), Long.class);
}
/**
* Set a byte, then retrieve it as all of the illegal type combinations to verify it is
* fails as expected
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetByteGetIllegal() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
byte value = (byte) 1;
mapMessage.setByte(name, value);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, byte[].class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Character.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Boolean.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Float.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Double.class);
}
// ======= short =========
/**
* Set a short, then retrieve it as all of the legal type combinations to verify it is
* parsed correctly
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetShortGetLegal() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
short value = (short) 1;
mapMessage.setShort(name, value);
assertEquals(value, mapMessage.getShort(name));
assertGetMapEntryEquals(mapMessage, name, String.valueOf(value), String.class);
assertGetMapEntryEquals(mapMessage, name, Integer.valueOf(value), Integer.class);
assertGetMapEntryEquals(mapMessage, name, Long.valueOf(value), Long.class);
}
/**
* Set a short, then retrieve it as all of the illegal type combinations to verify it fails
* as expected
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetShortGetIllegal() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
short value = (short) 1;
mapMessage.setShort(name, value);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, byte[].class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Character.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Boolean.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Byte.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Float.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Double.class);
}
// ======= int =========
/**
* Set an int, then retrieve it as all of the legal type combinations to verify it is parsed
* correctly
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetIntGetLegal() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
int value = 1;
mapMessage.setInt(name, value);
assertEquals(value, mapMessage.getInt(name));
assertGetMapEntryEquals(mapMessage, name, String.valueOf(value), String.class);
assertGetMapEntryEquals(mapMessage, name, Long.valueOf(value), Long.class);
}
/**
* Set an int, then retrieve it as all of the illegal type combinations to verify it fails
* as expected
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetIntGetIllegal() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
int value = 1;
mapMessage.setInt(name, value);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, byte[].class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Character.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Boolean.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Byte.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Short.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Float.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Double.class);
}
// ======= long =========
/**
* Set a long, then retrieve it as all of the legal type combinations to verify it is parsed
* correctly
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetLongGetLegal() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
long value = Long.MAX_VALUE;
mapMessage.setLong(name, value);
assertEquals(value, mapMessage.getLong(name));
assertGetMapEntryEquals(mapMessage, name, String.valueOf(value), String.class);
}
/**
* Set an long, then retrieve it as all of the illegal type combinations to verify it fails
* as expected
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetLongGetIllegal() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
long value = Long.MAX_VALUE;
mapMessage.setLong(name, value);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, byte[].class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Character.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Boolean.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Byte.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Short.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Integer.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Float.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Double.class);
}
// ======= float =========
/**
* Set a float, then retrieve it as all of the legal type combinations to verify it is
* parsed correctly
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetFloatGetLegal() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
float value = Float.MAX_VALUE;
mapMessage.setFloat(name, value);
assertEquals(value, mapMessage.getFloat(name), 0.0);
assertGetMapEntryEquals(mapMessage, name, String.valueOf(value), String.class);
assertGetMapEntryEquals(mapMessage, name, Double.valueOf(value), Double.class);
}
/**
* Set a float, then retrieve it as all of the illegal type combinations to verify it fails
* as expected
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetFloatGetIllegal() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
float value = Float.MAX_VALUE;
mapMessage.setFloat(name, value);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, byte[].class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Character.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Boolean.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Byte.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Short.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Integer.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Long.class);
}
// ======= double =========
/**
* Set a double, then retrieve it as all of the legal type combinations to verify it is
* parsed correctly
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetDoubleGetLegal() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
double value = Double.MAX_VALUE;
mapMessage.setDouble(name, value);
assertEquals(value, mapMessage.getDouble(name), 0.0);
assertGetMapEntryEquals(mapMessage, name, String.valueOf(value), String.class);
}
/**
* Set a double, then retrieve it as all of the illegal type combinations to verify it fails
* as expected
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetDoubleGetIllegal() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
double value = Double.MAX_VALUE;
mapMessage.setDouble(name, value);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, byte[].class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Character.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Boolean.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Byte.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Short.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Integer.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Long.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Float.class);
}
// ======= character =========
/**
* Set a char, then retrieve it as all of the legal type combinations to verify it is parsed
* correctly
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetCharGetLegal() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
char value = 'c';
mapMessage.setChar(name, value);
assertEquals(value, mapMessage.getChar(name));
assertGetMapEntryEquals(mapMessage, name, String.valueOf(value), String.class);
}
/**
* Set a char, then retrieve it as all of the illegal type combinations to verify it fails
* as expected
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetCharGetIllegal() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
char value = 'c';
mapMessage.setChar(name, value);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, byte[].class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Boolean.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Byte.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Short.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Integer.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Long.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Float.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Double.class);
}
// ========= bytes ========
/**
* Set bytes, then retrieve it as all of the legal type combinations to verify it is parsed
* correctly
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetBytesGetLegal() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
byte[] value = "myBytes".getBytes();
mapMessage.setBytes(name, value);
assertTrue(Arrays.equals(value, mapMessage.getBytes(name)));
}
/**
* Set bytes, then retrieve it as all of the illegal type combinations to verify it fails as
* expected
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetBytesGetIllegal() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
byte[] value = "myBytes".getBytes();
mapMessage.setBytes(name, value);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Character.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, String.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Boolean.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Byte.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Short.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Integer.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Long.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Float.class);
assertGetMapEntryThrowsMessageFormatException(mapMessage, name, Double.class);
}
/**
* Verify that setting bytes takes a copy of the array. Set bytes, then modify them, then
* retrieve the map entry and verify the two differ.
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetBytesTakesSnapshot() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
byte[] orig = "myBytes".getBytes();
byte[] copy = Arrays.copyOf(orig, orig.length);
// set the original bytes
mapMessage.setBytes(name, orig);
// corrupt the original bytes
orig[0] = (byte) 0;
// verify retrieving the bytes still matches the copy but not the original array
byte[] retrieved = mapMessage.getBytes(name);
assertFalse(Arrays.equals(orig, retrieved));
assertTrue(Arrays.equals(copy, retrieved));
}
/**
* Verify that getting bytes returns a copy of the array. Set bytes, then get them, modify
* the retrieved value, then get them again and verify the two differ.
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testGetBytesReturnsSnapshot() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
byte[] orig = "myBytes".getBytes();
// set the original bytes
mapMessage.setBytes(name, orig);
// retrieve them
byte[] retrieved1 = mapMessage.getBytes(name);
;
// corrupt the retrieved bytes
retrieved1[0] = (byte) 0;
// verify retrieving the bytes again still matches the original array, but not the
// previously retrieved (and now corrupted) bytes.
byte[] retrieved2 = mapMessage.getBytes(name);
assertTrue(Arrays.equals(orig, retrieved2));
assertFalse(Arrays.equals(retrieved1, retrieved2));
}
/**
* Verify that setting bytes takes a copy of the array. Set bytes, then modify them, then
* retrieve the map entry and verify the two differ.
*
* @throws Exception if an error occurs during the test.
*/
@Test
public void testSetBytesWithOffsetAndLength() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
byte[] orig = "myBytesAll".getBytes();
// extract the segment containing 'Bytes'
int offset = 2;
int length = 5;
byte[] segment = Arrays.copyOfRange(orig, offset, offset + length);
// set the same section from the original bytes
mapMessage.setBytes(name, orig, offset, length);
// verify the retrieved bytes from the map match the segment but not the full original
// array
byte[] retrieved = mapMessage.getBytes(name);
assertFalse(Arrays.equals(orig, retrieved));
assertTrue(Arrays.equals(segment, retrieved));
}
@Test
public void testSetBytesWithNull() throws Exception {
JmsMapMessage mapMessage = factory.createMapMessage();
String name = "myName";
mapMessage.setBytes(name, null);
assertNull(mapMessage.getBytes(name));
}
// ========= utility methods ========
private void assertGetMapEntryEquals(JmsMapMessage testMessage, String name, Object expectedValue, Class<?> clazz) throws JMSException {
Object actualValue = getMapEntryUsingTypeMethod(testMessage, name, clazz);
assertEquals(expectedValue, actualValue);
}
private void assertGetMapEntryThrowsMessageFormatException(JmsMapMessage testMessage, String name, Class<?> clazz) throws JMSException {
try {
getMapEntryUsingTypeMethod(testMessage, name, clazz);
fail("expected exception to be thrown");
} catch (MessageFormatException jmsMFE) {
// expected
}
}
private void assertGetMapEntryThrowsNumberFormatException(JmsMapMessage testMessage, String name, Class<?> clazz) throws JMSException {
try {
getMapEntryUsingTypeMethod(testMessage, name, clazz);
fail("expected exception to be thrown");
} catch (NumberFormatException nfe) {
// expected
}
}
private void assertGetMapEntryThrowsNullPointerException(JmsMapMessage testMessage, String name, Class<?> clazz) throws JMSException {
try {
getMapEntryUsingTypeMethod(testMessage, name, clazz);
fail("expected exception to be thrown");
} catch (NullPointerException npe) {
// expected
}
}
private Object getMapEntryUsingTypeMethod(JmsMapMessage testMessage, String name, Class<?> clazz) throws JMSException {
if (clazz == Boolean.class) {
return testMessage.getBoolean(name);
} else if (clazz == Byte.class) {
return testMessage.getByte(name);
} else if (clazz == Character.class) {
return testMessage.getChar(name);
} else if (clazz == Short.class) {
return testMessage.getShort(name);
} else if (clazz == Integer.class) {
return testMessage.getInt(name);
} else if (clazz == Long.class) {
return testMessage.getLong(name);
} else if (clazz == Float.class) {
return testMessage.getFloat(name);
} else if (clazz == Double.class) {
return testMessage.getDouble(name);
} else if (clazz == String.class) {
return testMessage.getString(name);
} else if (clazz == byte[].class) {
return testMessage.getBytes(name);
} else {
throw new RuntimeException("Unexpected entry type class");
}
}
}