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/11/18 22:48:33 UTC

qpid-jms git commit: QPIDJMS-225 Add additional test coverage

Repository: qpid-jms
Updated Branches:
  refs/heads/master 6c067a62a -> 83f5507cc


QPIDJMS-225  Add additional test coverage

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

Branch: refs/heads/master
Commit: 83f5507cca3b7616335715c7f76eb106d5b85cc8
Parents: 6c067a6
Author: Timothy Bish <ta...@gmail.com>
Authored: Fri Nov 18 17:48:25 2016 -0500
Committer: Timothy Bish <ta...@gmail.com>
Committed: Fri Nov 18 17:48:25 2016 -0500

----------------------------------------------------------------------
 .../jms/exceptions/IdConversionException.java   |   9 +-
 .../JmsConnectionClosedException.java           |   1 -
 .../qpid/jms/exceptions/QpidJmsException.java   |  12 +-
 .../qpid/jms/provider/WrappedAsyncResult.java   |  18 +-
 .../amqp/message/AmqpJmsMessageFacade.java      |   2 +-
 .../amqp/message/AmqpJmsTextMessageFacade.java  |   2 +-
 .../java/org/apache/qpid/jms/JmsQueueTest.java  |   8 +
 .../org/apache/qpid/jms/JmsSessionTest.java     |   4 -
 .../java/org/apache/qpid/jms/JmsTopicTest.java  |   8 +
 .../qpid/jms/consumer/JmsQueueBrowserTest.java  |  14 +
 .../apache/qpid/jms/meta/JmsConsumerIdTest.java |  11 +
 .../apache/qpid/jms/meta/JmsProducerIdTest.java |  11 +
 .../apache/qpid/jms/meta/JmsSessionIdTest.java  |  11 +
 .../jms/producer/JmsTopicPublisherTest.java     | 164 ++++++++
 .../qpid/jms/provider/NoOpAsyncResultTest.java  |  52 +++
 .../qpid/jms/provider/ProviderFutureTest.java   | 215 ++++++++++
 .../qpid/jms/provider/ProviderWrapperTest.java  | 389 ++++++++++++++++++-
 .../jms/provider/WrappedAsyncResultTest.java    |  67 ++++
 .../provider/amqp/AmqpProviderFactoryTest.java  |   6 +
 .../message/AmqpJmsMapMessageFacadeTest.java    |   8 +
 .../amqp/message/AmqpJmsMessageFacadeTest.java  |  89 ++++-
 .../message/AmqpJmsStreamMessageFacadeTest.java |   7 +
 .../message/AmqpJmsTextMessageFacadeTest.java   |   9 +
 .../amqp/message/AmqpWritableBufferTest.java    |  37 ++
 .../qpid/jms/sasl/AbstractMechanismTest.java    |  72 ++++
 .../qpid/jms/sasl/AnonymousMechanismTest.java   |  19 +
 .../qpid/jms/sasl/ExternalMechanismTest.java    |  19 +
 .../qpid/jms/sasl/PlainMechanismTest.java       |  19 +
 .../qpid/jms/session/JmsSessionClosedTest.java  |   6 +
 .../jms/session/JmsTopicSessionClosedTest.java  |   5 +
 .../apache/qpid/jms/util/URISupportTest.java    |  43 ++
 31 files changed, 1290 insertions(+), 47 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/main/java/org/apache/qpid/jms/exceptions/IdConversionException.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/exceptions/IdConversionException.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/exceptions/IdConversionException.java
index b04b988..c05c992 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/exceptions/IdConversionException.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/exceptions/IdConversionException.java
@@ -20,17 +20,14 @@
  */
 package org.apache.qpid.jms.exceptions;
 
-public class IdConversionException extends QpidJmsException
-{
+public class IdConversionException extends QpidJmsException {
     private static final long serialVersionUID = -2349723813650476823L;
 
-    public IdConversionException(String reason)
-    {
+    public IdConversionException(String reason) {
         super(reason);
     }
 
-    public IdConversionException(String reason, Exception cause)
-    {
+    public IdConversionException(String reason, Exception cause) {
         super(reason, cause);
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/main/java/org/apache/qpid/jms/exceptions/JmsConnectionClosedException.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/exceptions/JmsConnectionClosedException.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/exceptions/JmsConnectionClosedException.java
index e39cdb2..94cf989 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/exceptions/JmsConnectionClosedException.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/exceptions/JmsConnectionClosedException.java
@@ -26,7 +26,6 @@ import javax.jms.IllegalStateException;
 public class JmsConnectionClosedException extends IllegalStateException {
     private static final long serialVersionUID = -7975982446284065025L;
 
-
     public JmsConnectionClosedException(IOException cause) {
         super("The JMS connection has been closed: " + extractMessage(cause));
         initCause(cause);

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/main/java/org/apache/qpid/jms/exceptions/QpidJmsException.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/exceptions/QpidJmsException.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/exceptions/QpidJmsException.java
index a922530..108ab04 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/exceptions/QpidJmsException.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/exceptions/QpidJmsException.java
@@ -22,20 +22,16 @@ package org.apache.qpid.jms.exceptions;
 
 import javax.jms.JMSException;
 
-public class QpidJmsException extends JMSException
-{
+public class QpidJmsException extends JMSException {
     private static final long serialVersionUID = 751932967255393054L;
 
-    public QpidJmsException(String reason)
-    {
+    public QpidJmsException(String reason) {
         this(reason, null);
     }
 
-    public QpidJmsException(String reason, Exception cause)
-    {
+    public QpidJmsException(String reason, Exception cause) {
         super(reason);
-        if (cause != null)
-        {
+        if (cause != null) {
             setLinkedException(cause);
             initCause(cause);
         }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/WrappedAsyncResult.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/WrappedAsyncResult.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/WrappedAsyncResult.java
index fe9230f..e382afe 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/WrappedAsyncResult.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/WrappedAsyncResult.java
@@ -30,30 +30,26 @@ public abstract class WrappedAsyncResult implements AsyncResult {
      *      The AsyncResult to be wrapped by this AsyncResult instance.
      */
     public WrappedAsyncResult(AsyncResult wrapped) {
+        if (wrapped == null) {
+            throw new IllegalArgumentException("Wrapped AsyncResult cannot be null");
+        }
+
         this.wrapped = wrapped;
     }
 
     @Override
     public void onFailure(Throwable result) {
-        if (wrapped != null) {
-            wrapped.onFailure(result);
-        }
+        wrapped.onFailure(result);
     }
 
     @Override
     public void onSuccess() {
-        if (wrapped != null) {
-            wrapped.onSuccess();
-        }
+        wrapped.onSuccess();
     }
 
     @Override
     public boolean isComplete() {
-        if (wrapped != null) {
-            return wrapped.isComplete();
-        }
-
-        return false;
+        return wrapped.isComplete();
     }
 
     public AsyncResult getWrappedRequest() {

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacade.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacade.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacade.java
index 1005e04..14b0c52 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacade.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacade.java
@@ -772,7 +772,7 @@ public class AmqpJmsMessageFacade implements JmsMessageFacade {
 
     @Override
     public boolean hasBody() {
-        return body == null;
+        return body != null;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsTextMessageFacade.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsTextMessageFacade.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsTextMessageFacade.java
index 5595362..5d89dc1 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsTextMessageFacade.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsTextMessageFacade.java
@@ -114,7 +114,7 @@ public class AmqpJmsTextMessageFacade extends AmqpJmsMessageFacade implements Jm
     public boolean hasBody() {
         try {
             return getText() != null;
-        } catch (JMSException e) {
+        } catch (Exception e) {
             return false;
         }
     }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsQueueTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsQueueTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsQueueTest.java
index ed8787d..7e28350 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsQueueTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsQueueTest.java
@@ -82,6 +82,14 @@ public class JmsQueueTest extends QpidJmsTestCase {
     }
 
     @Test
+    public void testEqualsWithTemporaryQueue() {
+        JmsQueue queue1 = new JmsQueue("name");
+        JmsTemporaryQueue queue2 = new JmsTemporaryQueue("name");
+        assertFalse("should be unequal", queue1.equals(queue2));
+        assertFalse("should still be unequal", queue2.equals(queue1));
+    }
+
+    @Test
     public void testHashcodeWithEqualNamedObjects() {
         JmsQueue queue1 = new JmsQueue("name");
         JmsQueue queue2 = new JmsQueue("name");

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsSessionTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsSessionTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsSessionTest.java
index 27fc511..e12592e 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsSessionTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsSessionTest.java
@@ -37,10 +37,6 @@ import javax.jms.TemporaryQueue;
 import javax.jms.TextMessage;
 import javax.jms.Topic;
 
-import org.apache.qpid.jms.JmsConnectionTestSupport;
-import org.apache.qpid.jms.JmsMessageConsumer;
-import org.apache.qpid.jms.JmsSession;
-import org.apache.qpid.jms.JmsTemporaryQueue;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsTopicTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsTopicTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsTopicTest.java
index 702e82b..8cf5013 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsTopicTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/JmsTopicTest.java
@@ -82,6 +82,14 @@ public class JmsTopicTest extends QpidJmsTestCase {
     }
 
     @Test
+    public void testEqualsWithTemporaryTopic() {
+        JmsTopic topic1 = new JmsTopic("name");
+        JmsTemporaryTopic topic2 = new JmsTemporaryTopic("name");
+        assertFalse("should be unequal", topic1.equals(topic2));
+        assertFalse("should still be unequal", topic2.equals(topic1));
+    }
+
+    @Test
     public void testHashcodeWithEqualNamedObjects() {
         JmsTopic topic1 = new JmsTopic("name");
         JmsTopic topic2 = new JmsTopic("name");

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/consumer/JmsQueueBrowserTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/consumer/JmsQueueBrowserTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/consumer/JmsQueueBrowserTest.java
index 9dee268..e781d73 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/consumer/JmsQueueBrowserTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/consumer/JmsQueueBrowserTest.java
@@ -19,9 +19,11 @@ package org.apache.qpid.jms.consumer;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
 
 import java.util.Enumeration;
 
+import javax.jms.IllegalStateException;
 import javax.jms.Message;
 import javax.jms.Queue;
 import javax.jms.QueueBrowser;
@@ -75,4 +77,16 @@ public class JmsQueueBrowserTest extends JmsConnectionTestSupport {
         browser.close();
         assertFalse(browse.hasMoreElements());
     }
+
+    @Test(timeout = 30000)
+    public void testGetEnumerationClosedBrowser() throws Exception {
+        browser = session.createBrowser(queue);
+
+        browser.close();
+
+        try {
+            browser.getEnumeration();
+            fail("Should throw an IllegalStateException");
+        } catch (IllegalStateException ise) {}
+    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/meta/JmsConsumerIdTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/meta/JmsConsumerIdTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/meta/JmsConsumerIdTest.java
index 6c40c66..89ff17e 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/meta/JmsConsumerIdTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/meta/JmsConsumerIdTest.java
@@ -145,9 +145,20 @@ public class JmsConsumerIdTest {
         JmsConsumerId id5 = new JmsConsumerId(firstId, 1);
         JmsConsumerId id6 = new JmsConsumerId(secondId.getConnectionId(), 1, 1);
 
+        // Connection ID
+        IdGenerator generator = new IdGenerator();
+        String connectionId = generator.generateId();
+
+        JmsConsumerId id7 = new JmsConsumerId(connectionId, 1, 2);
+        JmsConsumerId id8 = new JmsConsumerId(connectionId, 1, 3);
+
         assertFalse(id3.equals(id4));
         assertTrue(id3.equals(id5));
         assertTrue(id3.equals(id6));
+        assertFalse(id3.equals(id7));
+        assertFalse(id3.equals(id8));
+        assertFalse(id4.equals(id7));
+        assertFalse(id4.equals(id8));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/meta/JmsProducerIdTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/meta/JmsProducerIdTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/meta/JmsProducerIdTest.java
index faf73f9..61c2733 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/meta/JmsProducerIdTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/meta/JmsProducerIdTest.java
@@ -145,9 +145,20 @@ public class JmsProducerIdTest {
         JmsProducerId id5 = new JmsProducerId(firstId, 1);
         JmsProducerId id6 = new JmsProducerId(secondId.getConnectionId(), 1, 3);
 
+        // Connection ID
+        IdGenerator generator = new IdGenerator();
+        String connectionId = generator.generateId();
+
+        JmsProducerId id7 = new JmsProducerId(connectionId, 1, 2);
+        JmsProducerId id8 = new JmsProducerId(connectionId, 1, 3);
+
         assertFalse(id3.equals(id4));
         assertTrue(id3.equals(id5));
         assertFalse(id3.equals(id6));
+        assertFalse(id3.equals(id7));
+        assertFalse(id3.equals(id8));
+        assertFalse(id4.equals(id7));
+        assertFalse(id4.equals(id8));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/meta/JmsSessionIdTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/meta/JmsSessionIdTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/meta/JmsSessionIdTest.java
index b16a4d0..6346f81 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/meta/JmsSessionIdTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/meta/JmsSessionIdTest.java
@@ -148,8 +148,19 @@ public class JmsSessionIdTest {
         JmsSessionId id4 = new JmsSessionId(firstId, 2);
         JmsSessionId id5 = new JmsSessionId(firstId, 1);
 
+        // Connection ID
+        IdGenerator generator = new IdGenerator();
+        String connectionId = generator.generateId();
+
+        JmsSessionId id6 = new JmsSessionId(connectionId, 1);
+        JmsSessionId id7 = new JmsSessionId(connectionId, 3);
+
         assertFalse(id3.equals(id4));
         assertTrue(id3.equals(id5));
+        assertFalse(id3.equals(id6));
+        assertFalse(id3.equals(id7));
+        assertFalse(id4.equals(id6));
+        assertFalse(id4.equals(id7));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/producer/JmsTopicPublisherTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/producer/JmsTopicPublisherTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/producer/JmsTopicPublisherTest.java
new file mode 100644
index 0000000..63dd0b9
--- /dev/null
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/producer/JmsTopicPublisherTest.java
@@ -0,0 +1,164 @@
+/*
+ * 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.assertNotNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.fail;
+
+import javax.jms.Destination;
+import javax.jms.InvalidDestinationException;
+import javax.jms.Message;
+import javax.jms.Session;
+import javax.jms.Topic;
+import javax.jms.TopicPublisher;
+
+import org.apache.qpid.jms.JmsConnectionTestSupport;
+import org.apache.qpid.jms.JmsTopicSession;
+import org.apache.qpid.jms.message.JmsOutboundMessageDispatch;
+import org.apache.qpid.jms.provider.mock.MockRemotePeer;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class JmsTopicPublisherTest extends JmsConnectionTestSupport {
+
+    private JmsTopicSession session;
+    private final MockRemotePeer remotePeer = new MockRemotePeer();
+
+    @Override
+    @Before
+    public void setUp() throws Exception {
+        super.setUp();
+        remotePeer.start();
+        connection = createConnectionToMockProvider();
+        session = (JmsTopicSession) connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
+    }
+
+    @Override
+    @After
+    public void tearDown() throws Exception {
+        remotePeer.terminate();
+        super.tearDown();
+    }
+
+    @Test(timeout = 10000)
+    public void testMultipleCloseCallsNoErrors() throws Exception {
+        Topic topic = session.createTopic(getTestName());
+        TopicPublisher publisher = session.createPublisher(topic);
+        publisher.close();
+        publisher.close();
+    }
+
+    @Test(timeout = 10000)
+    public void testGetTopic() throws Exception {
+        Topic topic = session.createTopic(getTestName());
+        TopicPublisher publisher = session.createPublisher(topic);
+        assertSame(topic, publisher.getTopic());
+    }
+
+    @Test(timeout = 10000)
+    public void testPublishMessage() throws Exception {
+        Topic topic = session.createTopic(getTestName());
+        TopicPublisher publisher = session.createPublisher(topic);
+        Message message = session.createMessage();
+        publisher.publish(message);
+
+        JmsOutboundMessageDispatch envelope = remotePeer.getLastReceivedMessage();
+        assertNotNull(envelope);
+        message = envelope.getMessage();
+        Destination destination = message.getJMSDestination();
+        assertEquals(topic, destination);
+    }
+
+    @Test(timeout = 10000)
+    public void testPublishMessageOnProvidedTopic() throws Exception {
+        Topic topic = session.createTopic(getTestName());
+        TopicPublisher publisher = session.createPublisher(null);
+        Message message = session.createMessage();
+        publisher.publish(topic, message);
+
+        JmsOutboundMessageDispatch envelope = remotePeer.getLastReceivedMessage();
+        assertNotNull(envelope);
+        message = envelope.getMessage();
+        Destination destination = message.getJMSDestination();
+        assertEquals(topic, destination);
+    }
+
+    @Test(timeout = 10000)
+    public void testPublishMessageOnProvidedTopicWhenNotAnonymous() throws Exception {
+        Topic topic = session.createTopic(getTestName());
+        TopicPublisher publisher = session.createPublisher(topic);
+        Message message = session.createMessage();
+
+        try {
+            publisher.publish(session.createTopic(getTestName() + "1"), message);
+            fail("Should throw UnsupportedOperationException");
+        } catch (UnsupportedOperationException uoe) {}
+
+        try {
+            publisher.publish((Topic) null, message);
+            fail("Should throw InvalidDestinationException");
+        } catch (InvalidDestinationException ide) {}
+    }
+
+    @Test(timeout = 10000)
+    public void testPublishMessageWithDeliveryOptions() throws Exception {
+        Topic topic = session.createTopic(getTestName());
+        TopicPublisher publisher = session.createPublisher(topic);
+        Message message = session.createMessage();
+        publisher.publish(message, Message.DEFAULT_DELIVERY_MODE, Message.DEFAULT_PRIORITY, Message.DEFAULT_TIME_TO_LIVE);
+
+        JmsOutboundMessageDispatch envelope = remotePeer.getLastReceivedMessage();
+        assertNotNull(envelope);
+        message = envelope.getMessage();
+        Destination destination = message.getJMSDestination();
+        assertEquals(topic, destination);
+    }
+
+    @Test(timeout = 10000)
+    public void testPublishMessageWithOptionsOnProvidedTopic() throws Exception {
+        Topic topic = session.createTopic(getTestName());
+        TopicPublisher publisher = session.createPublisher(null);
+        Message message = session.createMessage();
+        publisher.publish(topic, message, Message.DEFAULT_DELIVERY_MODE, Message.DEFAULT_PRIORITY, Message.DEFAULT_TIME_TO_LIVE);
+
+        JmsOutboundMessageDispatch envelope = remotePeer.getLastReceivedMessage();
+        assertNotNull(envelope);
+        message = envelope.getMessage();
+        Destination destination = message.getJMSDestination();
+        assertEquals(topic, destination);
+    }
+
+    @Test(timeout = 10000)
+    public void testPublishMessageWithOptionsOnProvidedTopicWhenNotAnonymous() throws Exception {
+        Topic topic = session.createTopic(getTestName());
+        TopicPublisher publisher = session.createPublisher(topic);
+        Message message = session.createMessage();
+
+        try {
+            publisher.publish(session.createTopic(getTestName() + "1"), message, Message.DEFAULT_DELIVERY_MODE, Message.DEFAULT_PRIORITY, Message.DEFAULT_TIME_TO_LIVE);
+            fail("Should throw UnsupportedOperationException");
+        } catch (UnsupportedOperationException uoe) {}
+
+        try {
+            publisher.publish((Topic) null, message, Message.DEFAULT_DELIVERY_MODE, Message.DEFAULT_PRIORITY, Message.DEFAULT_TIME_TO_LIVE);
+            fail("Should throw InvalidDestinationException");
+        } catch (InvalidDestinationException ide) {}
+    }
+}

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/NoOpAsyncResultTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/NoOpAsyncResultTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/NoOpAsyncResultTest.java
new file mode 100644
index 0000000..2712068
--- /dev/null
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/NoOpAsyncResultTest.java
@@ -0,0 +1,52 @@
+/*
+ * 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;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+public class NoOpAsyncResultTest {
+
+    @Test
+    public void testDefaultToComplete() {
+        NoOpAsyncResult result = new NoOpAsyncResult();
+        assertTrue(result.isComplete());
+    }
+
+    @Test
+    public void testOnSuccess() {
+        NoOpAsyncResult result = new NoOpAsyncResult();
+
+        assertTrue(result.isComplete());
+        result.onSuccess();
+        result.onFailure(new IOException());
+        assertTrue(result.isComplete());
+    }
+
+    @Test
+    public void testOnFailure() {
+        NoOpAsyncResult result = new NoOpAsyncResult();
+
+        assertTrue(result.isComplete());
+        result.onFailure(new IOException());
+        result.onSuccess();
+        assertTrue(result.isComplete());
+    }
+}

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/ProviderFutureTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/ProviderFutureTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/ProviderFutureTest.java
new file mode 100644
index 0000000..210077c
--- /dev/null
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/ProviderFutureTest.java
@@ -0,0 +1,215 @@
+/*
+ * 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;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.junit.Test;
+
+public class ProviderFutureTest {
+
+    @Test
+    public void testIsComplete() {
+        ProviderFuture future = new ProviderFuture();
+
+        assertFalse(future.isComplete());
+        future.onSuccess();
+        assertTrue(future.isComplete());
+    }
+
+    @Test(timeout = 10000)
+    public void testOnSuccess() {
+        ProviderFuture future = new ProviderFuture();
+
+        future.onSuccess();
+        try {
+            future.sync();
+        } catch (IOException cause) {
+            fail("Should throw an error");
+        }
+    }
+
+    @Test(timeout = 10000)
+    public void testOnFailure() {
+        ProviderFuture future = new ProviderFuture();
+        IOException ex = new IOException();
+
+        future.onFailure(ex);
+        try {
+            future.sync(5, TimeUnit.SECONDS);
+            fail("Should throw an error");
+        } catch (IOException cause) {
+            assertSame(cause, ex);
+        }
+    }
+
+    @Test(timeout = 10000)
+    public void testOnSuccessCallsSynchronization() {
+        final AtomicBoolean syncCalled = new AtomicBoolean(false);
+        ProviderFuture future = new ProviderFuture(new ProviderSynchronization() {
+
+            @Override
+            public void onPendingSuccess() {
+                syncCalled.set(true);
+            }
+
+            @Override
+            public void onPendingFailure(Throwable cause) {
+            }
+        });
+
+        future.onSuccess();
+        try {
+            future.sync(5, TimeUnit.SECONDS);
+        } catch (IOException cause) {
+            fail("Should throw an error");
+        }
+
+        assertTrue("Synchronization not called", syncCalled.get());
+    }
+
+    @Test(timeout = 10000)
+    public void testOnFailureCallsSynchronization() {
+        final AtomicBoolean syncCalled = new AtomicBoolean(false);
+        ProviderFuture future = new ProviderFuture(new ProviderSynchronization() {
+
+            @Override
+            public void onPendingSuccess() {
+            }
+
+            @Override
+            public void onPendingFailure(Throwable cause) {
+                syncCalled.set(true);
+            }
+        });
+
+        IOException ex = new IOException();
+
+        future.onFailure(ex);
+        try {
+            future.sync(5, TimeUnit.SECONDS);
+            fail("Should throw an error");
+        } catch (IOException cause) {
+            assertSame(cause, ex);
+        }
+
+        assertTrue("Synchronization not called", syncCalled.get());
+    }
+
+    @Test(timeout = 10000)
+    public void testSuccessfulStateIsFixed() {
+        ProviderFuture future = new ProviderFuture();
+        IOException ex = new IOException();
+
+        future.onSuccess();
+        future.onFailure(ex);
+        try {
+            future.sync(5, TimeUnit.SECONDS);
+        } catch (IOException cause) {
+            fail("Should throw an error");
+        }
+    }
+
+    @Test(timeout = 10000)
+    public void testFailedStateIsFixed() {
+        ProviderFuture future = new ProviderFuture();
+        IOException ex = new IOException();
+
+        future.onFailure(ex);
+        future.onSuccess();
+        try {
+            future.sync(5, TimeUnit.SECONDS);
+            fail("Should throw an error");
+        } catch (IOException cause) {
+            assertSame(cause, ex);
+        }
+    }
+
+    @Test(timeout = 10000)
+    public void testSyncHandlesInterruption() throws InterruptedException {
+        final ProviderFuture future = new ProviderFuture();
+
+        final CountDownLatch syncing = new CountDownLatch(1);
+        final CountDownLatch done = new CountDownLatch(1);
+        final AtomicBoolean interrupted = new AtomicBoolean(false);
+
+        Thread runner = new Thread(new Runnable() {
+
+            @Override
+            public void run() {
+                try {
+                    syncing.countDown();
+                    future.sync();
+                } catch (IOException cause) {
+                    if (cause.getCause() instanceof InterruptedException) {
+                        interrupted.set(true);
+                    }
+                } finally {
+                    done.countDown();
+                }
+            }
+        });
+        runner.start();
+        assertTrue(syncing.await(5, TimeUnit.SECONDS));
+        runner.interrupt();
+
+        assertTrue(done.await(5, TimeUnit.SECONDS));
+
+        assertTrue(interrupted.get());
+    }
+
+    @Test(timeout = 10000)
+    public void testTimedSyncHandlesInterruption() throws InterruptedException {
+        final ProviderFuture future = new ProviderFuture();
+
+        final CountDownLatch syncing = new CountDownLatch(1);
+        final CountDownLatch done = new CountDownLatch(1);
+        final AtomicBoolean interrupted = new AtomicBoolean(false);
+
+        Thread runner = new Thread(new Runnable() {
+
+            @Override
+            public void run() {
+                try {
+                    syncing.countDown();
+                    future.sync(20, TimeUnit.SECONDS);
+                } catch (IOException cause) {
+                    if (cause.getCause() instanceof InterruptedException) {
+                        interrupted.set(true);
+                    }
+                } finally {
+                    done.countDown();
+                }
+            }
+        });
+        runner.start();
+        assertTrue(syncing.await(5, TimeUnit.SECONDS));
+        runner.interrupt();
+
+        assertTrue(done.await(5, TimeUnit.SECONDS));
+
+        assertTrue(interrupted.get());
+    }
+}

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/ProviderWrapperTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/ProviderWrapperTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/ProviderWrapperTest.java
index 602617d..3da448b 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/ProviderWrapperTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/ProviderWrapperTest.java
@@ -16,20 +16,391 @@
  */
 package org.apache.qpid.jms.provider;
 
-import org.apache.qpid.jms.provider.mock.MockProvider;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.qpid.jms.message.JmsInboundMessageDispatch;
+import org.apache.qpid.jms.message.JmsOutboundMessageDispatch;
+import org.apache.qpid.jms.meta.JmsConnectionId;
+import org.apache.qpid.jms.meta.JmsConsumerId;
+import org.apache.qpid.jms.meta.JmsSessionId;
+import org.apache.qpid.jms.meta.JmsSessionInfo;
+import org.apache.qpid.jms.meta.JmsTransactionId;
+import org.apache.qpid.jms.meta.JmsTransactionInfo;
+import org.apache.qpid.jms.provider.ProviderConstants.ACK_TYPE;
 import org.apache.qpid.jms.test.QpidJmsTestCase;
-import org.junit.After;
+import org.junit.Test;
+import org.mockito.Mockito;
 
 public class ProviderWrapperTest extends QpidJmsTestCase{
 
-    MockProvider mockProvider = null;
+    @Test
+    public void testGetMessageFactory() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+
+        wrapper.getMessageFactory();
+        Mockito.verify(mockProvider).getMessageFactory();
+    }
+
+    @Test
+    public void testGetNext() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+
+        assertSame(mockProvider, wrapper.getNext());
+    }
+
+    @Test
+    public void testAcknowledgeMessage() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        JmsInboundMessageDispatch inbound = Mockito.mock(JmsInboundMessageDispatch.class);
+        AsyncResult result = Mockito.mock(AsyncResult.class);
+
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+
+        wrapper.acknowledge(inbound, ACK_TYPE.ACCEPTED, result);
+        Mockito.verify(mockProvider).acknowledge(inbound, ACK_TYPE.ACCEPTED, result);
+    }
+
+    @Test
+    public void testAcknowledgeSession() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        AsyncResult result = Mockito.mock(AsyncResult.class);
+        JmsSessionId sessionId = new JmsSessionId("ID:TEST", 1);
+
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
 
-    @Override
-    @After
-    public void tearDown() throws Exception {
-        if (mockProvider != null) {
-            mockProvider.close();
+        wrapper.acknowledge(sessionId, ACK_TYPE.ACCEPTED, result);
+        Mockito.verify(mockProvider).acknowledge(sessionId, ACK_TYPE.ACCEPTED, result);
+    }
+
+    @Test
+    public void testRecover() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        AsyncResult result = Mockito.mock(AsyncResult.class);
+        JmsSessionId sessionId = new JmsSessionId("ID:TEST", 1);
+
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+
+        wrapper.recover(sessionId, result);
+        Mockito.verify(mockProvider).recover(sessionId, result);
+    }
+
+    @Test
+    public void testStart() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+
+        try {
+            wrapper.start();
+            fail("should have thrown exception due to no listener");
+        } catch (IllegalStateException ise) {
         }
-        super.tearDown();
+
+        ProviderListener listener = Mockito.mock(ProviderListener.class);
+
+        wrapper.setProviderListener(listener);
+        wrapper.start();
+
+        assertSame(listener, wrapper.getProviderListener());
+
+        Mockito.verify(mockProvider).start();
+    }
+
+    @Test
+    public void testClose() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+
+        wrapper.close();
+        Mockito.verify(mockProvider).close();
+    }
+
+    @Test
+    public void testConnect() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+
+        wrapper.connect();
+        Mockito.verify(mockProvider).connect();
+    }
+
+    @Test
+    public void testGetRemoteURI() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+
+        wrapper.getRemoteURI();
+        Mockito.verify(mockProvider).getRemoteURI();
+    }
+
+    @Test
+    public void testCreate() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        AsyncResult result = Mockito.mock(AsyncResult.class);
+        JmsSessionId sessionId = new JmsSessionId("ID:TEST", 1);
+        JmsSessionInfo session = new JmsSessionInfo(sessionId);
+
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+
+        wrapper.create(session, result);
+        Mockito.verify(mockProvider).create(session, result);
+    }
+
+    @Test
+    public void testStartResource() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        AsyncResult result = Mockito.mock(AsyncResult.class);
+        JmsSessionId sessionId = new JmsSessionId("ID:TEST", 1);
+        JmsSessionInfo session = new JmsSessionInfo(sessionId);
+
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+
+        wrapper.start(session, result);
+        Mockito.verify(mockProvider).start(session, result);
+    }
+
+    @Test
+    public void testStopResource() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        AsyncResult result = Mockito.mock(AsyncResult.class);
+        JmsSessionId sessionId = new JmsSessionId("ID:TEST", 1);
+        JmsSessionInfo session = new JmsSessionInfo(sessionId);
+
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+
+        wrapper.stop(session, result);
+        Mockito.verify(mockProvider).stop(session, result);
+    }
+
+    @Test
+    public void testDestroy() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        AsyncResult result = Mockito.mock(AsyncResult.class);
+        JmsSessionId sessionId = new JmsSessionId("ID:TEST", 1);
+        JmsSessionInfo session = new JmsSessionInfo(sessionId);
+
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+
+        wrapper.destroy(session, result);
+        Mockito.verify(mockProvider).destroy(session, result);
+    }
+
+    @Test
+    public void testSend() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        JmsOutboundMessageDispatch envelope = Mockito.mock(JmsOutboundMessageDispatch.class);
+        AsyncResult result = Mockito.mock(AsyncResult.class);
+
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+
+        wrapper.send(envelope, result);
+        Mockito.verify(mockProvider).send(envelope, result);
+    }
+
+    @Test
+    public void testUnsubscribe() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        AsyncResult result = Mockito.mock(AsyncResult.class);
+        String subscriptionName = "subName";
+
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+
+        wrapper.unsubscribe(subscriptionName, result);
+        Mockito.verify(mockProvider).unsubscribe(subscriptionName, result);
+    }
+
+    @Test
+    public void testCommit() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        AsyncResult result = Mockito.mock(AsyncResult.class);
+        JmsConnectionId connectionId = new JmsConnectionId("ID");
+        JmsSessionId sessionId = new JmsSessionId("ID:TEST", 1);
+        JmsTransactionId txId = new JmsTransactionId(connectionId, 1);
+        JmsTransactionInfo txInfo = new JmsTransactionInfo(sessionId, txId);
+
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+
+        wrapper.commit(txInfo, result);
+        Mockito.verify(mockProvider).commit(txInfo, result);
+    }
+
+    @Test
+    public void testRollback() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        AsyncResult result = Mockito.mock(AsyncResult.class);
+        JmsConnectionId connectionId = new JmsConnectionId("ID");
+        JmsSessionId sessionId = new JmsSessionId("ID:TEST", 1);
+        JmsTransactionId txId = new JmsTransactionId(connectionId, 1);
+        JmsTransactionInfo txInfo = new JmsTransactionInfo(sessionId, txId);
+
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+
+        wrapper.rollback(txInfo, result);
+        Mockito.verify(mockProvider).rollback(txInfo, result);
+    }
+
+    @Test
+    public void testPull() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        AsyncResult result = Mockito.mock(AsyncResult.class);
+        JmsSessionId sessionId = new JmsSessionId("ID:TEST", 1);
+        JmsConsumerId consumerId = new JmsConsumerId(sessionId, 1);
+
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+
+        wrapper.pull(consumerId, 1000, result);
+        Mockito.verify(mockProvider).pull(consumerId, 1000, result);
+    }
+
+    @Test
+    public void testOnInboundMessage() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+        JmsInboundMessageDispatch envelope = Mockito.mock(JmsInboundMessageDispatch.class);
+        ProviderListener listener = Mockito.mock(ProviderListener.class);
+
+        wrapper.setProviderListener(listener);
+        wrapper.onInboundMessage(envelope);
+
+        Mockito.verify(listener).onInboundMessage(envelope);
+    }
+
+    @Test
+    public void testOnCompletedMessageSend() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+        JmsOutboundMessageDispatch envelope = Mockito.mock(JmsOutboundMessageDispatch.class);
+        ProviderListener listener = Mockito.mock(ProviderListener.class);
+
+        wrapper.setProviderListener(listener);
+        wrapper.onCompletedMessageSend(envelope);
+
+        Mockito.verify(listener).onCompletedMessageSend(envelope);
+    }
+
+    @Test
+    public void testOnFailedMessageSend() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+        JmsOutboundMessageDispatch envelope = Mockito.mock(JmsOutboundMessageDispatch.class);
+        ProviderListener listener = Mockito.mock(ProviderListener.class);
+        IOException ex = new IOException();
+
+        wrapper.setProviderListener(listener);
+        wrapper.onFailedMessageSend(envelope, ex);
+
+        Mockito.verify(listener).onFailedMessageSend(envelope, ex);
+    }
+
+    @Test
+    public void testOnConnectionInterrupted() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+        ProviderListener listener = Mockito.mock(ProviderListener.class);
+        URI remoteURI = new URI("tcp://localhost");
+
+        wrapper.setProviderListener(listener);
+        wrapper.onConnectionInterrupted(remoteURI);
+
+        Mockito.verify(listener).onConnectionInterrupted(remoteURI);
+    }
+
+    @Test
+    public void testOnConnectionEstablished() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+        ProviderListener listener = Mockito.mock(ProviderListener.class);
+        URI remoteURI = new URI("tcp://localhost");
+        Mockito.when(mockProvider.getRemoteURI()).thenReturn(remoteURI);
+
+        wrapper.setProviderListener(listener);
+        wrapper.onConnectionEstablished(remoteURI);
+
+        Mockito.verify(listener).onConnectionEstablished(remoteURI);
+    }
+
+    @Test
+    public void testOnConnectionRestored() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+        ProviderListener listener = Mockito.mock(ProviderListener.class);
+        URI remoteURI = new URI("tcp://localhost");
+
+        wrapper.setProviderListener(listener);
+        wrapper.onConnectionRestored(remoteURI);
+
+        Mockito.verify(listener).onConnectionRestored(remoteURI);
+    }
+
+    @Test
+    public void testOnResourceClosed() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+        ProviderListener listener = Mockito.mock(ProviderListener.class);
+        JmsSessionId sessionId = new JmsSessionId("ID:TEST", 1);
+        JmsSessionInfo session = new JmsSessionInfo(sessionId);
+        IOException ex = new IOException();
+
+        wrapper.setProviderListener(listener);
+        wrapper.onResourceClosed(session, ex);
+
+        Mockito.verify(listener).onResourceClosed(session, ex);
+    }
+
+    @Test
+    public void testOnProviderException() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+        ProviderListener listener = Mockito.mock(ProviderListener.class);
+        IOException ex = new IOException();
+
+        wrapper.setProviderListener(listener);
+        wrapper.onProviderException(ex);
+
+        Mockito.verify(listener).onProviderException(ex);
+    }
+
+    @Test
+    public void testOnConnectionFailure() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+        ProviderListener listener = Mockito.mock(ProviderListener.class);
+        IOException ex = new IOException();
+
+        wrapper.setProviderListener(listener);
+        wrapper.onConnectionFailure(ex);
+
+        Mockito.verify(listener).onConnectionFailure(ex);
+    }
+
+    @Test
+    public void onConnectionRecovery() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+        ProviderListener listener = Mockito.mock(ProviderListener.class);
+
+        wrapper.setProviderListener(listener);
+        wrapper.onConnectionRecovery(mockProvider);
+
+        Mockito.verify(listener).onConnectionRecovery(mockProvider);
+    }
+
+    @Test
+    public void onConnectionRecoverd() throws Exception {
+        Provider mockProvider = Mockito.mock(Provider.class);
+        ProviderWrapper<Provider> wrapper = new ProviderWrapper<Provider>(mockProvider);
+        ProviderListener listener = Mockito.mock(ProviderListener.class);
+
+        wrapper.setProviderListener(listener);
+        wrapper.onConnectionRecovered(mockProvider);
+
+        Mockito.verify(listener).onConnectionRecovered(mockProvider);
     }
 }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/WrappedAsyncResultTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/WrappedAsyncResultTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/WrappedAsyncResultTest.java
new file mode 100644
index 0000000..52e888b
--- /dev/null
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/WrappedAsyncResultTest.java
@@ -0,0 +1,67 @@
+/*
+ * 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;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+public class WrappedAsyncResultTest {
+
+    @Test
+    public void testCreateWithNull() {
+        try {
+            new WrappedAsyncResult(null) {};
+        } catch (IllegalArgumentException iae) {}
+    }
+
+    @Test
+    public void testGetWrapped() {
+        ProviderFuture future = new ProviderFuture();
+        WrappedAsyncResult wrapped = new WrappedAsyncResult(future) {};
+
+        assertSame(wrapped.getWrappedRequest(), future);
+    }
+
+    @Test
+    public void testOnSuccessPassthrough() {
+        ProviderFuture future = new ProviderFuture();
+        WrappedAsyncResult wrapped = new WrappedAsyncResult(future) {};
+
+        assertFalse(future.isComplete());
+        assertFalse(wrapped.isComplete());
+        wrapped.onSuccess();
+        assertTrue(wrapped.isComplete());
+        assertTrue(future.isComplete());
+    }
+
+    @Test
+    public void testOnFailurePassthrough() {
+        ProviderFuture future = new ProviderFuture();
+        WrappedAsyncResult wrapped = new WrappedAsyncResult(future) {};
+
+        assertFalse(future.isComplete());
+        assertFalse(wrapped.isComplete());
+        wrapped.onFailure(new IOException());
+        assertTrue(wrapped.isComplete());
+        assertTrue(future.isComplete());
+    }
+}

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/AmqpProviderFactoryTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/AmqpProviderFactoryTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/AmqpProviderFactoryTest.java
index da5f54d..e49e42e 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/AmqpProviderFactoryTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/AmqpProviderFactoryTest.java
@@ -73,6 +73,12 @@ public class AmqpProviderFactoryTest extends QpidJmsTestCase {
         AmqpProviderFactory.create(badOptionsURI);
     }
 
+    @Test(timeout = 20000, expected=IOException.class)
+    public void testCreateProviderFailsWithMissingScheme() throws IOException, Exception {
+        URI missingSchemeURI = new URI(null, null, peerURI.getHost(), peerURI.getPort(), null, null, null);
+        AmqpProviderFactory.create(missingSchemeURI);
+    }
+
     @Test(timeout = 20000)
     public void testCreateProviderHasDefaultIdleTimeoutValue() throws IOException, Exception {
         Provider provider = AmqpProviderFactory.create(new URI(peerURI.toString()));

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMapMessageFacadeTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMapMessageFacadeTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMapMessageFacadeTest.java
index 6716fb6..763298b 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMapMessageFacadeTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMapMessageFacadeTest.java
@@ -64,6 +64,12 @@ public class AmqpJmsMapMessageFacadeTest extends AmqpJmsMessageTypesTestCase {
     }
 
     @Test
+    public void testNewMessageToSendReportsNoBody() throws Exception {
+        AmqpJmsMapMessageFacade amqpMapMessageFacade = createNewMapMessageFacade();
+        amqpMapMessageFacade.hasBody();
+    }
+
+    @Test
     public void testNewMessageToSendReportsIsEmpty() throws Exception {
         AmqpJmsMapMessageFacade amqpMapMessageFacade = createNewMapMessageFacade();
         assertFalse(amqpMapMessageFacade.getMapNames().hasMoreElements());
@@ -153,9 +159,11 @@ public class AmqpJmsMapMessageFacadeTest extends AmqpJmsMessageTypesTestCase {
         Object result = amqpMapMessageFacade.get("entry1");
         assertNotNull(result);
         assertTrue(result instanceof Boolean);
+        assertTrue(amqpMapMessageFacade.hasBody());
 
         // Should be able to use the message, e.g clearing it and adding to it.
         amqpMapMessageFacade.clearBody();
+        assertFalse(amqpMapMessageFacade.hasBody());
         amqpMapMessageFacade.put("entry", "value");
     }
 

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacadeTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacadeTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacadeTest.java
index 3b838d7..22eef19 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacadeTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsMessageFacadeTest.java
@@ -27,6 +27,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import java.nio.ByteBuffer;
 import java.util.Arrays;
@@ -53,6 +54,7 @@ import org.apache.qpid.proton.amqp.Symbol;
 import org.apache.qpid.proton.amqp.UnsignedByte;
 import org.apache.qpid.proton.amqp.UnsignedInteger;
 import org.apache.qpid.proton.amqp.UnsignedLong;
+import org.apache.qpid.proton.amqp.messaging.AmqpValue;
 import org.apache.qpid.proton.amqp.messaging.ApplicationProperties;
 import org.apache.qpid.proton.amqp.messaging.DeliveryAnnotations;
 import org.apache.qpid.proton.amqp.messaging.Footer;
@@ -1090,6 +1092,13 @@ public class AmqpJmsMessageFacadeTest extends AmqpJmsMessageTypesTestCase  {
     }
 
     @Test
+    public void testSetCorrelationIdBytesNullDoesNotCreateProperties() throws Exception {
+        AmqpJmsMessageFacade amqpMessageFacade = createNewMessageFacade();
+        amqpMessageFacade.setCorrelationIdBytes(null);
+        assertNull("Unexpected Properties Object in AMQP message", amqpMessageFacade.getProperties());
+    }
+
+    @Test
     public void testGetCorrelationIdBytesOnNewMessage() throws Exception {
         AmqpJmsMessageFacade amqpMessageFacade = createNewMessageFacade();
 
@@ -1097,6 +1106,21 @@ public class AmqpJmsMessageFacadeTest extends AmqpJmsMessageTypesTestCase  {
     }
 
     @Test
+    public void testGetCorrelationIdBytesOnMessageWithNonBinaryContent() throws Exception {
+        AmqpJmsMessageFacade amqpMessageFacade = createNewMessageFacade();
+
+        Properties properties = new Properties();
+        properties.setCorrelationId(UUID.randomUUID());
+
+        amqpMessageFacade.setProperties(properties);
+
+        try {
+            amqpMessageFacade.getCorrelationIdBytes();
+            fail("Should have thrown JMSException");
+        } catch (JMSException ex) {}
+    }
+
+    @Test
     public void testGetCorrelationIdBytesOnReceievedMessageWithBinaryId() throws Exception {
         Binary testCorrelationId = createBinaryId();
         byte[] bytes = testCorrelationId.getArray();
@@ -1148,12 +1172,7 @@ public class AmqpJmsMessageFacadeTest extends AmqpJmsMessageTypesTestCase  {
         }
     }
 
-    @Test
-    public void testGetMessageIdIsNullOnNewMessage() {
-        AmqpJmsMessageFacade amqpMessageFacade = createNewMessageFacade();
-
-        assertNull("Expected messageId value to be null on new message", amqpMessageFacade.getMessageId());
-    }
+    //--- Message Id field ---
 
     /**
      * Test that setting then getting a String value as the messageId returns the expected value
@@ -1296,6 +1315,56 @@ public class AmqpJmsMessageFacadeTest extends AmqpJmsMessageTypesTestCase  {
         return new Binary(idBytes);
     }
 
+    // --- Provider Message Id field ---
+
+    @Test
+    public void testGetProviderMessageIdObjectOnNewMessage() throws Exception {
+        AmqpJmsMessageFacade amqpMessageFacade = createNewMessageFacade();
+        assertNull("Expected messageId not returned", amqpMessageFacade.getProviderMessageIdObject());
+    }
+
+    /**
+     * Test that setting then getting a String value as the provider messageId returns the expected value
+     *
+     * @throws Exception if the test encounters an unexpected error
+     */
+    @Test
+    public void testSetGetProviderMessageIdObjectOnNewMessageWithString() throws Exception {
+        String testMessageId = "ID:myStringMessageId";
+
+        AmqpJmsMessageFacade amqpMessageFacade = createNewMessageFacade();
+
+        amqpMessageFacade.setProviderMessageIdObject(testMessageId);
+
+        assertEquals("Expected messageId not returned", testMessageId, amqpMessageFacade.getProviderMessageIdObject());
+        assertEquals("ID strings were not equal", testMessageId, amqpMessageFacade.getProviderMessageIdObject());
+    }
+
+    @Test
+    public void testSetProviderMessageIdObjectNullClearsProperty() throws Exception {
+        String testMessageId = "ID:myStringMessageId";
+
+        AmqpJmsMessageFacade amqpMessageFacade = createNewMessageFacade();
+
+        amqpMessageFacade.setProviderMessageIdObject(testMessageId);
+        assertEquals("Expected messageId not returned", testMessageId, amqpMessageFacade.getProviderMessageIdObject());
+
+        amqpMessageFacade.setProviderMessageIdObject(null);
+        assertNull("Expected messageId not returned", amqpMessageFacade.getProviderMessageIdObject());
+    }
+
+    @Test
+    public void testSetProviderMessageIdObjectNullDoesNotCreateProperties() throws Exception {
+        AmqpJmsMessageFacade amqpMessageFacade = createNewMessageFacade();
+
+        assertNull("Expected null value not returned", amqpMessageFacade.getProperties());
+
+        amqpMessageFacade.setProviderMessageIdObject(null);
+
+        assertNull("Expected null value not returned", amqpMessageFacade.getProviderMessageIdObject());
+        assertNull("Expected null value not returned", amqpMessageFacade.getProperties());
+    }
+
     // --- creation-time field  ---
 
     @Test
@@ -2145,6 +2214,14 @@ public class AmqpJmsMessageFacadeTest extends AmqpJmsMessageTypesTestCase  {
     // ===============================================
 
     @Test
+    public void testMessageHasBodyDetectsPayload() throws Exception {
+        AmqpJmsMessageFacade amqpMessageFacade = createNewMessageFacade();
+        assertFalse(amqpMessageFacade.hasBody());
+        amqpMessageFacade.setBody(new AmqpValue("test"));
+        assertTrue(amqpMessageFacade.hasBody());
+    }
+
+    @Test
     public void testClearBodyRemoveMessageBody() {
         Message message = Message.Factory.create();
         AmqpJmsMessageFacade amqpMessageFacade = createReceivedMessageFacade(createMockAmqpConsumer(), message);

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsStreamMessageFacadeTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsStreamMessageFacadeTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsStreamMessageFacadeTest.java
index 83ee4cd..f279975 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsStreamMessageFacadeTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsStreamMessageFacadeTest.java
@@ -45,6 +45,12 @@ import org.junit.Test;
 public class AmqpJmsStreamMessageFacadeTest extends AmqpJmsMessageTypesTestCase {
 
     @Test
+    public void testNewMessageToSendReportsNoBody() throws Exception {
+        AmqpJmsStreamMessageFacade amqpStreamMessageFacade = createNewStreamMessageFacade();
+        assertFalse("Message should report no body", amqpStreamMessageFacade.hasBody());
+    }
+
+    @Test
     public void testNewMessageToSendContainsMessageTypeAnnotation() throws Exception {
         AmqpJmsStreamMessageFacade amqpStreamMessageFacade = createNewStreamMessageFacade();
 
@@ -114,6 +120,7 @@ public class AmqpJmsStreamMessageFacadeTest extends AmqpJmsMessageTypesTestCase
 
         AmqpJmsStreamMessageFacade amqpStreamMessageFacade = createReceivedStreamMessageFacade(createMockAmqpConsumer(), message);
 
+        assertTrue("Message should report that it contains a body", amqpStreamMessageFacade.hasBody());
         assertEquals("Unexpected value retrieved", Boolean.FALSE, amqpStreamMessageFacade.peek());
         assertEquals("Unexpected value retrieved", Boolean.FALSE, amqpStreamMessageFacade.peek());
     }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsTextMessageFacadeTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsTextMessageFacadeTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsTextMessageFacadeTest.java
index bd517ad..aeb5fe1 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsTextMessageFacadeTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpJmsTextMessageFacadeTest.java
@@ -20,6 +20,7 @@ import static org.apache.qpid.jms.provider.amqp.message.AmqpMessageSupport.JMS_M
 import static org.apache.qpid.jms.provider.amqp.message.AmqpMessageSupport.JMS_TEXT_MESSAGE;
 import static org.apache.qpid.jms.provider.amqp.message.AmqpMessageSupport.getSymbol;
 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;
@@ -201,6 +202,14 @@ public class AmqpJmsTextMessageFacadeTest extends AmqpJmsMessageTypesTestCase {
     }
 
     @Test
+    public void testGetTextWithNonAmqpValueOrDataSectionReportsNoBody() throws Exception {
+        Message message = Message.Factory.create();
+        message.setBody(new AmqpSequence(new ArrayList<Object>()));
+        AmqpJmsTextMessageFacade amqpTextMessageFacade = createReceivedTextMessageFacade(createMockAmqpConsumer(), message);
+        assertFalse(amqpTextMessageFacade.hasBody());
+    }
+
+    @Test
     public void testGetTextWithNonAmqpValueOrDataSectionThrowsISE() throws Exception {
         Message message = Message.Factory.create();
         message.setBody(new AmqpSequence(new ArrayList<Object>()));

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpWritableBufferTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpWritableBufferTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpWritableBufferTest.java
index b583c27..992d628 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpWritableBufferTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/provider/amqp/message/AmqpWritableBufferTest.java
@@ -21,6 +21,8 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
+import java.nio.ByteBuffer;
+
 import org.junit.Test;
 
 import io.netty.buffer.ByteBuf;
@@ -40,6 +42,14 @@ public class AmqpWritableBufferTest {
     }
 
     @Test
+    public void testLimit() {
+        ByteBuf buffer = Unpooled.buffer(1024);
+        AmqpWritableBuffer writable = new AmqpWritableBuffer(buffer);
+
+        assertEquals(buffer.capacity(), writable.limit());
+    }
+
+    @Test
     public void testRemaining() {
         ByteBuf buffer = Unpooled.buffer(1024);
         AmqpWritableBuffer writable = new AmqpWritableBuffer(buffer);
@@ -80,4 +90,31 @@ public class AmqpWritableBufferTest {
         writable.position(1);
         assertEquals(1, writable.position());
     }
+
+    @Test
+    public void testPutByteBuffer() {
+        ByteBuffer input = ByteBuffer.allocate(1024);
+        input.put((byte) 1);
+        input.flip();
+
+        ByteBuf buffer = Unpooled.buffer(1024);
+        AmqpWritableBuffer writable = new AmqpWritableBuffer(buffer);
+
+        assertEquals(0, writable.position());
+        writable.put(input);
+        assertEquals(1, writable.position());
+    }
+
+    @Test
+    public void testPutByteBuf() {
+        ByteBuf input = Unpooled.buffer();
+        input.writeByte((byte) 1);
+
+        ByteBuf buffer = Unpooled.buffer(1024);
+        AmqpWritableBuffer writable = new AmqpWritableBuffer(buffer);
+
+        assertEquals(0, writable.position());
+        writable.put(input);
+        assertEquals(1, writable.position());
+    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/sasl/AbstractMechanismTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/sasl/AbstractMechanismTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/sasl/AbstractMechanismTest.java
new file mode 100644
index 0000000..768cc74
--- /dev/null
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/sasl/AbstractMechanismTest.java
@@ -0,0 +1,72 @@
+/*
+ * 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.sasl;
+
+import static org.junit.Assert.assertEquals;
+
+import java.security.Principal;
+
+import javax.security.sasl.SaslException;
+
+import org.junit.Test;
+
+public class AbstractMechanismTest {
+
+    @Test
+    public void testCompareTo() {
+        Mechanism mech1 = new Mechanism(1);
+        Mechanism mech2 = new Mechanism(2);
+
+        assertEquals(-1, mech1.compareTo(mech2));
+        assertEquals(0, mech1.compareTo(mech1));
+        assertEquals(1, mech2.compareTo(mech1));
+    }
+
+    private static class Mechanism extends AbstractMechanism {
+
+        private int prority;
+
+        public Mechanism(int priority) {
+            this.prority = priority;
+        }
+
+        @Override
+        public int getPriority() {
+            return prority;
+        }
+
+        @Override
+        public String getName() {
+            return getClass().getSimpleName();
+        }
+
+        @Override
+        public byte[] getInitialResponse() throws SaslException {
+            return null;
+        }
+
+        @Override
+        public byte[] getChallengeResponse(byte[] challenge) throws SaslException {
+            return null;
+        }
+
+        @Override
+        public boolean isApplicable(String username, String password, Principal localPrincipal) {
+            return false;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/sasl/AnonymousMechanismTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/sasl/AnonymousMechanismTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/sasl/AnonymousMechanismTest.java
index b87eff6..82b686f 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/sasl/AnonymousMechanismTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/sasl/AnonymousMechanismTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.qpid.jms.sasl;
 
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import java.security.Principal;
@@ -25,6 +26,24 @@ import org.junit.Test;
 public class AnonymousMechanismTest {
 
     @Test
+    public void testGetInitialResponseWithNullUserAndPassword() {
+        AnonymousMechanism mech = new AnonymousMechanism();
+
+        byte[] response = mech.getInitialResponse();
+        assertNotNull(response);
+        assertTrue(response.length == 0);
+    }
+
+    @Test
+    public void testGetChallengeResponse() {
+        AnonymousMechanism mech = new AnonymousMechanism();
+
+        byte[] response = mech.getChallengeResponse(new byte[1]);
+        assertNotNull(response);
+        assertTrue(response.length == 0);
+    }
+
+    @Test
     public void testIsApplicableWithNoCredentials() {
         AnonymousMechanism mech = new AnonymousMechanism();
 

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/sasl/ExternalMechanismTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/sasl/ExternalMechanismTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/sasl/ExternalMechanismTest.java
index 7bb6341..ab613b9 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/sasl/ExternalMechanismTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/sasl/ExternalMechanismTest.java
@@ -17,6 +17,7 @@
 package org.apache.qpid.jms.sasl;
 
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import java.security.Principal;
@@ -26,6 +27,24 @@ import org.junit.Test;
 public class ExternalMechanismTest {
 
     @Test
+    public void testGetInitialResponseWithNullUserAndPassword() {
+        ExternalMechanism mech = new ExternalMechanism();
+
+        byte[] response = mech.getInitialResponse();
+        assertNotNull(response);
+        assertTrue(response.length == 0);
+    }
+
+    @Test
+    public void testGetChallengeResponse() {
+        ExternalMechanism mech = new ExternalMechanism();
+
+        byte[] response = mech.getChallengeResponse(new byte[1]);
+        assertNotNull(response);
+        assertTrue(response.length == 0);
+    }
+
+    @Test
     public void testIsNotApplicableWithUserAndPasswordButNoPrincipal() {
         ExternalMechanism mech = new ExternalMechanism();
 

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/sasl/PlainMechanismTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/sasl/PlainMechanismTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/sasl/PlainMechanismTest.java
index 4a251d2..ac03286 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/sasl/PlainMechanismTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/sasl/PlainMechanismTest.java
@@ -17,6 +17,7 @@
 package org.apache.qpid.jms.sasl;
 
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import java.security.Principal;
@@ -26,6 +27,24 @@ import org.junit.Test;
 public class PlainMechanismTest {
 
     @Test
+    public void testGetInitialResponseWithNullUserAndPassword() {
+        PlainMechanism mech = new PlainMechanism();
+
+        byte[] response = mech.getInitialResponse();
+        assertNotNull(response);
+        assertTrue(response.length > 0);
+    }
+
+    @Test
+    public void testGetChallengeResponse() {
+        PlainMechanism mech = new PlainMechanism();
+
+        byte[] response = mech.getChallengeResponse(new byte[1]);
+        assertNotNull(response);
+        assertTrue(response.length == 0);
+    }
+
+    @Test
     public void testIsNotApplicableWithNoCredentials() {
         PlainMechanism mech = new PlainMechanism();
 

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/session/JmsSessionClosedTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/session/JmsSessionClosedTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/session/JmsSessionClosedTest.java
index 47f2ae4..8d3a310 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/session/JmsSessionClosedTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/session/JmsSessionClosedTest.java
@@ -207,6 +207,12 @@ public class JmsSessionClosedTest extends JmsConnectionTestSupport {
     }
 
     @Test(timeout=30000, expected=JMSException.class)
+    public void testCreateDurableConsumerSelectorBooleanFails() throws Exception {
+        Topic destination = session.createTopic("TEST");
+        session.createDurableConsumer(destination, "test", "a = b", false);
+    }
+
+    @Test(timeout=30000, expected=JMSException.class)
     public void testCreateQueueBrowserFails() throws Exception {
         Queue destination = session.createQueue("test");
         session.createBrowser(destination);

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/session/JmsTopicSessionClosedTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/session/JmsTopicSessionClosedTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/session/JmsTopicSessionClosedTest.java
index d3dfd64..eb1a9b5 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/session/JmsTopicSessionClosedTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/session/JmsTopicSessionClosedTest.java
@@ -87,6 +87,11 @@ public class JmsTopicSessionClosedTest extends JmsConnectionTestSupport {
         session.createDurableSubscriber(destination, "foo", "color = blue", false);
     }
 
+    @Test(timeout=30000, expected=javax.jms.IllegalStateException.class)
+    public void testCreateDurableConsumerWithSelector() throws Exception {
+        session.createDurableConsumer(destination, "foo", "color = blue", false);
+    }
+
     @Test(timeout=30000)
     public void testSubscriberCloseAgain() throws Exception {
         // Close it again (closing the session should have closed it already).

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/83f5507c/qpid-jms-client/src/test/java/org/apache/qpid/jms/util/URISupportTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/util/URISupportTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/util/URISupportTest.java
index 6495858..1ccc878 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/util/URISupportTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/util/URISupportTest.java
@@ -19,10 +19,13 @@ package org.apache.qpid.jms.util;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -138,6 +141,12 @@ public class URISupportTest {
     }
 
     @Test
+    public void testCheckParenthesisWithNullOrEmpty() throws Exception {
+        assertTrue(URISupport.checkParenthesis(null));
+        assertTrue(URISupport.checkParenthesis(""));
+    }
+
+    @Test
     public void testCreateWithQuery() throws Exception {
         URI source = new URI("vm://localhost");
         URI dest = PropertyUtil.replaceQuery(source, "network=true&one=two");
@@ -236,6 +245,40 @@ public class URISupportTest {
     }
 
     @Test
+    public void testIndexOfParenthesisMatchExceptions() throws URISyntaxException {
+        try {
+            URISupport.indexOfParenthesisMatch(null, -1);
+            fail("Should have thrown IllegalArgumentException");
+        } catch (IllegalArgumentException iobe) {}
+
+        try {
+            URISupport.indexOfParenthesisMatch("tcp", 4);
+            fail("Should have thrown IllegalArgumentException");
+        } catch (IllegalArgumentException iobe) {}
+
+        try {
+            URISupport.indexOfParenthesisMatch("tcp", 2);
+            fail("Should have thrown IllegalArgumentException");
+        } catch (IllegalArgumentException iobe) {}
+
+        try {
+            URISupport.indexOfParenthesisMatch("(tcp", 0);
+            fail("Should have thrown URISyntaxException");
+        } catch (URISyntaxException iobe) {}
+    }
+
+    @Test
+    public void testApplyParametersWithNullOrEmptyParameters() throws URISyntaxException {
+        URI uri = new URI("tcp://localhost");
+
+        URI result = URISupport.applyParameters(uri, null, "value.");
+        assertSame(uri, result);
+
+        result = URISupport.applyParameters(uri, Collections.<String, String>emptyMap(), "value.");
+        assertSame(uri, result);
+    }
+
+    @Test
     public void testIsCompositeURINoQueryNoSlashesNoParentheses() throws URISyntaxException {
         assertFalse("test:part1" + " must be detected as non-composite URI", URISupport.isCompositeURI(new URI("test:part1")));
     }


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