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/09 17:10:00 UTC

git commit: add some unit tests for AmqpJmsBytesMessageFacade

Repository: qpid-jms
Updated Branches:
  refs/heads/master b07c7faac -> fdd1437c3


add some unit tests for AmqpJmsBytesMessageFacade


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

Branch: refs/heads/master
Commit: fdd1437c350cf125be6ec08ac564c26c10bb90cb
Parents: b07c7fa
Author: Robert Gemmell <ro...@apache.org>
Authored: Thu Oct 9 15:48:33 2014 +0100
Committer: Robert Gemmell <ro...@apache.org>
Committed: Thu Oct 9 16:09:41 2014 +0100

----------------------------------------------------------------------
 .../amqp/message/AmqpJmsBytesMessageFacade.java |   4 +-
 .../message/AmqpJmsBytesMessageFacadeTest.java  | 349 +++++++++++++++++++
 .../message/AmqpJmsMessageTypesTestCase.java    |   8 +
 3 files changed, 359 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/fdd1437c/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsBytesMessageFacade.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsBytesMessageFacade.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsBytesMessageFacade.java
index d428a0f..854ccec 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsBytesMessageFacade.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsBytesMessageFacade.java
@@ -18,6 +18,7 @@ package org.apache.qpid.jms.provider.amqp.message;
 
 import static org.apache.qpid.jms.provider.amqp.message.AmqpMessageSupport.JMS_BYTES_MESSAGE;
 import static org.apache.qpid.jms.provider.amqp.message.AmqpMessageSupport.JMS_MSG_TYPE;
+import static org.apache.qpid.jms.provider.amqp.message.AmqpMessageSupport.OCTET_STREAM_CONTENT_TYPE;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufInputStream;
 import io.netty.buffer.ByteBufOutputStream;
@@ -46,7 +47,6 @@ import org.apache.qpid.proton.message.Message;
  */
 public class AmqpJmsBytesMessageFacade extends AmqpJmsMessageFacade implements JmsBytesMessageFacade {
 
-    private static final String CONTENT_TYPE = "application/octet-stream";
     private static final Binary EMPTY_BODY = new Binary(new byte[0]);
     private static final Data EMPTY_DATA = new Data(EMPTY_BODY);
 
@@ -61,7 +61,7 @@ public class AmqpJmsBytesMessageFacade extends AmqpJmsMessageFacade implements J
      */
     public AmqpJmsBytesMessageFacade(AmqpConnection connection) {
         super(connection);
-        setContentType(CONTENT_TYPE);
+        setContentType(OCTET_STREAM_CONTENT_TYPE);
         setMessageAnnotation(JMS_MSG_TYPE, JMS_BYTES_MESSAGE);
     }
 

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/fdd1437c/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsBytesMessageFacadeTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsBytesMessageFacadeTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsBytesMessageFacadeTest.java
new file mode 100644
index 0000000..67f4711
--- /dev/null
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsBytesMessageFacadeTest.java
@@ -0,0 +1,349 @@
+/**
+ * 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.provider.amqp.message;
+
+import static org.apache.qpid.jms.provider.amqp.message.AmqpMessageSupport.JMS_BYTES_MESSAGE;
+import static org.apache.qpid.jms.provider.amqp.message.AmqpMessageSupport.JMS_MSG_TYPE;
+import static org.apache.qpid.jms.provider.amqp.message.AmqpMessageSupport.getSymbol;
+import static org.junit.Assert.assertEquals;
+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.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+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.AmqpSequence;
+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.message.Message;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * Tests for class AmqpJmsBytesMessageFacade
+ */
+public class AmqpJmsBytesMessageFacadeTest extends AmqpJmsMessageTypesTestCase {
+
+    private static final int END_OF_STREAM = -1;
+
+    // ---------- Test initial state of newly created message -----------------//
+
+    @Test
+    public void testNewMessageContainsMessageTypeAnnotation() throws Exception {
+        AmqpJmsBytesMessageFacade amqpBytesMessageFacade = createNewBytesMessageFacade();
+
+        Message protonMessage = amqpBytesMessageFacade.getAmqpMessage();
+        MessageAnnotations annotations = protonMessage.getMessageAnnotations();
+        Map<Symbol, Object> annotationsMap = annotations.getValue();
+
+        assertNotNull("MessageAnnotations section was not present", annotations);
+        assertNotNull("MessageAnnotations section value was not present", annotationsMap);
+
+        assertTrue("expected message type annotation to be present", annotationsMap.containsKey(AmqpMessageSupport.getSymbol(JMS_MSG_TYPE)));
+        assertEquals("unexpected value for message type annotation value", JMS_BYTES_MESSAGE, annotationsMap.get(getSymbol(JMS_MSG_TYPE)));
+        assertEquals(JMS_BYTES_MESSAGE, amqpBytesMessageFacade.getJmsMsgType());
+    }
+
+    @Test
+    public void testGetInputStreamWithNewMessageReturnsEmptyInputStream() throws Exception {
+        AmqpJmsBytesMessageFacade amqpBytesMessageFacade = createNewBytesMessageFacade();
+
+        InputStream byteArrayInputStream = amqpBytesMessageFacade.getInputStream();
+        assertNotNull(byteArrayInputStream);
+
+        // try to read a byte, it should return -1 bytes read, i.e EOS.
+        assertEquals("Expected input stream to be at end but data was returned", END_OF_STREAM, byteArrayInputStream.read(new byte[1]));
+    }
+
+    @Test
+    public void testGetBodyLengthUsingNewMessage() throws Exception {
+        AmqpJmsBytesMessageFacade amqpBytesMessageFacade = createNewBytesMessageFacade();
+
+        assertEquals("Message reports unexpected length", 0, amqpBytesMessageFacade.getBodyLength());
+    }
+
+    @Test
+    public void testNewMessageHasContentTypeButNoBodySection() throws Exception {
+        // TODO: this test assumes we can omit the body section. If we decide otherwise
+        // it should instead check for e.g. a data section containing 0 length binary
+        AmqpJmsBytesMessageFacade amqpBytesMessageFacade = createNewBytesMessageFacade();
+        Message protonMessage = amqpBytesMessageFacade.getAmqpMessage();
+
+        assertNotNull(protonMessage);
+        assertNull(protonMessage.getBody());
+
+        String contentType = protonMessage.getContentType();
+        assertNotNull("content type should be set", contentType);
+        assertEquals("application/octet-stream", contentType);
+    }
+
+    // ---------- test for normal message operations -------------------------//
+
+    @Test
+    public void testGetBodyLengthUsingPopulatedMessageToSend() throws Exception {
+        AmqpJmsBytesMessageFacade amqpBytesMessageFacade = createNewBytesMessageFacade();
+
+        byte[] bytes = "myBytes".getBytes();
+        amqpBytesMessageFacade.setBody(bytes);
+
+        assertEquals("Message reports unexpected length", bytes.length, amqpBytesMessageFacade.getBodyLength());
+    }
+
+    /**
+     * Test that setting bytes on a new messages creates the data section of the underlying message,
+     * which as tested by {@link #testNewMessageHasContentTypeButNoBodySection} does not exist initially.
+     */
+    @Test
+    public void testSetBodyOnNewMessageCreatesDataSection() throws Exception {
+        byte[] testBytes = "myTestBytes".getBytes();
+        AmqpJmsBytesMessageFacade amqpBytesMessageFacade = createNewBytesMessageFacade();
+        Message protonMessage = amqpBytesMessageFacade.getAmqpMessage();
+
+        assertNotNull("underlying proton message was null", protonMessage);
+        assertNull("Expected no body section to be present", protonMessage.getBody());
+
+        amqpBytesMessageFacade.setBody(testBytes);
+
+        assertNotNull("Expected body section to be present", protonMessage.getBody());
+        assertEquals("Unexpected body section type", Data.class, protonMessage.getBody().getClass());
+    }
+
+    /**
+     * Test that setting bytes on a new message results in the expected content in the body section
+     * of the underlying message and returned by a new InputStream requested from the message.
+     */
+    @Test
+    public void testSetGetBytesOnNewMessage() throws Exception {
+        byte[] bytes = "myTestBytes".getBytes();
+        AmqpJmsBytesMessageFacade amqpBytesMessageFacade = createNewBytesMessageFacade();
+        Message protonMessage = amqpBytesMessageFacade.getAmqpMessage();
+
+        amqpBytesMessageFacade.setBody(bytes);
+
+        // retrieve the bytes from the underlying message, check they match
+        Data body = (Data) protonMessage.getBody();
+        assertTrue("Underlying message data section did not contain the expected bytes", Arrays.equals(bytes, body.getValue().getArray()));
+
+        // retrieve the bytes via an InputStream, check they match expected
+        byte[] receivedBytes = new byte[bytes.length];
+        InputStream bytesStream = amqpBytesMessageFacade.getInputStream();
+        bytesStream.read(receivedBytes);
+        assertTrue("Retrieved bytes from input steam did not match expected bytes", Arrays.equals(bytes, receivedBytes));
+
+        // verify no more bytes remain, i.e EOS
+        assertEquals("Expected input stream to be at end but data was returned", END_OF_STREAM, bytesStream.read(new byte[1]));
+    }
+
+    // ---------- test handling of received messages -------------------------//
+
+    @Test
+    public void testGetInputStreamUsingReceivedMessageWithNoBodySectionReturnsEmptyInputStream() throws Exception {
+        Message message = Message.Factory.create();
+        AmqpJmsBytesMessageFacade amqpBytesMessageFacade = createReceivedBytesMessageFacade(createMockAmqpConsumer(), message);
+
+        InputStream byteArrayInputStream = amqpBytesMessageFacade.getInputStream();
+        assertNotNull(byteArrayInputStream);
+
+        // try to read a byte, it should return -1 bytes read, i.e EOS.
+        assertEquals("Expected input stream to be at end but data was returned", END_OF_STREAM, byteArrayInputStream.read(new byte[1]));
+    }
+
+    @Test
+    public void testGetBodyLengthUsingReceivedMessageWithDataSectionContainingNonZeroLengthBinary() throws Exception {
+        Message message = Message.Factory.create();
+        int length = 5;
+        message.setBody(new Data(new Binary(new byte[length])));
+        AmqpJmsBytesMessageFacade amqpBytesMessageFacade = createReceivedBytesMessageFacade(createMockAmqpConsumer(), message);
+
+        assertEquals("Message reports unexpected length", length, amqpBytesMessageFacade.getBodyLength());
+    }
+
+    @Test
+    public void testGetBodyLengthUsingReceivedMessageWithAmqpValueSectionContainingNonZeroLengthBinary() throws Exception {
+        Message message = Message.Factory.create();
+        int length = 10;
+        message.setBody(new AmqpValue(new Binary(new byte[length])));
+        AmqpJmsBytesMessageFacade amqpBytesMessageFacade = createReceivedBytesMessageFacade(createMockAmqpConsumer(), message);
+
+        assertEquals("Message reports unexpected length", length, amqpBytesMessageFacade.getBodyLength());
+    }
+
+    @Test
+    public void testGetBodyLengthUsingReceivedMessageWithAmqpValueSectionContainingNull() throws Exception {
+        Message message = Message.Factory.create();
+        message.setBody(new AmqpValue(null));
+        AmqpJmsBytesMessageFacade amqpBytesMessageFacade = createReceivedBytesMessageFacade(createMockAmqpConsumer(), message);
+
+        assertEquals("Message reports unexpected length", 0, amqpBytesMessageFacade.getBodyLength());
+    }
+
+    @Test
+    public void testInputStreamUsingReceivedMessageWithAmqpValueSectionContainingBinary() throws Exception {
+        byte[] bytes = "myBytes".getBytes();
+
+        Message message = Message.Factory.create();
+        message.setBody(new AmqpValue(new Binary(bytes)));
+
+        AmqpJmsBytesMessageFacade amqpBytesMessageFacade = createReceivedBytesMessageFacade(createMockAmqpConsumer(), message);
+        InputStream bytesStream = amqpBytesMessageFacade.getInputStream();
+
+        // retrieve the expected bytes, check they match
+        byte[] receivedBytes = new byte[bytes.length];
+        bytesStream.read(receivedBytes);
+        assertTrue(Arrays.equals(bytes, receivedBytes));
+
+        // verify no more bytes remain, i.e EOS
+        assertEquals("Expected input stream to be at end but data was returned", END_OF_STREAM, bytesStream.read(new byte[1]));
+    }
+
+    @Test
+    public void testInputStreamUsingReceivedMessageWithDataSection() throws Exception {
+        byte[] bytes = "myBytes".getBytes();
+
+        Message message = Message.Factory.create();
+        message.setBody(new Data(new Binary(bytes)));
+
+        AmqpJmsBytesMessageFacade amqpBytesMessageFacade = createReceivedBytesMessageFacade(createMockAmqpConsumer(), message);
+        InputStream bytesStream = amqpBytesMessageFacade.getInputStream();
+        assertNotNull(bytesStream);
+
+        // retrieve the expected bytes, check they match
+        byte[] receivedBytes = new byte[bytes.length];
+        bytesStream.read(receivedBytes);
+        assertTrue(Arrays.equals(bytes, receivedBytes));
+
+        // verify no more bytes remain, i.e EOS
+        assertEquals("Expected input stream to be at end but data was returned", END_OF_STREAM, bytesStream.read(new byte[1]));
+    }
+
+    @Test
+    public void testGetInputStreamUsingReceivedMessageWithDataSectionContainingNothingReturnsEmptyStream() throws Exception {
+        Message message = Message.Factory.create();
+        message.setBody(new Data(null));
+
+        AmqpJmsBytesMessageFacade amqpBytesMessageFacade = createReceivedBytesMessageFacade(createMockAmqpConsumer(), message);
+        InputStream bytesStream = amqpBytesMessageFacade.getInputStream();
+        assertNotNull(bytesStream);
+
+        assertEquals("Message reports unexpected length", 0, amqpBytesMessageFacade.getBodyLength());
+        assertEquals("Expected input stream to be at end but data was returned", END_OF_STREAM, bytesStream.read(new byte[1]));
+    }
+
+    @Test
+    public void testGetMethodsWithNonAmqpValueNonDataSectionThrowsISE() throws Exception {
+        Message message = Message.Factory.create();
+        message.setBody(new AmqpSequence(new ArrayList<Object>()));
+        AmqpJmsBytesMessageFacade amqpBytesMessageFacade = createReceivedBytesMessageFacade(createMockAmqpConsumer(), message);
+
+        try {
+            amqpBytesMessageFacade.getInputStream();
+            fail("expected exception not thrown");
+        } catch (IllegalStateException ise) {
+            // expected
+        }
+
+        try {
+            amqpBytesMessageFacade.getBodyLength();
+            fail("expected exception not thrown");
+        } catch (IllegalStateException ise) {
+            // expected
+        }
+    }
+
+    @Test
+    public void testGetMethodsWithAmqpValueContainingNonNullNonBinaryValueThrowsISE() throws Exception {
+        Message message = Message.Factory.create();
+        message.setBody(new AmqpValue(true));
+        AmqpJmsBytesMessageFacade amqpBytesMessageFacade = createReceivedBytesMessageFacade(createMockAmqpConsumer(), message);
+
+        try {
+            amqpBytesMessageFacade.getInputStream();
+            fail("expected exception not thrown");
+        } catch (IllegalStateException ise) {
+            // expected
+        }
+
+        try {
+            amqpBytesMessageFacade.getBodyLength();
+            fail("expected exception not thrown");
+        } catch (IllegalStateException ise) {
+            // expected
+        }
+    }
+
+    /**
+     * Test that setting bytes on a received message results in the expected content in the body section
+     * of the underlying message and returned by a new InputStream requested from the message.
+     */
+    @Test
+    public void testSetGetBodyOnReceivedMessage() throws Exception {
+        byte[] orig = "myOrigBytes".getBytes();
+        byte[] replacement = "myReplacementBytes".getBytes();
+
+        Message message = Message.Factory.create();
+        message.setBody(new Data(new Binary(orig)));
+        AmqpJmsBytesMessageFacade amqpBytesMessageFacade = createReceivedBytesMessageFacade(createMockAmqpConsumer(), message);
+        Message protonMessage = amqpBytesMessageFacade.getAmqpMessage();
+
+        amqpBytesMessageFacade.setBody(replacement);
+
+        // retrieve the new bytes from the underlying message, check they match
+        Data body = (Data) protonMessage.getBody();
+        assertTrue("Underlying message data section did not contain the expected bytes", Arrays.equals(replacement, body.getValue().getArray()));
+
+        assertEquals("expected length to match replacement bytes", replacement.length, amqpBytesMessageFacade.getBodyLength());
+
+        // retrieve the new bytes via an InputStream, check they match expected
+        byte[] receivedBytes = new byte[replacement.length];
+        InputStream bytesStream = amqpBytesMessageFacade.getInputStream();
+        bytesStream.read(receivedBytes);
+        assertTrue("Retrieved bytes from input steam did not match expected bytes", Arrays.equals(replacement, receivedBytes));
+
+        // verify no more bytes remain, i.e EOS
+        assertEquals("Expected input stream to be at end but data was returned", END_OF_STREAM, bytesStream.read(new byte[1]));
+    }
+
+    /**
+     * Test that setting bytes on a received message results which had no content type
+     * results in the content type being set.
+     */
+    @Test
+    @Ignore
+    // TODO: failing because we dont set the content type except at creation. Decide if we actually care.
+    public void testSetBytesOnReceivedMessageSetsContentTypeIfBodyTypeChanged() throws Exception {
+        byte[] orig = "myOrigBytes".getBytes();
+        byte[] replacement = "myReplacementBytes".getBytes();
+
+        Message message = Message.Factory.create();
+        message.setBody(new AmqpValue(new Binary(orig)));
+        AmqpJmsBytesMessageFacade amqpBytesMessageFacade = createReceivedBytesMessageFacade(createMockAmqpConsumer(), message);
+        Message protonMessage = amqpBytesMessageFacade.getAmqpMessage();
+
+        amqpBytesMessageFacade.setBody(replacement);
+
+        String contentType = protonMessage.getContentType();
+        assertNotNull("content type should be set", contentType);
+        assertEquals("application/octet-stream", contentType);
+    }
+}

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/fdd1437c/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 d4201df..a39afcd 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
@@ -54,6 +54,14 @@ public class AmqpJmsMessageTypesTestCase extends QpidJmsTestCase {
         return new AmqpJmsTextMessageFacade(amqpConsumer, message);
     }
 
+    protected AmqpJmsBytesMessageFacade createNewBytesMessageFacade() {
+        return new AmqpJmsBytesMessageFacade(createMockAmqpConnection());
+    }
+
+    protected AmqpJmsBytesMessageFacade createReceivedBytesMessageFacade(AmqpConsumer amqpConsumer, Message message) {
+        return new AmqpJmsBytesMessageFacade(amqpConsumer, message);
+    }
+
     protected AmqpJmsMapMessageFacade createNewMapMessageFacade() {
         return new AmqpJmsMapMessageFacade(createMockAmqpConnection());
     }


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