You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kw...@apache.org on 2016/03/25 14:04:12 UTC

svn commit: r1736566 [2/2] - in /qpid/java/branches/6.0.x: ./ bdbstore/systests/src/test/java/org/apache/qpid/server/store/berkeleydb/replication/ broker-core/src/main/java/org/apache/qpid/server/model/ broker-core/src/main/java/org/apache/qpid/server/...

Modified: qpid/java/branches/6.0.x/systests/src/test/java/org/apache/qpid/test/unit/client/connection/BrokerClosesClientConnectionTest.java
URL: http://svn.apache.org/viewvc/qpid/java/branches/6.0.x/systests/src/test/java/org/apache/qpid/test/unit/client/connection/BrokerClosesClientConnectionTest.java?rev=1736566&r1=1736565&r2=1736566&view=diff
==============================================================================
--- qpid/java/branches/6.0.x/systests/src/test/java/org/apache/qpid/test/unit/client/connection/BrokerClosesClientConnectionTest.java (original)
+++ qpid/java/branches/6.0.x/systests/src/test/java/org/apache/qpid/test/unit/client/connection/BrokerClosesClientConnectionTest.java Fri Mar 25 13:04:11 2016
@@ -20,27 +20,40 @@
  */
 package org.apache.qpid.test.unit.client.connection;
 
+import java.util.Collections;
+import java.util.Map;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
 
 import javax.jms.Message;
 import javax.jms.MessageConsumer;
 import javax.jms.MessageListener;
 import javax.jms.MessageProducer;
 import javax.jms.Queue;
+import javax.jms.Session;
+
 import org.apache.qpid.AMQConnectionClosedException;
+import org.apache.qpid.AMQConnectionFailureException;
 import org.apache.qpid.AMQDisconnectedException;
 import org.apache.qpid.client.AMQConnection;
 import org.apache.qpid.client.AMQSession;
 import org.apache.qpid.client.BasicMessageConsumer;
 import org.apache.qpid.client.BasicMessageProducer;
+import org.apache.qpid.server.management.plugin.HttpManagement;
+import org.apache.qpid.server.model.AuthenticationProvider;
+import org.apache.qpid.server.model.Plugin;
+import org.apache.qpid.server.model.Port;
+import org.apache.qpid.server.model.VirtualHost;
+import org.apache.qpid.systest.rest.RestTestHelper;
 import org.apache.qpid.test.utils.QpidBrokerTestCase;
+import org.apache.qpid.test.utils.TestBrokerConfiguration;
 import org.apache.qpid.transport.ConnectionException;
 
 import javax.jms.Connection;
 import javax.jms.ExceptionListener;
 import javax.jms.JMSException;
-import javax.jms.Session;
 
 /**
  * Tests the behaviour of the client when the Broker terminates client connection
@@ -58,6 +71,21 @@ public class BrokerClosesClientConnectio
     @Override
     protected void setUp() throws Exception
     {
+        TestBrokerConfiguration config = getBrokerConfiguration();
+        config.addHttpManagementConfiguration();
+        config.setObjectAttribute(Port.class, TestBrokerConfiguration.ENTRY_NAME_HTTP_PORT, Port.PORT, getHttpManagementPort(getPort()));
+        config.removeObjectConfiguration(Port.class, TestBrokerConfiguration.ENTRY_NAME_JMX_PORT);
+        config.removeObjectConfiguration(Port.class, TestBrokerConfiguration.ENTRY_NAME_RMI_PORT);
+
+        config.setObjectAttribute(AuthenticationProvider.class, TestBrokerConfiguration.ENTRY_NAME_AUTHENTICATION_PROVIDER,
+                                  "secureOnlyMechanisms",
+                                  "{}");
+
+
+        // set password authentication provider on http port for the tests
+        config.setObjectAttribute(Port.class, TestBrokerConfiguration.ENTRY_NAME_HTTP_PORT, Port.AUTHENTICATION_PROVIDER,
+                                  TestBrokerConfiguration.ENTRY_NAME_AUTHENTICATION_PROVIDER);
+        config.setObjectAttribute(Plugin.class, TestBrokerConfiguration.ENTRY_NAME_HTTP_MANAGEMENT, HttpManagement.HTTP_BASIC_AUTHENTICATION_ENABLED, true);
         super.setUp();
 
         _connection = getConnection();
@@ -86,6 +114,68 @@ public class BrokerClosesClientConnectio
         ensureCanCloseWithoutException();
     }
 
+    public void testClientCloseOnVirtualHostStop() throws Exception
+    {
+        final String virtualHostName = TestBrokerConfiguration.ENTRY_NAME_VIRTUAL_HOST;
+        RestTestHelper restTestHelper = new RestTestHelper(getHttpManagementPort(getPort()));
+        restTestHelper.setUsernameAndPassword("webadmin", "webadmin");
+
+        final CountDownLatch connectionCreatorStarted = new CountDownLatch(1);
+        final AtomicBoolean shutdown = new AtomicBoolean(false);
+        final AtomicReference<Exception> clientException = new AtomicReference<>();
+        Thread connectionCreator = new Thread(new Runnable(){
+
+            @Override
+            public void run()
+            {
+                while (!shutdown.get())
+                {
+                    try
+                    {
+                        getConnection();
+                    }
+                    catch (Exception e)
+                    {
+                        clientException.set(e);
+                        shutdown.set(true);
+                    }
+                    connectionCreatorStarted.countDown();
+                }
+            }
+        });
+
+        try
+        {
+            connectionCreator.start();
+            assertTrue("connection creation thread did not start in time", connectionCreatorStarted.await(20, TimeUnit.SECONDS));
+
+            String restHostUrl = "virtualhost/" + virtualHostName + "/" + virtualHostName;
+            restTestHelper.submitRequest(restHostUrl, "PUT", Collections.singletonMap("desiredState", (Object) "STOPPED"), 200);
+            restTestHelper.waitForAttributeChanged(restHostUrl, VirtualHost.STATE, "STOPPED");
+
+            int connectionCount = 0;
+            for (int i = 0; i < 20; ++i)
+            {
+                Map<String, Object> portObject = restTestHelper.getJsonAsSingletonList("port/" + TestBrokerConfiguration.ENTRY_NAME_AMQP_PORT);
+                Map<String, Object> portStatistics = (Map<String, Object>) portObject.get("statistics");
+                connectionCount = (int) portStatistics.get("connectionCount");
+                if (connectionCount == 0)
+                {
+                    break;
+                }
+                Thread.sleep(250);
+            }
+            assertEquals("unexpected number of connections after virtual host stopped", 0, connectionCount);
+
+            assertConnectionCloseWasReported(clientException.get(), AMQConnectionFailureException.class);
+        }
+        finally
+        {
+            shutdown.set(true);
+            connectionCreator.join(10000);
+        }
+    }
+
     public void testClientCloseOnBrokerKill() throws Exception
     {
         final Class<? extends Exception> expectedLinkedException = isBroker010() ? ConnectionException.class : AMQDisconnectedException.class;
@@ -118,12 +208,11 @@ public class BrokerClosesClientConnectio
         }
     }
 
-    private void assertConnectionCloseWasReported(JMSException exception, Class<? extends Exception> linkedExceptionClass)
+    private void assertConnectionCloseWasReported(Exception exception, Class<? extends Exception> linkedExceptionClass)
     {
-        assertNotNull("Broker shutdown should be reported to the client via the ExceptionListener", exception);
-        assertNotNull("JMXException should have linked exception", exception.getLinkedException());
-
-        assertEquals("Unexpected linked exception", linkedExceptionClass, exception.getLinkedException().getClass());
+        assertNotNull("Did not receive exception", exception);
+        assertNotNull("Exception should have a cause", exception.getCause());
+        assertEquals("Unexpected exception cause", linkedExceptionClass, exception.getCause().getClass());
     }
 
     private void assertJmsObjectsClosed()



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