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();
  }