| /* |
| * 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"); |
| } |
| } |
| } |