public void testCloseExpiredConnections() throws Exception { HttpParams mgrpar = defaultParams.copy(); ConnManagerParams.setMaxTotalConnections(mgrpar, 1); SingleClientConnManager mgr = createSCCM(mgrpar, null); final HttpHost target = getServerHttp(); final HttpRoute route = new HttpRoute(target, null, false); ManagedClientConnection conn = mgr.getConnection(route, null); conn.open(route, httpContext, defaultParams); mgr.releaseConnection(conn, 100, TimeUnit.MILLISECONDS); mgr.closeExpiredConnections(); conn = mgr.getConnection(route, null); assertTrue(conn.isOpen()); mgr.releaseConnection(conn, 100, TimeUnit.MILLISECONDS); Thread.sleep(150); mgr.closeExpiredConnections(); conn = mgr.getConnection(route, null); assertFalse(conn.isOpen()); mgr.shutdown(); }
/** Tests that SCM can still connect to the same host after a connection was aborted. */ public void testOpenAfterAbort() throws Exception { HttpParams mgrpar = defaultParams.copy(); ConnManagerParams.setMaxTotalConnections(mgrpar, 1); SingleClientConnManager mgr = createSCCM(mgrpar, null); final HttpHost target = getServerHttp(); final HttpRoute route = new HttpRoute(target, null, false); ManagedClientConnection conn = mgr.getConnection(route, null); assertTrue(conn instanceof AbstractClientConnAdapter); ((AbstractClientConnAdapter) conn).abortConnection(); conn = mgr.getConnection(route, null); assertFalse("connection should have been closed", conn.isOpen()); conn.open(route, httpContext, defaultParams); mgr.releaseConnection(conn, -1, null); mgr.shutdown(); }
public void testAlreadyLeased() throws Exception { HttpParams mgrpar = defaultParams.copy(); ConnManagerParams.setMaxTotalConnections(mgrpar, 1); SingleClientConnManager mgr = createSCCM(mgrpar, null); final HttpHost target = getServerHttp(); final HttpRoute route = new HttpRoute(target, null, false); ManagedClientConnection conn = mgr.getConnection(route, null); mgr.releaseConnection(conn, 100, TimeUnit.MILLISECONDS); mgr.getConnection(route, null); try { mgr.getConnection(route, null); fail("IllegalStateException should have been thrown"); } catch (IllegalStateException ex) { mgr.shutdown(); } }
/** Tests releasing with time limits. */ public void testReleaseConnectionWithTimeLimits() throws Exception { HttpParams mgrpar = defaultParams.copy(); ConnManagerParams.setMaxTotalConnections(mgrpar, 1); SingleClientConnManager mgr = createSCCM(mgrpar, null); final HttpHost target = getServerHttp(); final HttpRoute route = new HttpRoute(target, null, false); final int rsplen = 8; final String uri = "/random/" + rsplen; HttpRequest request = new BasicHttpRequest("GET", uri, HttpVersion.HTTP_1_1); ManagedClientConnection conn = mgr.getConnection(route, null); conn.open(route, httpContext, defaultParams); // a new context is created for each testcase, no need to reset HttpResponse response = Helper.execute( request, conn, target, httpExecutor, httpProcessor, defaultParams, httpContext); assertEquals( "wrong status in first response", HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); byte[] data = EntityUtils.toByteArray(response.getEntity()); assertEquals("wrong length of first response entity", rsplen, data.length); // ignore data, but it must be read // release connection without marking for re-use // expect the next connection obtained to be closed mgr.releaseConnection(conn, 100, TimeUnit.MILLISECONDS); conn = mgr.getConnection(route, null); assertFalse("connection should have been closed", conn.isOpen()); // repeat the communication, no need to prepare the request again conn.open(route, httpContext, defaultParams); httpContext.setAttribute(ExecutionContext.HTTP_CONNECTION, conn); response = httpExecutor.execute(request, conn, httpContext); httpExecutor.postProcess(response, httpProcessor, httpContext); assertEquals( "wrong status in second response", HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); data = EntityUtils.toByteArray(response.getEntity()); assertEquals("wrong length of second response entity", rsplen, data.length); // ignore data, but it must be read // release connection after marking it for re-use // expect the next connection obtained to be open conn.markReusable(); mgr.releaseConnection(conn, 100, TimeUnit.MILLISECONDS); conn = mgr.getConnection(route, null); assertTrue("connection should have been open", conn.isOpen()); // repeat the communication, no need to prepare the request again httpContext.setAttribute(ExecutionContext.HTTP_CONNECTION, conn); response = httpExecutor.execute(request, conn, httpContext); httpExecutor.postProcess(response, httpProcessor, httpContext); assertEquals( "wrong status in third response", HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); data = EntityUtils.toByteArray(response.getEntity()); assertEquals("wrong length of third response entity", rsplen, data.length); // ignore data, but it must be read conn.markReusable(); mgr.releaseConnection(conn, 100, TimeUnit.MILLISECONDS); Thread.sleep(150); conn = mgr.getConnection(route, null); assertTrue("connection should have been closed", !conn.isOpen()); // repeat the communication, no need to prepare the request again conn.open(route, httpContext, defaultParams); httpContext.setAttribute(ExecutionContext.HTTP_CONNECTION, conn); response = httpExecutor.execute(request, conn, httpContext); httpExecutor.postProcess(response, httpProcessor, httpContext); assertEquals( "wrong status in third response", HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); data = EntityUtils.toByteArray(response.getEntity()); assertEquals("wrong length of fourth response entity", rsplen, data.length); // ignore data, but it must be read mgr.shutdown(); }