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