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

[2/2] qpid-jms git commit: QPIDJMS-235: fix up to ensure option behaviour reflects no ClientID having been set, add additional test to cover it, make existing test stricter and remove duplicate

QPIDJMS-235: fix up to ensure option behaviour reflects no ClientID having been set, add additional test to cover it, make existing test stricter and remove duplicate


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

Branch: refs/heads/master
Commit: 0f0cfba5aeb825c75579bca8bb63024bb82a8fbc
Parents: 2e03565
Author: Robert Gemmell <ro...@apache.org>
Authored: Fri Dec 16 11:14:22 2016 +0000
Committer: Robert Gemmell <ro...@apache.org>
Committed: Fri Dec 16 11:14:22 2016 +0000

----------------------------------------------------------------------
 .../java/org/apache/qpid/jms/JmsConnection.java |  2 +-
 .../apache/qpid/jms/JmsConnectionFactory.java   | 14 ++++--
 .../apache/qpid/jms/meta/JmsConnectionInfo.java | 10 ++++
 .../integration/ConnectionIntegrationTest.java  | 23 +++------
 .../SubscriptionsIntegrationTest.java           | 49 ++++++++++++++++++++
 .../qpid/jms/meta/JmsConnectionInfoTest.java    |  3 ++
 6 files changed, 78 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0f0cfba5/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnection.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnection.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnection.java
index 2337260..d04d75d 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnection.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnection.java
@@ -166,7 +166,7 @@ public class JmsConnection implements AutoCloseable, Connection, TopicConnection
             throw JmsExceptionSupport.create(ex);
         }
 
-        if (connectionInfo.isExplicitClientID()) {
+        if (connectionInfo.isExplicitClientID() || !connectionInfo.isAwaitClientID()) {
             createJmsConnection();
         }
 

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0f0cfba5/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnectionFactory.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnectionFactory.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnectionFactory.java
index 0101d11..5ff596e 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnectionFactory.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/JmsConnectionFactory.java
@@ -245,8 +245,8 @@ public class JmsConnectionFactory extends JNDIStorable implements ConnectionFact
     protected JmsConnectionInfo configureConnectionInfo(String username, String password) throws JMSException {
         try {
             Map<String, String> properties = PropertyUtil.getProperties(this);
-            // We must ensure that we apply the clientID last, since setting it on
-            // the Connection object provokes establishing the underlying connection.
+            // Pull out the clientID prop, we need to act differently according to
+            // whether it was set in the URI or not.
             boolean userSpecifiedClientId = false;
             if (properties.containsKey(CLIENT_ID_PROP)) {
                 userSpecifiedClientId = true;
@@ -266,16 +266,20 @@ public class JmsConnectionFactory extends JNDIStorable implements ConnectionFact
             connectionInfo.setDeserializationPolicy(deserializationPolicy.copy());
             connectionInfo.setSslContextOverride(sslContext);
 
+            // Set properties to make additional configuration changes
             PropertyUtil.setProperties(connectionInfo, properties);
+
+            // Ensure we use the user and pass provided for this particular connection
             connectionInfo.setUsername(username);
             connectionInfo.setPassword(password);
+
             connectionInfo.setConfiguredURI(remoteURI);
+
+            // Set the ClientID/container-id details
             if (userSpecifiedClientId) {
                 connectionInfo.setClientId(clientID, true);
             } else {
-                // If we aren't waiting on a client ID then we just treat a generated Client ID as
-                // the user specified version and connection open will commence.
-                connectionInfo.setClientId(getClientIdGenerator().generateId(), !isAwaitClientID());
+                connectionInfo.setClientId(getClientIdGenerator().generateId(), false);
             }
 
             return connectionInfo;

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0f0cfba5/qpid-jms-client/src/main/java/org/apache/qpid/jms/meta/JmsConnectionInfo.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/meta/JmsConnectionInfo.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/meta/JmsConnectionInfo.java
index 9f2175b..5af90e6 100644
--- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/meta/JmsConnectionInfo.java
+++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/meta/JmsConnectionInfo.java
@@ -62,6 +62,7 @@ public final class JmsConnectionInfo implements JmsResource, Comparable<JmsConne
     private boolean localMessageExpiry;
     private boolean populateJMSXUserID;
     private boolean useDaemonThread;
+    private boolean awaitClientID = true;
     private long sendTimeout = DEFAULT_SEND_TIMEOUT;
     private long requestTimeout = DEFAULT_REQUEST_TIMEOUT;
     private long connectTimeout = DEFAULT_CONNECT_TIMEOUT;
@@ -95,6 +96,7 @@ public final class JmsConnectionInfo implements JmsResource, Comparable<JmsConne
     private void copy(JmsConnectionInfo copy) {
         copy.clientId = clientId;
         copy.explicitClientID = explicitClientID;
+        copy.awaitClientID = awaitClientID;
         copy.username = username;
         copy.password = password;
         copy.forceAsyncSend = forceAsyncSend;
@@ -369,6 +371,14 @@ public final class JmsConnectionInfo implements JmsResource, Comparable<JmsConne
         this.useDaemonThread = useDaemonThread;
     }
 
+    public boolean isAwaitClientID() {
+        return awaitClientID;
+    }
+
+    public void setAwaitClientID(boolean awaitClientID) {
+        this.awaitClientID = awaitClientID;
+    }
+
     @Override
     public String toString() {
         return "JmsConnectionInfo { " + getId() +

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0f0cfba5/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/ConnectionIntegrationTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/ConnectionIntegrationTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/ConnectionIntegrationTest.java
index 8cba29d..f66ca6d 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/ConnectionIntegrationTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/ConnectionIntegrationTest.java
@@ -585,19 +585,10 @@ public class ConnectionIntegrationTest extends QpidJmsTestCase {
     }
 
     @Test(timeout = 20000)
-    public void testWaitForClientIDBeforeOpen() throws Exception {
-        doTestWaitForClientIDBeforeOpen(true);
-    }
-
-    @Test(timeout = 20000)
-    public void testDonNotWaitForClientIDBeforeOpen() throws Exception {
-        doTestWaitForClientIDBeforeOpen(false);
-    }
-
-    private void doTestWaitForClientIDBeforeOpen(boolean waitForClientID) throws Exception {
+    public void testDontAwaitClientIDBeforeOpen() throws Exception {
         try (TestAmqpPeer testPeer = new TestAmqpPeer();) {
 
-            String uri = "amqp://localhost:" + testPeer.getServerPort() + "?jms.awaitClientID=" + waitForClientID;
+            String uri = "amqp://localhost:" + testPeer.getServerPort() + "?jms.awaitClientID=false";
 
             testPeer.expectSaslAnonymous();
             testPeer.expectOpen();
@@ -606,12 +597,10 @@ public class ConnectionIntegrationTest extends QpidJmsTestCase {
             ConnectionFactory factory = new JmsConnectionFactory(uri);
             Connection connection = factory.createConnection();
 
-            // if configured to wait we set an ID to kick off the Open process.
-            if (waitForClientID) {
-                connection.setClientID("client-id");
-            }
-
-            testPeer.waitForAllHandlersToComplete(2000);
+            // Verify that all handlers complete, i.e. the awaitClientID=false option
+            // setting was effective in provoking the AMQP Open immediately even
+            // though it has no ClientID and we haven't used the Connection.
+            testPeer.waitForAllHandlersToComplete(3000);
 
             testPeer.expectClose();
             connection.close();

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0f0cfba5/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/SubscriptionsIntegrationTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/SubscriptionsIntegrationTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/SubscriptionsIntegrationTest.java
index 2fa2b9d..f1bd390 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/SubscriptionsIntegrationTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/integration/SubscriptionsIntegrationTest.java
@@ -31,6 +31,7 @@ import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
 import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
 import javax.jms.InvalidDestinationException;
 import javax.jms.JMSException;
 import javax.jms.MessageConsumer;
@@ -39,6 +40,7 @@ import javax.jms.Topic;
 import javax.jms.TopicSubscriber;
 
 import org.apache.qpid.jms.JmsConnection;
+import org.apache.qpid.jms.JmsConnectionFactory;
 import org.apache.qpid.jms.JmsDefaultConnectionListener;
 import org.apache.qpid.jms.provider.amqp.AmqpSupport;
 import org.apache.qpid.jms.test.QpidJmsTestCase;
@@ -1582,4 +1584,51 @@ public class SubscriptionsIntegrationTest extends QpidJmsTestCase {
             connection.close();
         }
     }
+
+    // -------------------------------------- //
+
+    @Test(timeout = 20000)
+    public void testSharedTopicSubscriberBehavesLikeNoClientIDWasSetWhenAwaitClientIdOptionIsFalse() throws Exception {
+        try (TestAmqpPeer testPeer = new TestAmqpPeer();) {
+            int serverPort = testPeer.getServerPort();
+
+            // Add server connection capability to indicate support for shared-subs
+            Symbol[] serverCapabilities = new Symbol[]{SHARED_SUBS};
+
+            testPeer.expectSaslAnonymous();
+            testPeer.expectOpen(new Symbol[] { AmqpSupport.SOLE_CONNECTION_CAPABILITY }, serverCapabilities, null);
+            testPeer.expectBegin();
+
+            ConnectionFactory factory = new JmsConnectionFactory("amqp://localhost:" + serverPort + "?jms.awaitClientID=false");
+            Connection connection = factory.createConnection();
+
+            // Verify that all handlers complete, i.e. the awaitClientID=false option
+            // setting was effective in provoking the AMQP Open immediately even
+            // though it has no ClientID and we haven't used the Connection.
+            testPeer.waitForAllHandlersToComplete(3000);
+
+            testPeer.expectBegin();
+            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+            String topicName = "myTopic";
+            Topic dest = session.createTopic(topicName);
+            String subscriptionName = "mySubscription";
+
+            // Expect a shared subscription with 'global' capability and link name qualifier,
+            // since this connection does not have a ClientID set.
+            Matcher<?> linkNameMatcher = equalTo(subscriptionName + SUB_NAME_DELIMITER + "global-volatile1");
+            testPeer.expectSharedVolatileSubscriberAttach(topicName, subscriptionName, linkNameMatcher, false);
+            testPeer.expectLinkFlow();
+
+            MessageConsumer subscriber = session.createSharedConsumer(dest, subscriptionName);
+
+            testPeer.expectDetach(true, true, true);
+            subscriber.close();
+
+            testPeer.expectClose();
+            connection.close();
+
+            testPeer.waitForAllHandlersToComplete(1000);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/qpid-jms/blob/0f0cfba5/qpid-jms-client/src/test/java/org/apache/qpid/jms/meta/JmsConnectionInfoTest.java
----------------------------------------------------------------------
diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/meta/JmsConnectionInfoTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/meta/JmsConnectionInfoTest.java
index 679c6f5..d39fca2 100644
--- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/meta/JmsConnectionInfoTest.java
+++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/meta/JmsConnectionInfoTest.java
@@ -80,6 +80,8 @@ public class JmsConnectionInfoTest {
         info.setUsername("user");
         boolean validatePropertyNames = !info.isValidatePropertyNames();
         info.setValidatePropertyNames(validatePropertyNames);
+        boolean awaitClientID = !info.isAwaitClientID();
+        info.setAwaitClientID(awaitClientID);
         info.setMessageIDPolicy(new JmsDefaultMessageIDPolicy());
         info.setPrefetchPolicy(new JmsDefaultPrefetchPolicy());
         info.setPresettlePolicy(new JmsDefaultPresettlePolicy());
@@ -90,6 +92,7 @@ public class JmsConnectionInfoTest {
         assertEquals(true, copy.isForceSyncSend());
         assertEquals("test", copy.getClientId());
         assertEquals(true, copy.isExplicitClientID());
+        assertEquals(awaitClientID, copy.isAwaitClientID());
         assertEquals(100, copy.getCloseTimeout());
         assertEquals(200, copy.getConnectTimeout());
         assertEquals(true, copy.isForceAsyncSend());


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