You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ro...@apache.org on 2014/10/10 16:23:00 UTC

git commit: more unit tests for AmqpJmsObjectMessageFacade

Repository: qpid-jms
Updated Branches:
  refs/heads/master 12cb11ef5 -> d661352c9


more unit tests for AmqpJmsObjectMessageFacade


Project: http://git-wip-us.apache.org/repos/asf/qpid-jms/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-jms/commit/d661352c
Tree: http://git-wip-us.apache.org/repos/asf/qpid-jms/tree/d661352c
Diff: http://git-wip-us.apache.org/repos/asf/qpid-jms/diff/d661352c

Branch: refs/heads/master
Commit: d661352c90f391db43564851b83368c2622ca536
Parents: 12cb11e
Author: Robert Gemmell <ro...@apache.org>
Authored: Fri Oct 10 15:02:46 2014 +0100
Committer: Robert Gemmell <ro...@apache.org>
Committed: Fri Oct 10 15:22:40 2014 +0100

----------------------------------------------------------------------
 .../message/AmqpJmsObjectMessageFacade.java     |   2 +-
 .../amqp/message/AmqpTypedObjectDelegate.java   |   6 +-
 .../ObjectMessageIntegrationTest.java           |   2 +
 .../message/AmqpJmsMessageTypesTestCase.java    |   4 +-
 .../message/AmqpJmsObjectMessageFacadeTest.java | 180 ++++++++++++++++++-
 5 files changed, 182 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/d661352c/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsObjectMessageFacade.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsObjectMessageFacade.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsObjectMessageFacade.java
index 4c18f7e..205453b 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsObjectMessageFacade.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsObjectMessageFacade.java
@@ -84,7 +84,7 @@ public class AmqpJmsObjectMessageFacade extends AmqpJmsMessageFacade implements
     }
 
     public boolean isAmqpTypedEncoding() {
-        return this.delegate instanceof AmqpTypedObjectDelegate;
+        return delegate.isAmqpTypeEncoded();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/d661352c/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpTypedObjectDelegate.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpTypedObjectDelegate.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpTypedObjectDelegate.java
index 36cdfd7..860e5d3 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpTypedObjectDelegate.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpTypedObjectDelegate.java
@@ -93,17 +93,17 @@ public class AmqpTypedObjectDelegate implements AmqpObjectTypeDelegate {
             // TODO: Data and AmqpSequence?
             throw new IllegalArgumentException("Encoding this object type with the AMQP type system is not supported: " + value.getClass().getName());
         }
-
-        // TODO: ensure content type is not set (assuming we aren't using data sections)?
     }
 
     @Override
     public void onSend() {
+        message.setContentType(null);
     }
 
     private boolean isSupportedAmqpValueObjectType(Serializable serializable) {
         // TODO: augment supported types to encode as an AmqpValue?
-        return serializable instanceof Map<?,?> ||
+        return serializable instanceof String ||
+               serializable instanceof Map<?,?> ||
                serializable instanceof List<?> ||
                serializable.getClass().isArray();
     }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/d661352c/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/ObjectMessageIntegrationTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/ObjectMessageIntegrationTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/ObjectMessageIntegrationTest.java
index 4e0ee9d..65552fe 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/ObjectMessageIntegrationTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/ObjectMessageIntegrationTest.java
@@ -19,6 +19,7 @@
 package org.apache.qpid.jms.integration;
 
 import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.nullValue;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
@@ -227,6 +228,7 @@ public class ObjectMessageIntegrationTest extends QpidJmsTestCase
             MessageAnnotationsSectionMatcher msgAnnotationsMatcher = new MessageAnnotationsSectionMatcher(true);
             msgAnnotationsMatcher.withEntry(Symbol.valueOf(AmqpMessageSupport.JMS_MSG_TYPE), equalTo(AmqpMessageSupport.JMS_OBJECT_MESSAGE));
             MessagePropertiesSectionMatcher propertiesMatcher = new MessagePropertiesSectionMatcher(true);
+            propertiesMatcher.withContentType(nullValue());//check there is no content-type
             TransferPayloadCompositeMatcher messageMatcher = new TransferPayloadCompositeMatcher();
             messageMatcher.setHeadersMatcher(headersMatcher);
             messageMatcher.setMessageAnnotationsMatcher(msgAnnotationsMatcher);

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/d661352c/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageTypesTestCase.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageTypesTestCase.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageTypesTestCase.java
index 8ad585f..6324b75 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageTypesTestCase.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageTypesTestCase.java
@@ -78,8 +78,8 @@ public class AmqpJmsMessageTypesTestCase extends QpidJmsTestCase {
         return new AmqpJmsStreamMessageFacade(amqpConsumer, message);
     }
 
-    protected AmqpJmsObjectMessageFacade createNewObjectMessageFacade(boolean javaSerialized) {
-        return new AmqpJmsObjectMessageFacade(createMockAmqpConnection(), javaSerialized);
+    protected AmqpJmsObjectMessageFacade createNewObjectMessageFacade(boolean amqpTyped) {
+        return new AmqpJmsObjectMessageFacade(createMockAmqpConnection(), amqpTyped);
     }
 
     protected AmqpJmsObjectMessageFacade createReceivedObjectMessageFacade(AmqpConsumer amqpConsumer, Message message) {

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/d661352c/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsObjectMessageFacadeTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsObjectMessageFacadeTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsObjectMessageFacadeTest.java
index 4b3e422..5a2aa2b 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsObjectMessageFacadeTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsObjectMessageFacadeTest.java
@@ -19,15 +19,28 @@ package org.apache.qpid.jms.provider.amqp.message;
 import static org.apache.qpid.jms.provider.amqp.message.AmqpMessageSupport.JMS_MSG_TYPE;
 import static org.apache.qpid.jms.provider.amqp.message.AmqpMessageSupport.JMS_OBJECT_MESSAGE;
 import static org.apache.qpid.jms.provider.amqp.message.AmqpMessageSupport.getSymbol;
+import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.qpid.proton.amqp.Binary;
 import org.apache.qpid.proton.amqp.Symbol;
+import org.apache.qpid.proton.amqp.messaging.AmqpValue;
+import org.apache.qpid.proton.amqp.messaging.Data;
 import org.apache.qpid.proton.amqp.messaging.MessageAnnotations;
+import org.apache.qpid.proton.amqp.messaging.Section;
 import org.apache.qpid.proton.message.Message;
 import org.junit.Test;
 
@@ -40,7 +53,7 @@ public class AmqpJmsObjectMessageFacadeTest extends AmqpJmsMessageTypesTestCase
 
     @Test
     public void testNewMessageToSendContainsMessageTypeAnnotation() throws Exception {
-        AmqpJmsObjectMessageFacade amqpObjectMessageFacade = createNewObjectMessageFacade(true);
+        AmqpJmsObjectMessageFacade amqpObjectMessageFacade = createNewObjectMessageFacade(false);
 
         Message protonMessage = amqpObjectMessageFacade.getAmqpMessage();
         MessageAnnotations annotations = protonMessage.getMessageAnnotations();
@@ -56,29 +69,184 @@ public class AmqpJmsObjectMessageFacadeTest extends AmqpJmsMessageTypesTestCase
 
     @Test
     public void testNewMessageToSendReturnsNullObject() throws Exception {
-        doNewMessageToSendReturnsNullObjectTestImpl(true);
+        doNewMessageToSendReturnsNullObjectTestImpl(false);
     }
 
     @Test
     public void testNewAmqpTypedMessageToSendReturnsNullObject() throws Exception {
-        doNewMessageToSendReturnsNullObjectTestImpl(false);
+        doNewMessageToSendReturnsNullObjectTestImpl(true);
     }
 
-    private void doNewMessageToSendReturnsNullObjectTestImpl(boolean javaSerialized) throws Exception {
-        AmqpJmsObjectMessageFacade amqpObjectMessageFacade = createNewObjectMessageFacade(javaSerialized);
-        amqpObjectMessageFacade.clearBody();
+    private void doNewMessageToSendReturnsNullObjectTestImpl(boolean amqpTyped) throws Exception {
+        AmqpJmsObjectMessageFacade amqpObjectMessageFacade = createNewObjectMessageFacade(amqpTyped);
         assertNull(amqpObjectMessageFacade.getObject());
     }
 
     // ---------- test for normal message operations -------------------------//
 
+    /**
+     * Test that setting an object on a new message results in the expected
+     * content in the body section of the underlying message.
+     */
+    @Test
+    public void testSetObjectOnNewMessage() throws Exception {
+        String content = "myStringContent";
+
+        AmqpJmsObjectMessageFacade amqpObjectMessageFacade = createNewObjectMessageFacade(false);
+        amqpObjectMessageFacade.setObject(content);
+
+        Message protonMessage = amqpObjectMessageFacade.getAmqpMessage();
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream oos = new ObjectOutputStream(baos);
+        oos.writeObject(content);
+        oos.flush();
+        oos.close();
+        byte[] bytes = baos.toByteArray();
+
+        // retrieve the bytes from the underlying message, check they match expectation
+        Section section = protonMessage.getBody();
+        assertNotNull(section);
+        assertEquals(Data.class, section.getClass());
+        assertArrayEquals("Underlying message data section did not contain the expected bytes", bytes, ((Data) section).getValue().getArray());
+    }
+
+    /**
+     * Test that setting an object on a new message results in the expected
+     * content in the body section of the underlying message.
+     */
+    @Test
+    public void testSetObjectOnNewAmqpTypedMessage() throws Exception {
+        String content = "myStringContent";
+
+        AmqpJmsObjectMessageFacade amqpObjectMessageFacade = createNewObjectMessageFacade(true);
+        amqpObjectMessageFacade.setObject(content);
+
+        Message protonMessage = amqpObjectMessageFacade.getAmqpMessage();
+
+        // retrieve the body from the underlying message, check it matches expectation
+        Section section = protonMessage.getBody();
+        assertNotNull(section);
+        assertEquals(AmqpValue.class, section.getClass());
+        assertEquals("Underlying message body did not contain the expected content", content, ((AmqpValue) section).getValue());
+    }
+
+    /**
+    * Test that setting a null object on a message results in the underlying
+    * body section being cleared, ensuring getObject returns null.
+    */
+    @Test
+    public void testSetObjectWithNullClearsExistingBodySection() throws Exception {
+        Message protonMessage = Message.Factory.create();
+        protonMessage.setContentType(AmqpMessageSupport.SERIALIZED_JAVA_OBJECT_CONTENT_TYPE);
+        protonMessage.setBody(new Data(new Binary(new byte[0])));
+
+        AmqpJmsObjectMessageFacade amqpObjectMessageFacade = createReceivedObjectMessageFacade(createMockAmqpConsumer(), protonMessage);
+
+        assertNotNull("Expected existing body section to be found", protonMessage.getBody());
+        amqpObjectMessageFacade.setObject(null);
+        assertNull("Expected existing body section to be cleared", protonMessage.getBody());
+        assertNull("Expected null object", amqpObjectMessageFacade.getObject());
+    }
+
+    /**
+    * Test that setting a null object on a message results in the underlying
+    * body section being cleared, ensuring getObject returns null.
+    */
+    @Test
+    public void testClearBodyWithExistingSerializedBodySection() throws Exception {
+        Message protonMessage = Message.Factory.create();
+        protonMessage.setContentType(AmqpMessageSupport.SERIALIZED_JAVA_OBJECT_CONTENT_TYPE);
+        protonMessage.setBody(new Data(new Binary(new byte[0])));
+
+        AmqpJmsObjectMessageFacade amqpObjectMessageFacade = createReceivedObjectMessageFacade(createMockAmqpConsumer(), protonMessage);
+
+        assertNotNull("Expected existing body section to be found", protonMessage.getBody());
+        amqpObjectMessageFacade.clearBody();
+        assertNull("Expected existing body section to be cleared", protonMessage.getBody());
+        assertNull("Expected null object", amqpObjectMessageFacade.getObject());
+    }
+
+    /**
+    * Test that setting an object on a new message and later getting the value, returns an
+    * equal but different object that does not pick up intermediate changes to the set object.
+    */
+    @Test
+    public void testSetThenGetObjectOnSerializedMessageReturnsSnapshot() throws Exception {
+        HashMap<String, String> origMap = new HashMap<String, String>();
+        origMap.put("key1", "value1");
+
+        AmqpJmsObjectMessageFacade amqpObjectMessageFacade = createNewObjectMessageFacade(false);
+        amqpObjectMessageFacade.setObject(origMap);
+
+        // verify we get a different-but-equal object back
+        Serializable serialized = amqpObjectMessageFacade.getObject();
+        assertTrue("Unexpected object type returned", serialized instanceof Map<?, ?>);
+        Map<?, ?> returnedObject1 = (Map<?, ?>) serialized;
+        assertNotSame("Expected different objects, due to snapshot being taken", origMap, returnedObject1);
+        assertEquals("Expected equal objects, due to snapshot being taken", origMap, returnedObject1);
+
+        // mutate the original object
+        origMap.put("key2", "value2");
+
+        // verify we get a different-but-equal object back when compared to the previously retrieved object
+        Serializable serialized2 = amqpObjectMessageFacade.getObject();
+        assertTrue("Unexpected object type returned", serialized2 instanceof Map<?, ?>);
+        Map<?, ?> returnedObject2 = (Map<?, ?>) serialized2;
+        assertNotSame("Expected different objects, due to snapshot being taken", origMap, returnedObject2);
+        assertEquals("Expected equal objects, due to snapshot being taken", returnedObject1, returnedObject2);
+
+        // verify the mutated map is a different and not equal object
+        assertNotSame("Expected different objects, due to snapshot being taken", returnedObject1, returnedObject2);
+        assertNotEquals("Expected objects to differ, due to snapshot being taken", origMap, returnedObject2);
+    }
+
     // ---------- test handling of received messages -------------------------//
 
     @Test
+    public void testGetObjectUsingReceivedMessageWithNoBodySectionNoContentTypeReturnsNull() throws Exception {
+        doGetObjectUsingReceivedMessageWithNoBodySectionReturnsNullTestImpl(true);
+    }
+
+    @Test
     public void testGetObjectUsingReceivedMessageWithNoBodySectionReturnsNull() throws Exception {
+        doGetObjectUsingReceivedMessageWithNoBodySectionReturnsNullTestImpl(false);
+    }
+
+    private void doGetObjectUsingReceivedMessageWithNoBodySectionReturnsNullTestImpl(boolean amqpTyped) throws IOException, ClassNotFoundException {
+        Message message = Message.Factory.create();
+        if (!amqpTyped) {
+            message.setContentType(AmqpMessageSupport.SERIALIZED_JAVA_OBJECT_CONTENT_TYPE);
+        }
+        AmqpJmsObjectMessageFacade amqpObjectMessageFacade = createReceivedObjectMessageFacade(createMockAmqpConsumer(), message);
+
+        assertNull("Expected null object", amqpObjectMessageFacade.getObject());
+    }
+
+    @Test
+    public void testGetObjectUsingReceivedMessageWithDataSectionContainingNothingReturnsNull() throws Exception {
         Message message = Message.Factory.create();
+        message.setContentType(AmqpMessageSupport.SERIALIZED_JAVA_OBJECT_CONTENT_TYPE);
+        message.setBody(new Data(null));
+
         AmqpJmsObjectMessageFacade amqpObjectMessageFacade = createReceivedObjectMessageFacade(createMockAmqpConsumer(), message);
 
         assertNull("Expected null object", amqpObjectMessageFacade.getObject());
     }
+
+    @Test
+    public void testGetObjectUsingReceivedMessageWithNonDataNonAmqvValueBinarySectionThrowsISE() throws Exception {
+        Message message = Message.Factory.create();
+        message.setContentType(AmqpMessageSupport.SERIALIZED_JAVA_OBJECT_CONTENT_TYPE);
+        message.setBody(new AmqpValue("nonBinarySectionContent"));
+
+        AmqpJmsObjectMessageFacade amqpObjectMessageFacade = createReceivedObjectMessageFacade(createMockAmqpConsumer(), message);
+
+        try {
+            amqpObjectMessageFacade.getObject();
+            fail("Expected exception to be thrown");
+        } catch (IllegalStateException ise) {
+            // expected
+        }
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org