You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ro...@apache.org on 2007/04/29 10:40:24 UTC

svn commit: r533488 - in /jakarta/httpcomponents/httpclient/trunk/src: java/org/apache/http/impl/conn/ThreadSafeClientConnManager.java test/org/apache/http/impl/conn/TestTSCCMNoServer.java

Author: rolandw
Date: Sun Apr 29 01:40:23 2007
New Revision: 533488

URL: http://svn.apache.org/viewvc?view=rev&rev=533488
Log:
more serverless tests for TSCCM, one bug fixed

Modified:
    jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/impl/conn/ThreadSafeClientConnManager.java
    jakarta/httpcomponents/httpclient/trunk/src/test/org/apache/http/impl/conn/TestTSCCMNoServer.java

Modified: jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/impl/conn/ThreadSafeClientConnManager.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/impl/conn/ThreadSafeClientConnManager.java?view=diff&rev=533488&r1=533487&r2=533488
==============================================================================
--- jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/impl/conn/ThreadSafeClientConnManager.java (original)
+++ jakarta/httpcomponents/httpclient/trunk/src/java/org/apache/http/impl/conn/ThreadSafeClientConnManager.java Sun Apr 29 01:40:23 2007
@@ -857,7 +857,7 @@
          */
         private synchronized void deleteConnection(TrackingPoolEntry entry) {
 
-            HostConfiguration route = entry.tracker.toHostConfig();
+            HostConfiguration route = entry.plannedRoute;
 
             if (LOG.isDebugEnabled()) {
                 LOG.debug("Reclaiming connection, hostConfig=" + route);

Modified: jakarta/httpcomponents/httpclient/trunk/src/test/org/apache/http/impl/conn/TestTSCCMNoServer.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpclient/trunk/src/test/org/apache/http/impl/conn/TestTSCCMNoServer.java?view=diff&rev=533488&r1=533487&r2=533488
==============================================================================
--- jakarta/httpcomponents/httpclient/trunk/src/test/org/apache/http/impl/conn/TestTSCCMNoServer.java (original)
+++ jakarta/httpcomponents/httpclient/trunk/src/test/org/apache/http/impl/conn/TestTSCCMNoServer.java Sun Apr 29 01:40:23 2007
@@ -44,7 +44,10 @@
 import org.apache.http.conn.SocketFactory;
 import org.apache.http.conn.PlainSocketFactory;
 import org.apache.http.conn.HttpRoute;
+import org.apache.http.conn.HostConfiguration; //@@@ deprecated
 import org.apache.http.conn.ManagedClientConnection;
+import org.apache.http.conn.ConnectionPoolTimeoutException;
+import org.apache.http.conn.params.HttpConnectionManagerParams;
 
 
 /**
@@ -117,6 +120,43 @@
     }
 
 
+    public void testConstructor() {
+        HttpParams     params = createDefaultParams();
+        SchemeRegistry schreg = createSchemeRegistry();
+
+        final String paramkey = "test.parameter";
+        final String paramval = "Value of the test parameter.";
+        params.setParameter(paramkey, paramval);
+
+        ThreadSafeClientConnManager mgr =
+            new ThreadSafeClientConnManager(params, schreg);
+        assertNotNull(mgr);
+        assertNotNull(mgr.getParams());
+        assertEquals(paramval, mgr.getParams().getParameter(paramkey));
+        mgr.shutdown();
+        mgr = null;
+
+        try {
+            mgr = new ThreadSafeClientConnManager(null, schreg);
+            fail("null parameters not detected");
+        } catch (IllegalArgumentException iax) {
+            // expected
+        } finally {
+            if (mgr != null)
+                mgr.shutdown();
+        }
+        mgr = null;
+
+        mgr = new ThreadSafeClientConnManager(params, null);
+        assertNotNull(mgr);
+        assertNotNull(mgr.getParams());
+        assertEquals(paramval, mgr.getParams().getParameter(paramkey));
+        mgr.shutdown();
+        mgr = null;
+
+    } // testConstructor
+
+
     public void testGetConnection() {
         ThreadSafeClientConnManager mgr = createTSCCM(null, null);
 
@@ -132,5 +172,209 @@
         mgr.shutdown();
     }
 
+    // testTimeout in 3.x TestHttpConnectionManager is redundant
+    // several other tests here rely on timeout behavior
+
+
+    public void testMaxConnTotal() {
+
+        HttpParams params = createDefaultParams();
+        HttpConnectionManagerParams.setDefaultMaxConnectionsPerHost(params, 1);
+        HttpConnectionManagerParams.setMaxTotalConnections(params, 2);
+
+        ThreadSafeClientConnManager mgr = createTSCCM(params, null);
+
+        HttpHost target1 = new HttpHost("www.test1.invalid", 80, "http");
+        HttpRoute route1 = new HttpRoute(target1, null, false);
+        HttpHost target2 = new HttpHost("www.test2.invalid", 80, "http");
+        HttpRoute route2 = new HttpRoute(target2, null, false);
+
+        ManagedClientConnection conn1 = mgr.getConnection(route1);
+        ManagedClientConnection conn2 = mgr.getConnection(route2);
+
+        try {
+            // this should fail quickly, connection has not been released
+            mgr.getConnection(route2, 100L);
+            fail("ConnectionPoolTimeoutException should have been thrown");
+        } catch (ConnectionPoolTimeoutException e) {
+            // expected
+        }
+        
+        // release one of the connections
+        mgr.releaseConnection(conn2);
+        conn2 = null;
+
+        // there should be a connection available now
+        try {
+            conn2 = mgr.getConnection(route2, 100L);
+        } catch (ConnectionPoolTimeoutException cptx) {
+            cptx.printStackTrace();
+            fail("connection should have been available: " + cptx);
+        }
+
+        mgr.shutdown();
+    }
+
+
+    public void testMaxConnPerHost() throws Exception {
+
+        HttpHost target1 = new HttpHost("www.test1.invalid", 80, "http");
+        HttpRoute route1 = new HttpRoute(target1, null, false);
+        HttpHost target2 = new HttpHost("www.test2.invalid", 80, "http");
+        HttpRoute route2 = new HttpRoute(target2, null, false);
+        HttpHost target3 = new HttpHost("www.test3.invalid", 80, "http");
+        HttpRoute route3 = new HttpRoute(target3, null, false);
+        
+        HttpParams params = createDefaultParams();
+        HttpConnectionManagerParams.setMaxTotalConnections(params, 100);
+        HttpConnectionManagerParams.setDefaultMaxConnectionsPerHost(params, 1);
+        //@@@ HostConfiguration is deprecated
+        //@@@ should it be mapped to HttpHost or HttpRoute here?
+        //@@@ provide setter in TSCCM, it is implementation specific
+        HttpConnectionManagerParams.setMaxConnectionsPerHost
+            (params, route2.toHostConfig(), 2);
+        HttpConnectionManagerParams.setMaxConnectionsPerHost
+            (params, route3.toHostConfig(), 3);
+
+        ThreadSafeClientConnManager mgr = createTSCCM(params, null);
+
+        // route 3, limit 3
+        ManagedClientConnection conn1 = mgr.getConnection(route3, 10L);
+        ManagedClientConnection conn2 = mgr.getConnection(route3, 10L);
+        ManagedClientConnection conn3 = mgr.getConnection(route3, 10L);
+        try {
+            // should fail quickly, connection has not been released
+            mgr.getConnection(route3, 10L);
+            fail("ConnectionPoolTimeoutException should have been thrown");
+        } catch (ConnectionPoolTimeoutException e) {
+            // expected
+        }
+        
+        // route 2, limit 2
+        conn1 = mgr.getConnection(route2, 10L);
+        conn2 = mgr.getConnection(route2, 10L);
+        try {
+            // should fail quickly, connection has not been released
+            mgr.getConnection(route2, 10L);
+            fail("ConnectionPoolTimeoutException should have been thrown");
+        } catch (ConnectionPoolTimeoutException e) {
+            // expected
+        }
+
+        // route 1, should use default limit of 1
+        conn1 = mgr.getConnection(route1, 10L);
+        try {
+            // should fail quickly, connection has not been released
+            mgr.getConnection(route1, 10L);
+            fail("ConnectionPoolTimeoutException should have been thrown");
+        } catch (ConnectionPoolTimeoutException e) {
+            // expected
+        }
+
+        mgr.shutdown();
+    }    
+
+
+    public void testReleaseConnection() throws Exception {
+
+        HttpParams params = createDefaultParams();
+        HttpConnectionManagerParams.setDefaultMaxConnectionsPerHost(params, 1);
+        HttpConnectionManagerParams.setMaxTotalConnections(params, 3);
+
+        ThreadSafeClientConnManager mgr = createTSCCM(params, null);
+
+        HttpHost target1 = new HttpHost("www.test1.invalid", 80, "http");
+        HttpRoute route1 = new HttpRoute(target1, null, false);
+        HttpHost target2 = new HttpHost("www.test2.invalid", 80, "http");
+        HttpRoute route2 = new HttpRoute(target2, null, false);
+        HttpHost target3 = new HttpHost("www.test3.invalid", 80, "http");
+        HttpRoute route3 = new HttpRoute(target3, null, false);
+
+        // the first three allocations should pass
+        ManagedClientConnection conn1 = mgr.getConnection(route1, 10L);
+        ManagedClientConnection conn2 = mgr.getConnection(route2, 10L);
+        ManagedClientConnection conn3 = mgr.getConnection(route3, 10L);
+        assertNotNull(conn1);
+        assertNotNull(conn2);
+        assertNotNull(conn3);
+
+        // obtaining another connection for either of the three should fail
+        // this is somehow redundant with testMaxConnPerHost
+        try {
+            mgr.getConnection(route1, 10L);
+            fail("ConnectionPoolTimeoutException should have been thrown");
+        } catch (ConnectionPoolTimeoutException e) {
+            // expected
+        }
+        try {
+            mgr.getConnection(route2, 10L);
+            fail("ConnectionPoolTimeoutException should have been thrown");
+        } catch (ConnectionPoolTimeoutException e) {
+            // expected
+        }
+        try {
+            mgr.getConnection(route3, 10L);
+            fail("ConnectionPoolTimeoutException should have been thrown");
+        } catch (ConnectionPoolTimeoutException e) {
+            // expected
+        }
+
+        // now release one and check that exactly that one can be obtained then
+        mgr.releaseConnection(conn2);
+        conn2 = null;
+        try {
+            mgr.getConnection(route1, 10L);
+            fail("ConnectionPoolTimeoutException should have been thrown");
+        } catch (ConnectionPoolTimeoutException e) {
+            // expected
+        }
+        // this one succeeds
+        conn2 = mgr.getConnection(route2, 10L);
+        assertNotNull(conn2);
+        try {
+            mgr.getConnection(route3, 10L);
+            fail("ConnectionPoolTimeoutException should have been thrown");
+        } catch (ConnectionPoolTimeoutException e) {
+            // expected
+        }
+
+        mgr.shutdown();
+    }
+
+
+    public void testDeleteClosedConnections() {
+        
+        ThreadSafeClientConnManager mgr = createTSCCM(null, null);
+        
+        HttpHost target = new HttpHost("www.test.invalid", 80, "http");
+        HttpRoute route = new HttpRoute(target, null, false);
+        HostConfiguration hcfg = route.toHostConfig(); //@@@ deprecated
+
+        ManagedClientConnection conn = mgr.getConnection(route);
+        
+        assertEquals("connectionsInPool",
+                     mgr.getConnectionsInPool(), 1);
+        assertEquals("connectionsInPool(host)",
+                     mgr.getConnectionsInPool(hcfg), 1);
+        mgr.releaseConnection(conn);
+
+        assertEquals("connectionsInPool",
+                     mgr.getConnectionsInPool(), 1);
+        assertEquals("connectionsInPool(host)",
+                     mgr.getConnectionsInPool(hcfg), 1);
+
+        mgr.closeIdleConnections(0L); // implicitly deletes them, too
+
+        assertEquals("connectionsInPool",
+                     mgr.getConnectionsInPool(), 0);
+        assertEquals("connectionsInPool(host)",
+                     mgr.getConnectionsInPool(hcfg), 0);
+
+        mgr.shutdown();
+    }
+
+    // testShutdownAll, depends on parameterization and extra threads
+    // testShutdown, depends on parameterization and extra threads
+    // testHostReusePreference, depends on parameterization and extra threads
 
 } // class TestTSCCMNoServer