You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ta...@apache.org on 2016/09/12 20:12:05 UTC

[4/7] qpid-jms git commit: QPIDJMS-207 Adds dependency on JMS 2.0 API and initial implementation.

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0c39522c/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/MessageIntegrationTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/MessageIntegrationTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/MessageIntegrationTest.java
index ec84479..48adaea 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/MessageIntegrationTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/MessageIntegrationTest.java
@@ -31,6 +31,7 @@ import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.io.IOException;
+import java.io.Serializable;
 import java.util.Date;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -98,6 +99,45 @@ public class MessageIntegrationTest extends QpidJmsTestCase
 
     private final IntegrationTestFixture testFixture = new IntegrationTestFixture();
 
+    @Test(timeout = 20000)
+    public void testReceiveMessageAndGetBody() throws Exception {
+        try (TestAmqpPeer testPeer = new TestAmqpPeer();) {
+            Connection connection = testFixture.establishConnecton(testPeer);
+            connection.start();
+
+            testPeer.expectBegin();
+
+            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+            Queue queue = session.createQueue("myQueue");
+
+            DescribedType amqpValueNullContent = new AmqpValueDescribedType(null);
+
+            testPeer.expectReceiverAttach();
+            testPeer.expectLinkFlowRespondWithTransfer(null, null, null, null, amqpValueNullContent);
+            testPeer.expectDispositionThatIsAcceptedAndSettled();
+            testPeer.expectClose();
+
+            MessageConsumer messageConsumer = session.createConsumer(queue);
+            Message receivedMessage = messageConsumer.receive(3000);
+
+            assertTrue(receivedMessage.isBodyAssignableTo(Object.class));
+            assertTrue(receivedMessage.isBodyAssignableTo(String.class));
+            assertTrue(receivedMessage.isBodyAssignableTo(byte[].class));
+            assertTrue(receivedMessage.isBodyAssignableTo(Serializable.class));
+            assertTrue(receivedMessage.isBodyAssignableTo(Map.class));
+
+            assertNull(receivedMessage.getBody(Object.class));
+            assertNull(receivedMessage.getBody(String.class));
+            assertNull(receivedMessage.getBody(byte[].class));
+            assertNull(receivedMessage.getBody(Serializable.class));
+            assertNull(receivedMessage.getBody(Map.class));
+
+            connection.close();
+
+            testPeer.waitForAllHandlersToComplete(3000);
+        }
+    }
+
     //==== Application Properties Section ====
     //========================================
 

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0c39522c/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 a9bc0c5..e382324 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
@@ -21,20 +21,25 @@ 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.assertFalse;
 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.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.ObjectOutputStream;
+import java.io.Serializable;
 import java.util.HashMap;
+import java.util.Map;
 import java.util.UUID;
 
 import javax.jms.Connection;
 import javax.jms.JMSException;
 import javax.jms.Message;
 import javax.jms.MessageConsumer;
+import javax.jms.MessageFormatException;
 import javax.jms.MessageProducer;
 import javax.jms.ObjectMessage;
 import javax.jms.Queue;
@@ -113,6 +118,7 @@ public class ObjectMessageIntegrationTest extends QpidJmsTestCase {
             messageMatcher.setMessageContentMatcher(new EncodedDataMatcher(new Binary(bytes)));
 
             testPeer.expectTransfer(messageMatcher);
+            testPeer.expectClose();
 
             ObjectMessage message = session.createObjectMessage();
             if (content != null || setObjectIfNull) {
@@ -121,6 +127,38 @@ public class ObjectMessageIntegrationTest extends QpidJmsTestCase {
 
             producer.send(message);
 
+            if (content == null) {
+                assertTrue(message.isBodyAssignableTo(String.class));
+                assertTrue(message.isBodyAssignableTo(Serializable.class));
+                assertTrue(message.isBodyAssignableTo(Object.class));
+                assertTrue(message.isBodyAssignableTo(Boolean.class));
+                assertTrue(message.isBodyAssignableTo(byte[].class));
+            } else {
+                assertTrue(message.isBodyAssignableTo(String.class));
+                assertTrue(message.isBodyAssignableTo(Serializable.class));
+                assertTrue(message.isBodyAssignableTo(Object.class));
+                assertFalse(message.isBodyAssignableTo(Boolean.class));
+                assertFalse(message.isBodyAssignableTo(byte[].class));
+            }
+
+            if (content == null) {
+                assertNull(message.getBody(Object.class));
+                assertNull(message.getBody(Serializable.class));
+                assertNull(message.getBody(String.class));
+                assertNull(message.getBody(byte[].class));
+            } else {
+                assertNotNull(message.getBody(Object.class));
+                assertNotNull(message.getBody(Serializable.class));
+                assertNotNull(message.getBody(String.class));
+                try {
+                    message.getBody(byte[].class);
+                    fail("Cannot read TextMessage with this type.");
+                } catch (MessageFormatException mfe) {
+                }
+            }
+
+            connection.close();
+
             testPeer.waitForAllHandlersToComplete(3000);
         }
     }
@@ -156,10 +194,10 @@ public class ObjectMessageIntegrationTest extends QpidJmsTestCase {
             testPeer.expectReceiverAttach();
             testPeer.expectLinkFlowRespondWithTransfer(null, msgAnnotations, properties, null, dataContent);
             testPeer.expectDispositionThatIsAcceptedAndSettled();
+            testPeer.expectClose();
 
             MessageConsumer messageConsumer = session.createConsumer(queue);
             Message receivedMessage = messageConsumer.receive(3000);
-            testPeer.waitForAllHandlersToComplete(3000);
 
             assertNotNull(receivedMessage);
             assertTrue(receivedMessage instanceof ObjectMessage);
@@ -168,6 +206,25 @@ public class ObjectMessageIntegrationTest extends QpidJmsTestCase {
             Object object = objectMessage.getObject();
             assertNotNull("Expected object but got null", object);
             assertEquals("Message body object was not as expected", expectedContent, object);
+
+            assertTrue(receivedMessage.isBodyAssignableTo(String.class));
+            assertTrue(receivedMessage.isBodyAssignableTo(Serializable.class));
+            assertTrue(receivedMessage.isBodyAssignableTo(Object.class));
+            assertFalse(receivedMessage.isBodyAssignableTo(Boolean.class));
+            assertFalse(receivedMessage.isBodyAssignableTo(byte[].class));
+
+            assertNotNull(receivedMessage.getBody(Object.class));
+            assertNotNull(receivedMessage.getBody(Serializable.class));
+            assertNotNull(receivedMessage.getBody(String.class));
+            try {
+                receivedMessage.getBody(byte[].class);
+                fail("Cannot read TextMessage with this type.");
+            } catch (MessageFormatException mfe) {
+            }
+
+            connection.close();
+
+            testPeer.waitForAllHandlersToComplete(3000);
         }
     }
 
@@ -224,9 +281,27 @@ public class ObjectMessageIntegrationTest extends QpidJmsTestCase {
             messageMatcher.setMessageContentMatcher(new EncodedDataMatcher(new Binary(bytes)));
 
             testPeer.expectTransfer(messageMatcher);
+            testPeer.expectClose();
 
             producer.send(receivedMessage);
 
+            assertTrue(receivedMessage.isBodyAssignableTo(String.class));
+            assertTrue(receivedMessage.isBodyAssignableTo(Serializable.class));
+            assertTrue(receivedMessage.isBodyAssignableTo(Object.class));
+            assertFalse(receivedMessage.isBodyAssignableTo(Boolean.class));
+            assertFalse(receivedMessage.isBodyAssignableTo(byte[].class));
+
+            assertNotNull(receivedMessage.getBody(Object.class));
+            assertNotNull(receivedMessage.getBody(Serializable.class));
+            assertNotNull(receivedMessage.getBody(String.class));
+            try {
+                receivedMessage.getBody(byte[].class);
+                fail("Cannot read TextMessage with this type.");
+            } catch (MessageFormatException mfe) {
+            }
+
+            connection.close();
+
             testPeer.waitForAllHandlersToComplete(3000);
         }
     }
@@ -373,6 +448,7 @@ public class ObjectMessageIntegrationTest extends QpidJmsTestCase {
             messageMatcher.setMessageContentMatcher(new EncodedAmqpValueMatcher(map));
 
             testPeer.expectTransfer(messageMatcher);
+            testPeer.expectClose();
 
             ObjectMessage message = session.createObjectMessage();
             message.setBooleanProperty(AmqpMessageSupport.JMS_AMQP_TYPED_ENCODING, true);
@@ -380,6 +456,23 @@ public class ObjectMessageIntegrationTest extends QpidJmsTestCase {
 
             producer.send(message);
 
+            assertTrue(message.isBodyAssignableTo(Map.class));
+            assertTrue(message.isBodyAssignableTo(Serializable.class));
+            assertTrue(message.isBodyAssignableTo(Object.class));
+            assertFalse(message.isBodyAssignableTo(Boolean.class));
+            assertFalse(message.isBodyAssignableTo(byte[].class));
+
+            assertNotNull(message.getBody(Object.class));
+            assertNotNull(message.getBody(Serializable.class));
+            assertNotNull(message.getBody(Map.class));
+            try {
+                message.getBody(byte[].class);
+                fail("Cannot read TextMessage with this type.");
+            } catch (MessageFormatException mfe) {
+            }
+
+            connection.close();
+
             testPeer.waitForAllHandlersToComplete(3000);
         }
     }
@@ -406,10 +499,10 @@ public class ObjectMessageIntegrationTest extends QpidJmsTestCase {
             testPeer.expectReceiverAttach();
             testPeer.expectLinkFlowRespondWithTransfer(null, msgAnnotations, null, null, amqpValueContent);
             testPeer.expectDispositionThatIsAcceptedAndSettled();
+            testPeer.expectClose();
 
             MessageConsumer messageConsumer = session.createConsumer(queue);
             Message receivedMessage = messageConsumer.receive(3000);
-            testPeer.waitForAllHandlersToComplete(3000);
 
             assertNotNull(receivedMessage);
             assertTrue("Expected ObjectMessage instance, but got: " + receivedMessage.getClass().getName(), receivedMessage instanceof ObjectMessage);
@@ -418,6 +511,25 @@ public class ObjectMessageIntegrationTest extends QpidJmsTestCase {
             Object object = objectMessage.getObject();
             assertNotNull("Expected object but got null", object);
             assertEquals("Message body object was not as expected", map, object);
+
+            assertTrue(receivedMessage.isBodyAssignableTo(Map.class));
+            assertTrue(receivedMessage.isBodyAssignableTo(Serializable.class));
+            assertTrue(receivedMessage.isBodyAssignableTo(Object.class));
+            assertFalse(receivedMessage.isBodyAssignableTo(Boolean.class));
+            assertFalse(receivedMessage.isBodyAssignableTo(byte[].class));
+
+            assertNotNull(receivedMessage.getBody(Object.class));
+            assertNotNull(receivedMessage.getBody(Serializable.class));
+            assertNotNull(receivedMessage.getBody(Map.class));
+            try {
+                receivedMessage.getBody(byte[].class);
+                fail("Cannot read TextMessage with this type.");
+            } catch (MessageFormatException mfe) {
+            }
+
+            connection.close();
+
+            testPeer.waitForAllHandlersToComplete(3000);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0c39522c/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/PresettledProducerIntegrationTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/PresettledProducerIntegrationTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/PresettledProducerIntegrationTest.java
index 2ed9f41..ba851a6 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/PresettledProducerIntegrationTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/PresettledProducerIntegrationTest.java
@@ -29,6 +29,7 @@ import static org.junit.Assert.fail;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
+import javax.jms.CompletionListener;
 import javax.jms.Connection;
 import javax.jms.Destination;
 import javax.jms.Message;
@@ -40,7 +41,6 @@ import javax.jms.TemporaryTopic;
 import javax.jms.TextMessage;
 import javax.jms.Topic;
 
-import org.apache.qpid.jms.JmsCompletionListener;
 import org.apache.qpid.jms.JmsMessageProducer;
 import org.apache.qpid.jms.test.QpidJmsTestCase;
 import org.apache.qpid.jms.test.testpeer.ListDescribedType;
@@ -608,7 +608,7 @@ public class PresettledProducerIntegrationTest extends QpidJmsTestCase {
         }
     }
 
-    private class TestJmsCompletionListener implements JmsCompletionListener {
+    private class TestJmsCompletionListener implements CompletionListener {
 
         private final CountDownLatch completed;
 

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0c39522c/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/ProducerIntegrationTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/ProducerIntegrationTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/ProducerIntegrationTest.java
index 1e69eb8..0dee795 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/ProducerIntegrationTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/ProducerIntegrationTest.java
@@ -44,6 +44,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 
 import javax.jms.BytesMessage;
+import javax.jms.CompletionListener;
 import javax.jms.Connection;
 import javax.jms.DeliveryMode;
 import javax.jms.ExceptionListener;
@@ -57,7 +58,6 @@ import javax.jms.Session;
 import javax.jms.TextMessage;
 import javax.jms.Topic;
 
-import org.apache.qpid.jms.JmsCompletionListener;
 import org.apache.qpid.jms.JmsConnection;
 import org.apache.qpid.jms.JmsConnectionFactory;
 import org.apache.qpid.jms.JmsDefaultConnectionListener;
@@ -2381,7 +2381,7 @@ public class ProducerIntegrationTest extends QpidJmsTestCase {
         }
     }
 
-    private class TestJmsCompletionListener implements JmsCompletionListener {
+    private class TestJmsCompletionListener implements CompletionListener {
 
         private final CountDownLatch completed;
 

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0c39522c/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/SessionIntegrationTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/SessionIntegrationTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/SessionIntegrationTest.java
index 34d60f1..7e5744f 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/SessionIntegrationTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/SessionIntegrationTest.java
@@ -37,6 +37,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import javax.jms.CompletionListener;
 import javax.jms.Connection;
 import javax.jms.Destination;
 import javax.jms.IllegalStateException;
@@ -57,7 +58,6 @@ import javax.jms.TextMessage;
 import javax.jms.Topic;
 import javax.jms.TopicSubscriber;
 
-import org.apache.qpid.jms.JmsCompletionListener;
 import org.apache.qpid.jms.JmsConnection;
 import org.apache.qpid.jms.JmsDefaultConnectionListener;
 import org.apache.qpid.jms.JmsMessageProducer;
@@ -1198,6 +1198,33 @@ public class SessionIntegrationTest extends QpidJmsTestCase {
     }
 
     @Test(timeout = 20000)
+    public void testCreateDurableConsumer() throws Exception {
+        try (TestAmqpPeer testPeer = new TestAmqpPeer();) {
+            Connection connection = testFixture.establishConnecton(testPeer);
+            connection.start();
+
+            testPeer.expectBegin();
+            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+            String topicName = "myTopic";
+            Topic dest = session.createTopic(topicName);
+            String subscriptionName = "mySubscription";
+
+            testPeer.expectDurableSubscriberAttach(topicName, subscriptionName);
+            testPeer.expectLinkFlow();
+
+            MessageConsumer consumer = session.createDurableConsumer(dest, subscriptionName);
+            assertNotNull("MessageConsumer object was null", consumer);
+            assertNull("MessageConsumer should not have a selector", consumer.getMessageSelector());
+
+            testPeer.expectClose();
+            connection.close();
+
+            testPeer.waitForAllHandlersToComplete(1000);
+        }
+    }
+
+    @Test(timeout = 20000)
     public void testDurableSubscriptionUnsubscribeInUseThrowsJMSEx() throws Exception {
         try (TestAmqpPeer testPeer = new TestAmqpPeer();) {
             Connection connection = testFixture.establishConnecton(testPeer);
@@ -1995,7 +2022,7 @@ public class SessionIntegrationTest extends QpidJmsTestCase {
         }
     }
 
-    private class TestJmsCompletionListener implements JmsCompletionListener {
+    private class TestJmsCompletionListener implements CompletionListener {
 
         private final CountDownLatch completed;
 

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0c39522c/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/StreamMessageIntegrationTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/StreamMessageIntegrationTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/StreamMessageIntegrationTest.java
index 21e26f8..507d34e 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/StreamMessageIntegrationTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/StreamMessageIntegrationTest.java
@@ -21,8 +21,10 @@ package org.apache.qpid.jms.integration;
 import static org.hamcrest.Matchers.equalTo;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -30,6 +32,7 @@ import java.util.List;
 import javax.jms.Connection;
 import javax.jms.Message;
 import javax.jms.MessageConsumer;
+import javax.jms.MessageFormatException;
 import javax.jms.MessageProducer;
 import javax.jms.Queue;
 import javax.jms.Session;
@@ -106,10 +109,10 @@ public class StreamMessageIntegrationTest extends QpidJmsTestCase {
             testPeer.expectReceiverAttach();
             testPeer.expectLinkFlowRespondWithTransfer(null, msgAnnotations, null, null, amqpValueSectionContent);
             testPeer.expectDispositionThatIsAcceptedAndSettled();
+            testPeer.expectClose();
 
             MessageConsumer messageConsumer = session.createConsumer(queue);
             Message receivedMessage = messageConsumer.receive(3000);
-            testPeer.waitForAllHandlersToComplete(3000);
 
             //verify the content is as expected
             assertNotNull("Message was not received", receivedMessage);
@@ -127,6 +130,33 @@ public class StreamMessageIntegrationTest extends QpidJmsTestCase {
             assertEquals("Unexpected long value", myLong, receivedStreamMessage.readLong());
             assertEquals("Unexpected short value", myShort, receivedStreamMessage.readShort());
             assertEquals("Unexpected UTF value", myString, receivedStreamMessage.readString());
+
+            assertFalse(receivedStreamMessage.isBodyAssignableTo(String.class));
+            assertFalse(receivedStreamMessage.isBodyAssignableTo(Object.class));
+            assertFalse(receivedStreamMessage.isBodyAssignableTo(Boolean.class));
+            assertFalse(receivedStreamMessage.isBodyAssignableTo(byte[].class));
+
+            try {
+                receivedStreamMessage.getBody(Object.class);
+                fail("Cannot read TextMessage with this type.");
+            } catch (MessageFormatException mfe) {
+            }
+
+            try {
+                receivedStreamMessage.getBody(byte[].class);
+                fail("Cannot read TextMessage with this type.");
+            } catch (MessageFormatException mfe) {
+            }
+
+            try {
+                receivedStreamMessage.getBody(String.class);
+                fail("Cannot read TextMessage with this type.");
+            } catch (MessageFormatException mfe) {
+            }
+
+            connection.close();
+
+            testPeer.waitForAllHandlersToComplete(3000);
         }
     }
 
@@ -204,9 +234,38 @@ public class StreamMessageIntegrationTest extends QpidJmsTestCase {
             messageMatcher.setPropertiesMatcher(propertiesMatcher);
             messageMatcher.setMessageContentMatcher(new EncodedAmqpSequenceMatcher(list));
 
-            //send the message
             testPeer.expectTransfer(messageMatcher);
+            testPeer.expectClose();
+
+            //send the message
             producer.send(streamMessage);
+
+            assertFalse(streamMessage.isBodyAssignableTo(String.class));
+            assertFalse(streamMessage.isBodyAssignableTo(Object.class));
+            assertFalse(streamMessage.isBodyAssignableTo(Boolean.class));
+            assertFalse(streamMessage.isBodyAssignableTo(byte[].class));
+
+            try {
+                streamMessage.getBody(Object.class);
+                fail("Cannot read TextMessage with this type.");
+            } catch (MessageFormatException mfe) {
+            }
+
+            try {
+                streamMessage.getBody(byte[].class);
+                fail("Cannot read TextMessage with this type.");
+            } catch (MessageFormatException mfe) {
+            }
+
+            try {
+                streamMessage.getBody(String.class);
+                fail("Cannot read TextMessage with this type.");
+            } catch (MessageFormatException mfe) {
+            }
+
+            connection.close();
+
+            testPeer.waitForAllHandlersToComplete(3000);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0c39522c/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/TextMessageIntegrationTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/TextMessageIntegrationTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/TextMessageIntegrationTest.java
index b7b27e8..2869d03 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/TextMessageIntegrationTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/TextMessageIntegrationTest.java
@@ -20,9 +20,11 @@ package org.apache.qpid.jms.integration;
 
 import static org.hamcrest.Matchers.equalTo;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 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.IOException;
 
@@ -30,6 +32,7 @@ import javax.jms.Connection;
 import javax.jms.JMSException;
 import javax.jms.Message;
 import javax.jms.MessageConsumer;
+import javax.jms.MessageFormatException;
 import javax.jms.MessageProducer;
 import javax.jms.Queue;
 import javax.jms.Session;
@@ -75,10 +78,27 @@ public class TextMessageIntegrationTest extends QpidJmsTestCase {
             messageMatcher.setPropertiesMatcher(propsMatcher);
             messageMatcher.setMessageContentMatcher(new EncodedAmqpValueMatcher(text));
             testPeer.expectTransfer(messageMatcher);
+            testPeer.expectClose();
 
             Message message = session.createTextMessage(text);
-
             producer.send(message);
+
+            assertTrue(message.isBodyAssignableTo(String.class));
+            assertTrue(message.isBodyAssignableTo(Object.class));
+            assertFalse(message.isBodyAssignableTo(Boolean.class));
+            assertFalse(message.isBodyAssignableTo(byte[].class));
+
+            assertNotNull(message.getBody(Object.class));
+            assertNotNull(message.getBody(String.class));
+            try {
+                message.getBody(byte[].class);
+                fail("Cannot read TextMessage with this type.");
+            } catch (MessageFormatException mfe) {
+            }
+
+            connection.close();
+
+            testPeer.waitForAllHandlersToComplete(1000);
         }
     }
 
@@ -99,14 +119,31 @@ public class TextMessageIntegrationTest extends QpidJmsTestCase {
             testPeer.expectReceiverAttach();
             testPeer.expectLinkFlowRespondWithTransfer(null, null, null, null, amqpValueStringContent);
             testPeer.expectDispositionThatIsAcceptedAndSettled();
+            testPeer.expectClose();
 
             MessageConsumer messageConsumer = session.createConsumer(queue);
             Message receivedMessage = messageConsumer.receive(3000);
-            testPeer.waitForAllHandlersToComplete(3000);
+
+            assertTrue(receivedMessage.isBodyAssignableTo(String.class));
+            assertTrue(receivedMessage.isBodyAssignableTo(Object.class));
+            assertFalse(receivedMessage.isBodyAssignableTo(Boolean.class));
+            assertFalse(receivedMessage.isBodyAssignableTo(byte[].class));
+
+            assertNotNull(receivedMessage.getBody(Object.class));
+            assertNotNull(receivedMessage.getBody(String.class));
+            try {
+                receivedMessage.getBody(byte[].class);
+                fail("Cannot read TextMessage with this type.");
+            } catch (MessageFormatException mfe) {
+            }
 
             assertNotNull(receivedMessage);
             assertTrue(receivedMessage instanceof TextMessage);
             assertEquals(expectedMessageContent, ((TextMessage) receivedMessage).getText());
+
+            connection.close();
+
+            testPeer.waitForAllHandlersToComplete(3000);
         }
     }
 
@@ -131,10 +168,21 @@ public class TextMessageIntegrationTest extends QpidJmsTestCase {
             messageMatcher.setPropertiesMatcher(propsMatcher);
             messageMatcher.setMessageContentMatcher(new EncodedAmqpValueMatcher(null));
             testPeer.expectTransfer(messageMatcher);
+            testPeer.expectClose();
 
             Message message = session.createTextMessage();
 
             producer.send(message);
+
+            // Message has no content so all are assignable
+            assertTrue(message.isBodyAssignableTo(String.class));
+            assertTrue(message.isBodyAssignableTo(Object.class));
+            assertTrue(message.isBodyAssignableTo(Boolean.class));
+            assertTrue(message.isBodyAssignableTo(byte[].class));
+
+            connection.close();
+
+            testPeer.waitForAllHandlersToComplete(3000);
         }
     }
 
@@ -154,14 +202,24 @@ public class TextMessageIntegrationTest extends QpidJmsTestCase {
             testPeer.expectReceiverAttach();
             testPeer.expectLinkFlowRespondWithTransfer(null, null, null, null, amqpValueNullContent);
             testPeer.expectDispositionThatIsAcceptedAndSettled();
+            testPeer.expectClose();
 
             MessageConsumer messageConsumer = session.createConsumer(queue);
             Message receivedMessage = messageConsumer.receive(3000);
-            testPeer.waitForAllHandlersToComplete(3000);
 
             assertNotNull(receivedMessage);
             assertTrue(receivedMessage instanceof TextMessage);
             assertNull(((TextMessage) receivedMessage).getText());
+
+            // Message has no content so all are assignable
+            assertTrue(receivedMessage.isBodyAssignableTo(String.class));
+            assertTrue(receivedMessage.isBodyAssignableTo(Object.class));
+            assertTrue(receivedMessage.isBodyAssignableTo(Boolean.class));
+            assertTrue(receivedMessage.isBodyAssignableTo(byte[].class));
+
+            connection.close();
+
+            testPeer.waitForAllHandlersToComplete(3000);
         }
     }
 
@@ -232,16 +290,33 @@ public class TextMessageIntegrationTest extends QpidJmsTestCase {
             testPeer.expectReceiverAttach();
             testPeer.expectLinkFlowRespondWithTransfer(null, null, properties, null, dataContent);
             testPeer.expectDispositionThatIsAcceptedAndSettled();
+            testPeer.expectClose();
 
             MessageConsumer messageConsumer = session.createConsumer(queue);
             Message receivedMessage = messageConsumer.receive(3000);
-            testPeer.waitForAllHandlersToComplete(3000);
 
             assertNotNull(receivedMessage);
             assertTrue(receivedMessage instanceof TextMessage);
             String text = ((TextMessage) receivedMessage).getText();
 
             assertEquals(expectedString, text);
+
+            assertTrue(receivedMessage.isBodyAssignableTo(String.class));
+            assertTrue(receivedMessage.isBodyAssignableTo(Object.class));
+            assertFalse(receivedMessage.isBodyAssignableTo(Boolean.class));
+            assertFalse(receivedMessage.isBodyAssignableTo(byte[].class));
+
+            assertNotNull(receivedMessage.getBody(Object.class));
+            assertNotNull(receivedMessage.getBody(String.class));
+            try {
+                receivedMessage.getBody(byte[].class);
+                fail("Cannot read TextMessage with this type.");
+            } catch (MessageFormatException mfe) {
+            }
+
+            connection.close();
+
+            testPeer.waitForAllHandlersToComplete(3000);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0c39522c/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/JmsMessageTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/JmsMessageTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/JmsMessageTest.java
index a0994a6..16cc9a7 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/JmsMessageTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/JmsMessageTest.java
@@ -26,13 +26,21 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import java.io.Serializable;
 import java.util.Enumeration;
+import java.util.Map;
+import java.util.UUID;
 
+import javax.jms.BytesMessage;
 import javax.jms.DeliveryMode;
 import javax.jms.JMSException;
+import javax.jms.MapMessage;
 import javax.jms.Message;
 import javax.jms.MessageFormatException;
 import javax.jms.MessageNotWriteableException;
+import javax.jms.ObjectMessage;
+import javax.jms.StreamMessage;
+import javax.jms.TextMessage;
 
 import org.apache.qpid.jms.JmsAcknowledgeCallback;
 import org.apache.qpid.jms.JmsConnection;
@@ -1498,6 +1506,333 @@ public class JmsMessageTest {
         assertEquals("Unexpected ack type value after setting prop", RELEASED, callback.getAckType());
     }
 
+    //--------- Test isBodyAssignableTo method -------------------------------//
+
+    @Test
+    public void testMessageIsBodyAssignableTo() throws Exception {
+        Message message = factory.createMessage();
+
+        assertTrue(message.isBodyAssignableTo(String.class));
+        assertTrue(message.isBodyAssignableTo(Boolean.class));
+        assertTrue(message.isBodyAssignableTo(Object.class));
+        assertTrue(message.isBodyAssignableTo(Map.class));
+    }
+
+    @Test
+    public void testTextMessageIsBodyAssignableTo() throws Exception {
+        JmsTextMessage message = factory.createTextMessage();
+
+        assertTrue(message.isBodyAssignableTo(String.class));
+        assertTrue(message.isBodyAssignableTo(Boolean.class));
+        assertTrue(message.isBodyAssignableTo(Map.class));
+        assertTrue(message.isBodyAssignableTo(Object.class));
+
+        message.setText("test");
+
+        assertTrue(message.isBodyAssignableTo(String.class));
+        assertFalse(message.isBodyAssignableTo(Boolean.class));
+        assertFalse(message.isBodyAssignableTo(Map.class));
+        assertTrue(message.isBodyAssignableTo(Object.class));
+    }
+
+    @Test
+    public void testStreamMessageIsBodyAssignableTo() throws Exception {
+        JmsStreamMessage message = factory.createStreamMessage();
+
+        assertFalse(message.isBodyAssignableTo(String.class));
+        assertFalse(message.isBodyAssignableTo(Boolean.class));
+        assertFalse(message.isBodyAssignableTo(Map.class));
+        assertFalse(message.isBodyAssignableTo(Object.class));
+
+        message.writeBoolean(false);
+
+        assertFalse(message.isBodyAssignableTo(String.class));
+        assertFalse(message.isBodyAssignableTo(Boolean.class));
+        assertFalse(message.isBodyAssignableTo(Map.class));
+        assertFalse(message.isBodyAssignableTo(Object.class));
+    }
+
+    @Test
+    public void testMapMessageIsBodyAssignableTo() throws Exception {
+        JmsMapMessage message = factory.createMapMessage();
+
+        assertTrue(message.isBodyAssignableTo(String.class));
+        assertTrue(message.isBodyAssignableTo(Boolean.class));
+        assertTrue(message.isBodyAssignableTo(Map.class));
+        assertTrue(message.isBodyAssignableTo(Object.class));
+
+        message.setBoolean("Boolean", true);
+
+        assertFalse(message.isBodyAssignableTo(String.class));
+        assertFalse(message.isBodyAssignableTo(Boolean.class));
+        assertTrue(message.isBodyAssignableTo(Map.class));
+        assertTrue(message.isBodyAssignableTo(Object.class));
+    }
+
+    @Test
+    public void testBytesMessageIsBodyAssignableTo() throws Exception {
+        JmsBytesMessage message = factory.createBytesMessage();
+
+        assertTrue(message.isBodyAssignableTo(byte[].class));
+        assertTrue(message.isBodyAssignableTo(Boolean.class));
+        assertTrue(message.isBodyAssignableTo(Map.class));
+        assertTrue(message.isBodyAssignableTo(String.class));
+        assertTrue(message.isBodyAssignableTo(Object.class));
+
+        message.writeBoolean(false);
+
+        // The message doesn't technically have a body until it is reset
+        message.reset();
+
+        assertTrue(message.isBodyAssignableTo(byte[].class));
+        assertFalse(message.isBodyAssignableTo(Boolean.class));
+        assertFalse(message.isBodyAssignableTo(Map.class));
+        assertFalse(message.isBodyAssignableTo(String.class));
+        assertTrue(message.isBodyAssignableTo(Object.class));
+    }
+
+    @Test
+    public void testObjectMessageIsBodyAssignableTo() throws Exception {
+        JmsObjectMessage message = factory.createObjectMessage();
+
+        assertTrue(message.isBodyAssignableTo(Boolean.class));
+        assertTrue(message.isBodyAssignableTo(Map.class));
+        assertTrue(message.isBodyAssignableTo(String.class));
+        assertTrue(message.isBodyAssignableTo(Serializable.class));
+        assertTrue(message.isBodyAssignableTo(Object.class));
+
+        message.setObject(UUID.randomUUID());
+
+        assertFalse(message.isBodyAssignableTo(Boolean.class));
+        assertFalse(message.isBodyAssignableTo(Map.class));
+        assertFalse(message.isBodyAssignableTo(String.class));
+        assertTrue(message.isBodyAssignableTo(Serializable.class));
+        assertTrue(message.isBodyAssignableTo(Object.class));
+        assertTrue(message.isBodyAssignableTo(UUID.class));
+    }
+
+    //--------- Test for getBody method --------------------------------------//
+
+    @Test
+    public void testGetBodyOnMessage() throws Exception {
+        Message message = factory.createMessage();
+
+        assertNull(message.getBody(String.class));
+        assertNull(message.getBody(Boolean.class));
+        assertNull(message.getBody(byte[].class));
+        assertNull(message.getBody(Object.class));
+    }
+
+    @Test
+    public void testGetBodyOnTextMessage() throws Exception {
+        TextMessage message = factory.createTextMessage();
+
+        assertNull(message.getBody(String.class));
+        assertNull(message.getBody(Boolean.class));
+        assertNull(message.getBody(byte[].class));
+        assertNull(message.getBody(Object.class));
+
+        message.setText("test");
+
+        assertNotNull(message.getBody(String.class));
+        assertNotNull(message.getBody(Object.class));
+
+        try {
+            message.getBody(Boolean.class);
+            fail("Should have thrown an exception");
+        } catch (MessageFormatException mfe) {
+            LOG.info("caught expected MessageFormatException");
+        }
+
+        try {
+            message.getBody(Map.class);
+            fail("Should have thrown an exception");
+        } catch (MessageFormatException mfe) {
+            LOG.info("caught expected MessageFormatException");
+        }
+
+        try {
+            message.getBody(byte[].class);
+            fail("Should have thrown an exception");
+        } catch (MessageFormatException mfe) {
+            LOG.info("caught expected MessageFormatException");
+        }
+    }
+
+    @Test
+    public void testGetBodyOnMapMessage() throws Exception {
+        MapMessage message = factory.createMapMessage();
+
+        assertNull(message.getBody(String.class));
+        assertNull(message.getBody(Boolean.class));
+        assertNull(message.getBody(byte[].class));
+        assertNull(message.getBody(Object.class));
+
+        message.setString("test", "test");
+
+        assertNotNull(message.getBody(Map.class));
+        assertNotNull(message.getBody(Object.class));
+
+        try {
+            message.getBody(Boolean.class);
+            fail("Should have thrown an exception");
+        } catch (MessageFormatException mfe) {
+            LOG.info("caught expected MessageFormatException");
+        }
+
+        try {
+            message.getBody(String.class);
+            fail("Should have thrown an exception");
+        } catch (MessageFormatException mfe) {
+            LOG.info("caught expected MessageFormatException");
+        }
+
+        try {
+            message.getBody(byte[].class);
+            fail("Should have thrown an exception");
+        } catch (MessageFormatException mfe) {
+            LOG.info("caught expected MessageFormatException");
+        }
+    }
+
+    @Test
+    public void testGetBodyOnObjectMessage() throws Exception {
+        ObjectMessage message = factory.createObjectMessage();
+
+        assertNull(message.getBody(String.class));
+        assertNull(message.getBody(Boolean.class));
+        assertNull(message.getBody(byte[].class));
+        assertNull(message.getBody(Serializable.class));
+        assertNull(message.getBody(Object.class));
+
+        message.setObject(UUID.randomUUID());
+
+        assertNotNull(message.getBody(UUID.class));
+        assertNotNull(message.getBody(Serializable.class));
+        assertNotNull(message.getBody(Object.class));
+
+        try {
+            message.getBody(Boolean.class);
+            fail("Should have thrown an exception");
+        } catch (MessageFormatException mfe) {
+            LOG.info("caught expected MessageFormatException");
+        }
+
+        try {
+            message.getBody(String.class);
+            fail("Should have thrown an exception");
+        } catch (MessageFormatException mfe) {
+            LOG.info("caught expected MessageFormatException");
+        }
+
+        try {
+            message.getBody(byte[].class);
+            fail("Should have thrown an exception");
+        } catch (MessageFormatException mfe) {
+            LOG.info("caught expected MessageFormatException");
+        }
+    }
+
+    @Test
+    public void testGetBodyOnBytesMessage() throws Exception {
+        BytesMessage message = factory.createBytesMessage();
+
+        assertNull(message.getBody(String.class));
+        assertNull(message.getBody(Boolean.class));
+        assertNull(message.getBody(byte[].class));
+        assertNull(message.getBody(Object.class));
+
+        message.writeUTF("test");
+        message.reset();
+
+        assertNotNull(message.getBody(byte[].class));
+        assertNotNull(message.getBody(Object.class));
+
+        try {
+            message.getBody(Boolean.class);
+            fail("Should have thrown an exception");
+        } catch (MessageFormatException mfe) {
+            LOG.info("caught expected MessageFormatException");
+        }
+
+        try {
+            message.getBody(Map.class);
+            fail("Should have thrown an exception");
+        } catch (MessageFormatException mfe) {
+            LOG.info("caught expected MessageFormatException");
+        }
+
+        try {
+            message.getBody(String.class);
+            fail("Should have thrown an exception");
+        } catch (MessageFormatException mfe) {
+            LOG.info("caught expected MessageFormatException");
+        }
+    }
+
+    @Test
+    public void testGetBodyOnStreamMessage() throws Exception {
+        StreamMessage message = factory.createStreamMessage();
+
+        try {
+            message.getBody(Object.class);
+            fail("Should have thrown an exception");
+        } catch (MessageFormatException mfe) {
+            LOG.info("caught expected MessageFormatException");
+        }
+
+        try {
+            message.getBody(Boolean.class);
+            fail("Should have thrown an exception");
+        } catch (MessageFormatException mfe) {
+            LOG.info("caught expected MessageFormatException");
+        }
+
+        try {
+            message.getBody(String.class);
+            fail("Should have thrown an exception");
+        } catch (MessageFormatException mfe) {
+            LOG.info("caught expected MessageFormatException");
+        }
+
+        try {
+            message.getBody(byte[].class);
+            fail("Should have thrown an exception");
+        } catch (MessageFormatException mfe) {
+            LOG.info("caught expected MessageFormatException");
+        }
+
+        message.writeBoolean(false);
+
+        try {
+            message.getBody(Object.class);
+            fail("Should have thrown an exception");
+        } catch (MessageFormatException mfe) {
+            LOG.info("caught expected MessageFormatException");
+        }
+
+        try {
+            message.getBody(Boolean.class);
+            fail("Should have thrown an exception");
+        } catch (MessageFormatException mfe) {
+            LOG.info("caught expected MessageFormatException");
+        }
+
+        try {
+            message.getBody(String.class);
+            fail("Should have thrown an exception");
+        } catch (MessageFormatException mfe) {
+            LOG.info("caught expected MessageFormatException");
+        }
+
+        try {
+            message.getBody(byte[].class);
+            fail("Should have thrown an exception");
+        } catch (MessageFormatException mfe) {
+            LOG.info("caught expected MessageFormatException");
+        }
+    }
+
     //--------- Test support method ------------------------------------------//
 
     private void assertGetMissingPropertyThrowsNumberFormatException(JmsMessage testMessage, String propertyName, Class<?> clazz) throws JMSException {

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0c39522c/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestBytesMessageFacade.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestBytesMessageFacade.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestBytesMessageFacade.java
index 286682c..8b53651 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestBytesMessageFacade.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestBytesMessageFacade.java
@@ -16,11 +16,6 @@
  */
 package org.apache.qpid.jms.message.facade.test;
 
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.ByteBufInputStream;
-import io.netty.buffer.ByteBufOutputStream;
-import io.netty.buffer.Unpooled;
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -30,6 +25,11 @@ import javax.jms.JMSException;
 
 import org.apache.qpid.jms.message.facade.JmsBytesMessageFacade;
 
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufInputStream;
+import io.netty.buffer.ByteBufOutputStream;
+import io.netty.buffer.Unpooled;
+
 /**
  * A test implementation of the JmsBytesMessageFacade that simply holds a raw Buffer
  */
@@ -133,4 +133,19 @@ public final class JmsTestBytesMessageFacade extends JmsTestMessageFacade implem
     public int getBodyLength() {
         return content.readableBytes();
     }
+
+    @Override
+    public boolean hasBody() {
+        return content.isReadable();
+    }
+
+    @Override
+    public byte[] copyBody() {
+        ByteBuf duplicate = content.duplicate();
+        byte[] result = new byte[content.readableBytes()];
+
+        duplicate.readBytes(result);
+
+        return result;
+    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0c39522c/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestMapMessageFacade.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestMapMessageFacade.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestMapMessageFacade.java
index 8629cd9..6f6b8c5 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestMapMessageFacade.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestMapMessageFacade.java
@@ -72,4 +72,9 @@ public class JmsTestMapMessageFacade extends JmsTestMessageFacade implements Jms
     public void clearBody() {
         map.clear();
     }
+
+    @Override
+    public boolean hasBody() {
+        return !map.isEmpty();
+    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0c39522c/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestMessageFacade.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestMessageFacade.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestMessageFacade.java
index 3a6bf93..f1ccb4c 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestMessageFacade.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestMessageFacade.java
@@ -60,6 +60,7 @@ public class JmsTestMessageFacade implements JmsMessageFacade {
     protected int groupSequence;
     protected Object messageId;
     protected long expiration;
+    protected long deliveryTime;
     protected long timestamp;
     protected String correlationId;
     protected boolean persistent;
@@ -283,6 +284,16 @@ public class JmsTestMessageFacade implements JmsMessageFacade {
     }
 
     @Override
+    public long getDeliveryTime() {
+        return deliveryTime;
+    }
+
+    @Override
+    public void setDeliveryTime(long deliveryTime) {
+        this.deliveryTime = deliveryTime;
+    }
+
+    @Override
     public JmsDestination getDestination() {
         return this.destination;
     }
@@ -345,4 +356,9 @@ public class JmsTestMessageFacade implements JmsMessageFacade {
     public void setGroupSequence(int groupSequence) {
         this.groupSequence = groupSequence;
     }
+
+    @Override
+    public boolean hasBody() {
+        return false;
+    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0c39522c/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestObjectMessageFacade.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestObjectMessageFacade.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestObjectMessageFacade.java
index 44bab21..a2fc530 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestObjectMessageFacade.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestObjectMessageFacade.java
@@ -96,4 +96,9 @@ public class JmsTestObjectMessageFacade extends JmsTestMessageFacade implements
 
         this.object = serialized;
     }
+
+    @Override
+    public boolean hasBody() {
+        return object != null && object.length > 0;
+    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0c39522c/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestStreamMessageFacade.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestStreamMessageFacade.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestStreamMessageFacade.java
index 983569c..aadee67 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestStreamMessageFacade.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestStreamMessageFacade.java
@@ -82,4 +82,9 @@ public class JmsTestStreamMessageFacade extends JmsTestMessageFacade implements
     public void reset() {
         index = -1;
     }
+
+    @Override
+    public boolean hasBody() {
+        return !stream.isEmpty();
+    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0c39522c/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestTextMessageFacade.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestTextMessageFacade.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestTextMessageFacade.java
index f701570..a4a103f 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestTextMessageFacade.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/facade/test/JmsTestTextMessageFacade.java
@@ -54,4 +54,9 @@ public final class JmsTestTextMessageFacade extends JmsTestMessageFacade impleme
     public void setText(String text) {
         this.text = text;
     }
+
+    @Override
+    public boolean hasBody() {
+        return text != null;
+    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0c39522c/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/foreign/ForeignJmsMessage.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/foreign/ForeignJmsMessage.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/foreign/ForeignJmsMessage.java
index 8ef1643..51215a2 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/foreign/ForeignJmsMessage.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/message/foreign/ForeignJmsMessage.java
@@ -265,4 +265,24 @@ public class ForeignJmsMessage implements Message {
     public void clearBody() throws JMSException {
         message.clearBody();
     }
+
+    @Override
+    public long getJMSDeliveryTime() throws JMSException {
+        return message.getJMSDeliveryTime();
+    }
+
+    @Override
+    public void setJMSDeliveryTime(long delay) throws JMSException {
+        message.setJMSDeliveryTime(delay);
+    }
+
+    @Override
+    public <T> T getBody(Class<T> asType) throws JMSException {
+        return message.getBody(asType);
+    }
+
+    @Override
+    public boolean isBodyAssignableTo(@SuppressWarnings("rawtypes") Class target) throws JMSException {
+        return message.isBodyAssignableTo(target);
+    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0c39522c/qpid-jms-client/src/test/java/org/apache/qpid/jms/producer/JmsMessageProducerTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/producer/JmsMessageProducerTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/producer/JmsMessageProducerTest.java
index 7117e9f..a2629a9 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/producer/JmsMessageProducerTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/producer/JmsMessageProducerTest.java
@@ -26,6 +26,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
+import javax.jms.CompletionListener;
 import javax.jms.Connection;
 import javax.jms.DeliveryMode;
 import javax.jms.Destination;
@@ -35,7 +36,6 @@ import javax.jms.Message;
 import javax.jms.MessageProducer;
 import javax.jms.Session;
 
-import org.apache.qpid.jms.JmsCompletionListener;
 import org.apache.qpid.jms.JmsConnectionFactory;
 import org.apache.qpid.jms.JmsConnectionTestSupport;
 import org.apache.qpid.jms.JmsDestination;
@@ -541,7 +541,7 @@ public class JmsMessageProducerTest extends JmsConnectionTestSupport {
         }
     }
 
-    private class MyCompletionListener implements JmsCompletionListener {
+    private class MyCompletionListener implements CompletionListener {
 
         private final List<Message> completed = new ArrayList<Message>();
         private final List<Message> failed = new ArrayList<Message>();

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0c39522c/qpid-jms-client/src/test/java/org/apache/qpid/jms/producer/JmsProducerTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/producer/JmsProducerTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/producer/JmsProducerTest.java
new file mode 100644
index 0000000..5a0938a
--- /dev/null
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/producer/JmsProducerTest.java
@@ -0,0 +1,182 @@
+/*
+ * 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.producer;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.UUID;
+
+import javax.jms.JMSProducer;
+import javax.jms.MessageFormatRuntimeException;
+
+import org.apache.qpid.jms.JmsConnectionTestSupport;
+import org.apache.qpid.jms.JmsContext;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Test various behaviors of the JMSProducer implementation.
+ */
+public class JmsProducerTest extends JmsConnectionTestSupport {
+
+    private JmsContext context;
+
+    private final String BAD_PROPERTY_NAME = "%_BAD_PROPERTY_NAME";
+    private final String GOOD_PROPERTY_NAME = "GOOD_PROPERTY_NAME";
+
+    @Override
+    @Before
+    public void setUp() throws Exception {
+        super.setUp();
+
+        context = createJMSContextToMockProvider();
+    }
+
+    @Test
+    public void testGetPropertyNames() {
+        JMSProducer producer = context.createProducer();
+
+        producer.setProperty("Property_1", "1");
+        producer.setProperty("Property_2", "2");
+        producer.setProperty("Property_3", "3");
+
+        assertEquals(3, producer.getPropertyNames().size());
+
+        assertTrue(producer.getPropertyNames().contains("Property_1"));
+        assertTrue(producer.getPropertyNames().contains("Property_2"));
+        assertTrue(producer.getPropertyNames().contains("Property_3"));
+    }
+
+    @Test
+    public void testClearProperties() {
+        JMSProducer producer = context.createProducer();
+
+        producer.setProperty("Property_1", "1");
+        producer.setProperty("Property_2", "2");
+        producer.setProperty("Property_3", "3");
+
+        assertEquals(3, producer.getPropertyNames().size());
+
+        producer.clearProperties();
+
+        assertEquals(0, producer.getPropertyNames().size());
+    }
+
+    @Test
+    public void testSetStringPropetryWithBadPropetyName() {
+        JMSProducer producer = context.createProducer();
+
+        try {
+            producer.setProperty(BAD_PROPERTY_NAME, "X");
+            fail("Should not accept invalid property name");
+        } catch (IllegalArgumentException iae) {}
+    }
+
+    @Test
+    public void testSetBytePropetryWithBadPropetyName() {
+        JMSProducer producer = context.createProducer();
+
+        try {
+            producer.setProperty(BAD_PROPERTY_NAME, (byte) 1);
+            fail("Should not accept invalid property name");
+        } catch (IllegalArgumentException iae) {}
+    }
+
+    @Test
+    public void testSetBooleanPropetryWithBadPropetyName() {
+        JMSProducer producer = context.createProducer();
+
+        try {
+            producer.setProperty(BAD_PROPERTY_NAME, true);
+            fail("Should not accept invalid property name");
+        } catch (IllegalArgumentException iae) {}
+    }
+
+    @Test
+    public void testSetDoublePropetryWithBadPropetyName() {
+        JMSProducer producer = context.createProducer();
+
+        try {
+            producer.setProperty(BAD_PROPERTY_NAME, 100.0);
+            fail("Should not accept invalid property name");
+        } catch (IllegalArgumentException iae) {}
+    }
+
+    @Test
+    public void testSetFloatPropetryWithBadPropetyName() {
+        JMSProducer producer = context.createProducer();
+
+        try {
+            producer.setProperty(BAD_PROPERTY_NAME, 100.0f);
+            fail("Should not accept invalid property name");
+        } catch (IllegalArgumentException iae) {}
+    }
+
+    @Test
+    public void testSetShortPropetryWithBadPropetyName() {
+        JMSProducer producer = context.createProducer();
+
+        try {
+            producer.setProperty(BAD_PROPERTY_NAME, (short) 100);
+            fail("Should not accept invalid property name");
+        } catch (IllegalArgumentException iae) {}
+    }
+
+    @Test
+    public void testSetIntPropetryWithBadPropetyName() {
+        JMSProducer producer = context.createProducer();
+
+        try {
+            producer.setProperty(BAD_PROPERTY_NAME, 100);
+            fail("Should not accept invalid property name");
+        } catch (IllegalArgumentException iae) {}
+    }
+
+    @Test
+    public void testSetLongPropetryWithBadPropetyName() {
+        JMSProducer producer = context.createProducer();
+
+        try {
+            producer.setProperty(BAD_PROPERTY_NAME, 100l);
+            fail("Should not accept invalid property name");
+        } catch (IllegalArgumentException iae) {}
+    }
+
+    @Test
+    public void testSetObjectPropetryWithBadPropetyName() {
+        JMSProducer producer = context.createProducer();
+
+        try {
+            producer.setProperty(BAD_PROPERTY_NAME, UUID.randomUUID());
+            fail("Should not accept invalid property name");
+        } catch (IllegalArgumentException iae) {}
+    }
+
+    @Test
+    public void testSetObjectPropetryWithInvalidObject() {
+        JMSProducer producer = context.createProducer();
+
+        try {
+            producer.setProperty(GOOD_PROPERTY_NAME, UUID.randomUUID());
+            fail("Should not accept invalid property name");
+        } catch (MessageFormatRuntimeException mfre) {}
+    }
+}

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0c39522c/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/failover/FailoverIntegrationTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/failover/FailoverIntegrationTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/failover/FailoverIntegrationTest.java
index d6dc443..301f93a 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/failover/FailoverIntegrationTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/failover/FailoverIntegrationTest.java
@@ -32,6 +32,7 @@ import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 
+import javax.jms.CompletionListener;
 import javax.jms.Connection;
 import javax.jms.ConnectionFactory;
 import javax.jms.InvalidDestinationException;
@@ -46,7 +47,6 @@ import javax.jms.Session;
 import javax.jms.TextMessage;
 import javax.jms.Topic;
 
-import org.apache.qpid.jms.JmsCompletionListener;
 import org.apache.qpid.jms.JmsConnection;
 import org.apache.qpid.jms.JmsConnectionFactory;
 import org.apache.qpid.jms.JmsDefaultConnectionListener;
@@ -1228,7 +1228,7 @@ public class FailoverIntegrationTest extends QpidJmsTestCase {
         return "amqp://localhost:" + peer.getServerPort() + (params != null ? "?" + params : "");
     }
 
-    private class TestJmsCompletionListener implements JmsCompletionListener {
+    private class TestJmsCompletionListener implements CompletionListener {
 
         private final CountDownLatch completed;
 

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0c39522c/qpid-jms-interop-tests/qpid-jms-activemq-tests/src/test/java/org/apache/qpid/jms/JmsMessageIntegrityTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-interop-tests/qpid-jms-activemq-tests/src/test/java/org/apache/qpid/jms/JmsMessageIntegrityTest.java b/qpid-jms-interop-tests/qpid-jms-activemq-tests/src/test/java/org/apache/qpid/jms/JmsMessageIntegrityTest.java
index d09d7bc..c9ca39e 100644
--- a/qpid-jms-interop-tests/qpid-jms-activemq-tests/src/test/java/org/apache/qpid/jms/JmsMessageIntegrityTest.java
+++ b/qpid-jms-interop-tests/qpid-jms-activemq-tests/src/test/java/org/apache/qpid/jms/JmsMessageIntegrityTest.java
@@ -33,6 +33,7 @@ import javax.jms.JMSException;
 import javax.jms.MapMessage;
 import javax.jms.MessageConsumer;
 import javax.jms.MessageEOFException;
+import javax.jms.MessageFormatException;
 import javax.jms.MessageProducer;
 import javax.jms.ObjectMessage;
 import javax.jms.Session;
@@ -212,6 +213,7 @@ public class JmsMessageIntegrityTest extends AmqpTestSupport {
 
         public int deliveryMode;
 
+        private long deliveryTime;
         private String messageId;
         private long timestamp;
         private String correlationId;
@@ -447,6 +449,32 @@ public class JmsMessageIntegrityTest extends AmqpTestSupport {
         public String getText() throws JMSException {
             return text;
         }
+
+        @Override
+        public void setJMSDeliveryTime(long deliveryTime) throws JMSException {
+            this.deliveryTime = deliveryTime;
+        }
+
+        @Override
+        public long getJMSDeliveryTime() throws JMSException {
+            return deliveryTime;
+        }
+
+        @SuppressWarnings("unchecked")
+        @Override
+        public <T> T getBody(Class<T> target) throws JMSException {
+            if (isBodyAssignableTo(target)) {
+                return (T) text;
+            }
+
+            throw new MessageFormatException("Cannot covert body to type: " + target.getName());
+        }
+
+        @SuppressWarnings("unchecked")
+        @Override
+        public boolean isBodyAssignableTo(@SuppressWarnings("rawtypes") Class target) throws JMSException {
+            return target.isAssignableFrom(String.class);
+        }
     }
 
     // TODO - implement proper handling of foreign JMS Message and Destination types.


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