You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2021/09/25 10:29:13 UTC

[httpcomponents-client] branch master updated (28cd2ff -> e30438d)

This is an automated email from the ASF dual-hosted git repository.

olegk pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/httpcomponents-client.git.


 discard 28cd2ff  More consistent handling of request scheme and authority by protocol interceptors
 discard a9092e8  Cleanup of authentication test cases
     new a74cc44  Cleanup of authentication test cases
     new e30438d  More consistent handling of request scheme and authority by protocol interceptors

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (28cd2ff)
            \
             N -- N -- N   refs/heads/master (e30438d)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../testing/sync/TestClientAuthentication.java     | 34 ++++------------------
 1 file changed, 6 insertions(+), 28 deletions(-)

[httpcomponents-client] 02/02: More consistent handling of request scheme and authority by protocol interceptors

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olegk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/httpcomponents-client.git

commit e30438de2cb6a727d80579351f0b62466fca70dd
Author: Oleg Kalnichevski <ol...@apache.org>
AuthorDate: Fri Sep 24 23:18:02 2021 +0200

    More consistent handling of request scheme and authority by protocol interceptors
---
 .../hc/client5/http/impl/async/AsyncProtocolExec.java  | 16 +++++++++++-----
 .../client5/http/impl/classic/InternalHttpClient.java  | 18 ++++--------------
 .../hc/client5/http/impl/classic/ProtocolExec.java     | 16 +++++++++++-----
 3 files changed, 26 insertions(+), 24 deletions(-)

diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/AsyncProtocolExec.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/AsyncProtocolExec.java
index fe0d73b..dfe1840 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/AsyncProtocolExec.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/AsyncProtocolExec.java
@@ -127,12 +127,18 @@ public final class AsyncProtocolExec implements AsyncExecChainHandler {
             request = userRequest;
         }
 
+        // Ensure the request has a scheme and an authority
+        if (request.getScheme() == null) {
+            request.setScheme(target.getSchemeName());
+        }
+        if (request.getAuthority() == null) {
+            request.setAuthority(new URIAuthority(target));
+        }
+
         final URIAuthority authority = request.getAuthority();
-        if (authority != null) {
-            final CredentialsProvider credsProvider = clientContext.getCredentialsProvider();
-            if (credsProvider instanceof CredentialsStore) {
-                AuthSupport.extractFromAuthority(request.getScheme(), authority, (CredentialsStore) credsProvider);
-            }
+        final CredentialsProvider credsProvider = clientContext.getCredentialsProvider();
+        if (credsProvider instanceof CredentialsStore) {
+            AuthSupport.extractFromAuthority(request.getScheme(), authority, (CredentialsStore) credsProvider);
         }
 
         final AtomicBoolean challenged = new AtomicBoolean(false);
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/InternalHttpClient.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/InternalHttpClient.java
index 7138c05..da5a188 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/InternalHttpClient.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/InternalHttpClient.java
@@ -55,7 +55,6 @@ import org.apache.hc.core5.http.ClassicHttpRequest;
 import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.apache.hc.core5.http.HttpException;
 import org.apache.hc.core5.http.HttpHost;
-import org.apache.hc.core5.http.HttpRequest;
 import org.apache.hc.core5.http.config.Lookup;
 import org.apache.hc.core5.http.impl.io.HttpRequestExecutor;
 import org.apache.hc.core5.http.io.support.ClassicRequestBuilder;
@@ -63,7 +62,6 @@ import org.apache.hc.core5.http.protocol.BasicHttpContext;
 import org.apache.hc.core5.http.protocol.HttpContext;
 import org.apache.hc.core5.io.CloseMode;
 import org.apache.hc.core5.io.ModalCloseable;
-import org.apache.hc.core5.net.URIAuthority;
 import org.apache.hc.core5.util.Args;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -118,11 +116,7 @@ class InternalHttpClient extends CloseableHttpClient implements Configurable {
         this.closeables = closeables != null ?  new ConcurrentLinkedQueue<>(closeables) : null;
     }
 
-    private HttpRoute determineRoute(
-            final HttpHost host,
-            final HttpRequest request,
-            final HttpContext context) throws HttpException {
-        final HttpHost target = host != null ? host : RoutingSupport.determineHost(request);
+    private HttpRoute determineRoute(final HttpHost target, final HttpContext context) throws HttpException {
         return this.routePlanner.determineRoute(target, context);
     }
 
@@ -151,12 +145,6 @@ class InternalHttpClient extends CloseableHttpClient implements Configurable {
             final HttpContext context) throws IOException {
         Args.notNull(request, "HTTP request");
         try {
-            if (request.getScheme() == null && target != null) {
-                request.setScheme(target.getSchemeName());
-            }
-            if (request.getAuthority() == null && target != null) {
-                request.setAuthority(new URIAuthority(target));
-            }
             final HttpClientContext localcontext = HttpClientContext.adapt(
                     context != null ? context : new BasicHttpContext());
             RequestConfig config = null;
@@ -167,7 +155,9 @@ class InternalHttpClient extends CloseableHttpClient implements Configurable {
                 localcontext.setRequestConfig(config);
             }
             setupContext(localcontext);
-            final HttpRoute route = determineRoute(target, request, localcontext);
+            final HttpRoute route = determineRoute(
+                    target != null ? target : RoutingSupport.determineHost(request),
+                    localcontext);
             final String exchangeId = ExecSupport.getNextExchangeId();
             if (LOG.isDebugEnabled()) {
                 LOG.debug("{} preparing request execution", exchangeId);
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/ProtocolExec.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/ProtocolExec.java
index 2edfe4c..a54486e 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/ProtocolExec.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/ProtocolExec.java
@@ -132,12 +132,18 @@ public final class ProtocolExec implements ExecChainHandler {
                 request = userRequest;
             }
 
+            // Ensure the request has a scheme and an authority
+            if (request.getScheme() == null) {
+                request.setScheme(target.getSchemeName());
+            }
+            if (request.getAuthority() == null) {
+                request.setAuthority(new URIAuthority(target));
+            }
+
             final URIAuthority authority = request.getAuthority();
-            if (authority != null) {
-                final CredentialsProvider credsProvider = context.getCredentialsProvider();
-                if (credsProvider instanceof CredentialsStore) {
-                    AuthSupport.extractFromAuthority(request.getScheme(), authority, (CredentialsStore) credsProvider);
-                }
+            final CredentialsProvider credsProvider = context.getCredentialsProvider();
+            if (credsProvider instanceof CredentialsStore) {
+                AuthSupport.extractFromAuthority(request.getScheme(), authority, (CredentialsStore) credsProvider);
             }
 
             RequestEntityProxy.enhance(request);

[httpcomponents-client] 01/02: Cleanup of authentication test cases

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olegk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/httpcomponents-client.git

commit a74cc442837cc0ceca8adfeec92df6ff4ddbb444
Author: Oleg Kalnichevski <ol...@apache.org>
AuthorDate: Fri Sep 24 16:07:20 2021 +0200

    Cleanup of authentication test cases
---
 .../AbstractHttpAsyncClientAuthentication.java     | 101 ++----
 .../async/TestHttp1ClientAuthentication.java       |  12 +-
 .../testing/sync/TestClientAuthentication.java     | 373 +++++++++------------
 3 files changed, 204 insertions(+), 282 deletions(-)

diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/AbstractHttpAsyncClientAuthentication.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/AbstractHttpAsyncClientAuthentication.java
index 7a0c7e3..d4893b2 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/AbstractHttpAsyncClientAuthentication.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/AbstractHttpAsyncClientAuthentication.java
@@ -41,8 +41,7 @@ import org.apache.hc.client5.http.auth.AuthScheme;
 import org.apache.hc.client5.http.auth.AuthSchemeFactory;
 import org.apache.hc.client5.http.auth.AuthScope;
 import org.apache.hc.client5.http.auth.ChallengeType;
-import org.apache.hc.client5.http.auth.Credentials;
-import org.apache.hc.client5.http.auth.CredentialsStore;
+import org.apache.hc.client5.http.auth.CredentialsProvider;
 import org.apache.hc.client5.http.auth.StandardAuthScheme;
 import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
 import org.apache.hc.client5.http.config.RequestConfig;
@@ -76,6 +75,7 @@ import org.apache.hc.core5.http2.impl.H2Processors;
 import org.apache.hc.core5.net.URIAuthority;
 import org.junit.Assert;
 import org.junit.Test;
+import org.mockito.Mockito;
 
 public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableHttpAsyncClient> extends AbstractIntegrationTestBase<T> {
 
@@ -110,42 +110,12 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
 
     abstract void setTargetAuthenticationStrategy(AuthenticationStrategy targetAuthStrategy);
 
-    static class TestCredentialsProvider implements CredentialsStore {
-
-        private final Credentials creds;
-        private AuthScope authscope;
-
-        TestCredentialsProvider(final Credentials creds) {
-            super();
-            this.creds = creds;
-        }
-
-        @Override
-        public void clear() {
-        }
-
-        @Override
-        public Credentials getCredentials(final AuthScope authscope, final HttpContext context) {
-            this.authscope = authscope;
-            return this.creds;
-        }
-
-        @Override
-        public void setCredentials(final AuthScope authscope, final Credentials credentials) {
-        }
-
-        public AuthScope getAuthScope() {
-            return this.authscope;
-        }
-
-    }
-
     @Test
     public void testBasicAuthenticationNoCreds() throws Exception {
         server.register("*", AsyncEchoHandler::new);
         final HttpHost target = start();
 
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(null);
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
         final HttpClientContext context = HttpClientContext.create();
         context.setCredentialsProvider(credsProvider);
 
@@ -157,9 +127,8 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
 
         Assert.assertNotNull(response);
         Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
     @Test
@@ -167,8 +136,9 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
         server.register("*", AsyncEchoHandler::new);
         final HttpHost target = start();
 
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "all-wrong".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "all-wrong".toCharArray()));
         final HttpClientContext context = HttpClientContext.create();
         context.setCredentialsProvider(credsProvider);
 
@@ -180,9 +150,8 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
 
         Assert.assertNotNull(response);
         Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
     @Test
@@ -190,8 +159,9 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
         server.register("*", AsyncEchoHandler::new);
         final HttpHost target = start();
 
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         final HttpClientContext context = HttpClientContext.create();
         context.setCredentialsProvider(credsProvider);
 
@@ -204,9 +174,8 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
 
         Assert.assertNotNull(response);
         Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
     @Test
@@ -214,8 +183,9 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
         server.register("*", AsyncEchoHandler::new);
         final HttpHost target = start();
 
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         final HttpClientContext context = HttpClientContext.create();
         context.setCredentialsProvider(credsProvider);
         final Future<SimpleHttpResponse> future = httpclient.execute(
@@ -228,9 +198,8 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
 
         Assert.assertNotNull(response);
         Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
     @Test
@@ -238,8 +207,9 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
         server.register("*", AsyncEchoHandler::new);
         final HttpHost target = start();
 
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "all-wrong".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "all-wrong".toCharArray()));
         final HttpClientContext context = HttpClientContext.create();
         context.setCredentialsProvider(credsProvider);
         context.setRequestConfig(RequestConfig.custom().setExpectContinueEnabled(true).build());
@@ -260,8 +230,9 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
         server.register("*", AsyncEchoHandler::new);
         final HttpHost target = start();
 
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         final HttpClientContext context = HttpClientContext.create();
         context.setCredentialsProvider(credsProvider);
         context.setRequestConfig(RequestConfig.custom().setExpectContinueEnabled(true).build());
@@ -275,9 +246,8 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
 
         Assert.assertNotNull(response);
         Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
     @Test
@@ -388,8 +358,9 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
     @Test
     public void testReauthentication() throws Exception {
         server.register("*", AsyncEchoHandler::new);
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
 
         final Registry<AuthSchemeFactory> authSchemeRegistry = RegistryBuilder.<AuthSchemeFactory>create()
                 .register("MyBasic", context -> new BasicScheme() {
@@ -462,8 +433,9 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
 
                 });
 
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         final HttpClientContext context = HttpClientContext.create();
         context.setCredentialsProvider(credsProvider);
 
@@ -474,9 +446,8 @@ public abstract class AbstractHttpAsyncClientAuthentication<T extends CloseableH
         final SimpleHttpResponse response = future.get();
         Assert.assertNotNull(response);
         Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
 }
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/TestHttp1ClientAuthentication.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/TestHttp1ClientAuthentication.java
index b4b049d..d8ff129 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/TestHttp1ClientAuthentication.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/async/TestHttp1ClientAuthentication.java
@@ -36,6 +36,7 @@ import org.apache.hc.client5.http.async.methods.SimpleHttpResponse;
 import org.apache.hc.client5.http.async.methods.SimpleRequestBuilder;
 import org.apache.hc.client5.http.auth.AuthSchemeFactory;
 import org.apache.hc.client5.http.auth.AuthScope;
+import org.apache.hc.client5.http.auth.CredentialsProvider;
 import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
 import org.apache.hc.client5.http.config.ConnectionConfig;
 import org.apache.hc.client5.http.config.RequestConfig;
@@ -63,6 +64,7 @@ import org.junit.Test;
 import org.junit.rules.ExternalResource;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
+import org.mockito.Mockito;
 
 @RunWith(Parameterized.class)
 public class TestHttp1ClientAuthentication extends AbstractHttpAsyncClientAuthentication<CloseableHttpAsyncClient> {
@@ -149,8 +151,9 @@ public class TestHttp1ClientAuthentication extends AbstractHttpAsyncClientAuthen
                 },
                 Http1Config.DEFAULT);
 
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         final HttpClientContext context = HttpClientContext.create();
         context.setCredentialsProvider(credsProvider);
 
@@ -163,9 +166,8 @@ public class TestHttp1ClientAuthentication extends AbstractHttpAsyncClientAuthen
 
         Assert.assertNotNull(response);
         Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
 }
\ No newline at end of file
diff --git a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestClientAuthentication.java b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestClientAuthentication.java
index e443375..a456e40 100644
--- a/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestClientAuthentication.java
+++ b/httpclient5-testing/src/test/java/org/apache/hc/client5/testing/sync/TestClientAuthentication.java
@@ -31,17 +31,12 @@ import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.nio.charset.StandardCharsets;
 import java.util.Collections;
-import java.util.List;
-import java.util.Map;
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.hc.client5.http.auth.AuthCache;
-import org.apache.hc.client5.http.auth.AuthChallenge;
 import org.apache.hc.client5.http.auth.AuthScheme;
 import org.apache.hc.client5.http.auth.AuthSchemeFactory;
 import org.apache.hc.client5.http.auth.AuthScope;
-import org.apache.hc.client5.http.auth.ChallengeType;
-import org.apache.hc.client5.http.auth.Credentials;
 import org.apache.hc.client5.http.auth.CredentialsProvider;
 import org.apache.hc.client5.http.auth.StandardAuthScheme;
 import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
@@ -82,6 +77,7 @@ import org.apache.hc.core5.http.protocol.HttpCoreContext;
 import org.apache.hc.core5.net.URIAuthority;
 import org.junit.Assert;
 import org.junit.Test;
+import org.mockito.Mockito;
 
 /**
  * Unit tests for automatic client authentication.
@@ -97,46 +93,24 @@ public class TestClientAuthentication extends LocalServerTestBase {
         return start(new BasicTestAuthenticator("test:test", "test realm"));
     }
 
-    static class TestCredentialsProvider implements CredentialsProvider {
-
-        private final Credentials creds;
-        private AuthScope authscope;
-
-        TestCredentialsProvider(final Credentials creds) {
-            super();
-            this.creds = creds;
-        }
-
-        @Override
-        public Credentials getCredentials(final AuthScope authscope, final HttpContext context) {
-            this.authscope = authscope;
-            return this.creds;
-        }
-
-        public AuthScope getAuthScope() {
-            return this.authscope;
-        }
-
-    }
-
     @Test
     public void testBasicAuthenticationNoCreds() throws Exception {
         this.server.registerHandler("*", new EchoHandler());
         final HttpHost target = start();
 
         final HttpClientContext context = HttpClientContext.create();
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(null);
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
         context.setCredentialsProvider(credsProvider);
         final HttpGet httpget = new HttpGet("/");
 
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
-        Assert.assertNotNull(entity);
-        EntityUtils.consume(entity);
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
+            Assert.assertNotNull(entity);
+            EntityUtils.consume(entity);
+        }
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
     @Test
@@ -145,19 +119,20 @@ public class TestClientAuthentication extends LocalServerTestBase {
         final HttpHost target = start();
 
         final HttpClientContext context = HttpClientContext.create();
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "all-wrong".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "all-wrong".toCharArray()));
         context.setCredentialsProvider(credsProvider);
         final HttpGet httpget = new HttpGet("/");
 
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
-        Assert.assertNotNull(entity);
-        EntityUtils.consume(entity);
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
+            Assert.assertNotNull(entity);
+            EntityUtils.consume(entity);
+        }
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
     @Test
@@ -165,20 +140,21 @@ public class TestClientAuthentication extends LocalServerTestBase {
         this.server.registerHandler("*", new EchoHandler());
         final HttpGet httpget = new HttpGet("/");
         final HttpClientContext context = HttpClientContext.create();
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         context.setCredentialsProvider(credsProvider);
 
         final HttpHost target = start();
 
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        Assert.assertNotNull(entity);
-        EntityUtils.consume(entity);
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+            Assert.assertNotNull(entity);
+            EntityUtils.consume(entity);
+        }
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
     @Test
@@ -196,14 +172,16 @@ public class TestClientAuthentication extends LocalServerTestBase {
                         new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 } ),
                         -1, null));
         final HttpClientContext context = HttpClientContext.create();
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         context.setCredentialsProvider(credsProvider);
 
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpput, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        Assert.assertNotNull(entity);
+        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpput, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+            Assert.assertNotNull(entity);
+        }
     }
 
     @Test
@@ -220,15 +198,17 @@ public class TestClientAuthentication extends LocalServerTestBase {
                         -1, null));
 
         final HttpClientContext context = HttpClientContext.create();
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "boom".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "boom".toCharArray()));
         context.setCredentialsProvider(credsProvider);
 
-        final CloseableHttpResponse response = this.httpclient.execute(target, httpput, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(401, response.getCode());
-        Assert.assertNotNull(entity);
-        EntityUtils.consume(entity);
+        try (final CloseableHttpResponse response = this.httpclient.execute(target, httpput, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(401, response.getCode());
+            Assert.assertNotNull(entity);
+            EntityUtils.consume(entity);
+        }
     }
 
     @Test
@@ -240,18 +220,19 @@ public class TestClientAuthentication extends LocalServerTestBase {
         httppost.setEntity(new StringEntity("some important stuff", StandardCharsets.US_ASCII));
 
         final HttpClientContext context = HttpClientContext.create();
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         context.setCredentialsProvider(credsProvider);
 
-        final ClassicHttpResponse response = this.httpclient.execute(target, httppost, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        Assert.assertNotNull(entity);
-        EntityUtils.consume(entity);
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        try (final ClassicHttpResponse response = this.httpclient.execute(target, httppost, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+            Assert.assertNotNull(entity);
+            EntityUtils.consume(entity);
+        }
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
     @Test
@@ -268,46 +249,23 @@ public class TestClientAuthentication extends LocalServerTestBase {
         context.setRequestConfig(RequestConfig.custom()
                 .setExpectContinueEnabled(false)
                 .build());
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         context.setCredentialsProvider(credsProvider);
 
-        final CloseableHttpResponse response = this.httpclient.execute(target, httppost, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(401, response.getCode());
-        Assert.assertNotNull(entity);
-        EntityUtils.consume(entity);
-    }
-
-    static class TestTargetAuthenticationStrategy extends DefaultAuthenticationStrategy {
-
-        private final AtomicLong count;
-
-        public TestTargetAuthenticationStrategy() {
-            super();
-            this.count = new AtomicLong();
-        }
-
-        @Override
-        public List<AuthScheme> select(
-                final ChallengeType challengeType,
-                final Map<String, AuthChallenge> challenges,
-                final HttpContext context) {
-            final List<AuthScheme> authSchemes = super.select(challengeType, challenges, context);
-            this.count.incrementAndGet();
-            return authSchemes;
-        }
-
-        public long getCount() {
-            return this.count.get();
+        try (final CloseableHttpResponse response = this.httpclient.execute(target, httppost, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(401, response.getCode());
+            Assert.assertNotNull(entity);
+            EntityUtils.consume(entity);
         }
-
     }
 
     @Test
     public void testBasicAuthenticationCredentialsCaching() throws Exception {
         this.server.registerHandler("*", new EchoHandler());
-        final TestTargetAuthenticationStrategy authStrategy = new TestTargetAuthenticationStrategy();
+        final DefaultAuthenticationStrategy authStrategy = Mockito.spy(new DefaultAuthenticationStrategy());
         this.clientBuilder.setTargetAuthenticationStrategy(authStrategy);
 
         final HttpHost target = start();
@@ -319,19 +277,21 @@ public class TestClientAuthentication extends LocalServerTestBase {
 
         final HttpGet httpget = new HttpGet("/");
 
-        final ClassicHttpResponse response1 = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity1 = response1.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response1.getCode());
-        Assert.assertNotNull(entity1);
-        EntityUtils.consume(entity1);
+        try (final ClassicHttpResponse response1 = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity1 = response1.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response1.getCode());
+            Assert.assertNotNull(entity1);
+            EntityUtils.consume(entity1);
+        }
 
-        final ClassicHttpResponse response2 = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity2 = response1.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response2.getCode());
-        Assert.assertNotNull(entity2);
-        EntityUtils.consume(entity2);
+        try (final ClassicHttpResponse response2 = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity2 = response2.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response2.getCode());
+            Assert.assertNotNull(entity2);
+            EntityUtils.consume(entity2);
+        }
 
-        Assert.assertEquals(1, authStrategy.getCount());
+        Mockito.verify(authStrategy).select(Mockito.any(), Mockito.any(), Mockito.any());
     }
 
     @Test
@@ -363,7 +323,7 @@ public class TestClientAuthentication extends LocalServerTestBase {
 
         });
 
-        final TestTargetAuthenticationStrategy authStrategy = new TestTargetAuthenticationStrategy();
+        final DefaultAuthenticationStrategy authStrategy = Mockito.spy(new DefaultAuthenticationStrategy());
         final CredentialsProvider credsProvider = CredentialsProviderBuilder.create()
                 .add(new AuthScope(target, "this realm", null), "test", "this".toCharArray())
                 .add(new AuthScope(target, "that realm", null), "test", "that".toCharArray())
@@ -377,29 +337,32 @@ public class TestClientAuthentication extends LocalServerTestBase {
 
         final HttpGet httpget1 = new HttpGet("/this");
 
-        final ClassicHttpResponse response1 = this.httpclient.execute(target, httpget1, context);
-        final HttpEntity entity1 = response1.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response1.getCode());
-        Assert.assertNotNull(entity1);
-        EntityUtils.consume(entity1);
+        try (final ClassicHttpResponse response1 = this.httpclient.execute(target, httpget1, context)) {
+            final HttpEntity entity1 = response1.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response1.getCode());
+            Assert.assertNotNull(entity1);
+            EntityUtils.consume(entity1);
+        }
 
         final HttpGet httpget2 = new HttpGet("/this");
 
-        final ClassicHttpResponse response2 = this.httpclient.execute(target, httpget2, context);
-        final HttpEntity entity2 = response1.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response2.getCode());
-        Assert.assertNotNull(entity2);
-        EntityUtils.consume(entity2);
+        try (final ClassicHttpResponse response2 = this.httpclient.execute(target, httpget2, context)) {
+            final HttpEntity entity2 = response2.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response2.getCode());
+            Assert.assertNotNull(entity2);
+            EntityUtils.consume(entity2);
+        }
 
         final HttpGet httpget3 = new HttpGet("/that");
 
-        final ClassicHttpResponse response3 = this.httpclient.execute(target, httpget3, context);
-        final HttpEntity entity3 = response1.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response3.getCode());
-        Assert.assertNotNull(entity3);
-        EntityUtils.consume(entity3);
+        try (final ClassicHttpResponse response3 = this.httpclient.execute(target, httpget3, context)) {
+            final HttpEntity entity3 = response3.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response3.getCode());
+            Assert.assertNotNull(entity3);
+            EntityUtils.consume(entity3);
+        }
 
-        Assert.assertEquals(2, authStrategy.getCount());
+        Mockito.verify(authStrategy, Mockito.times(2)).select(Mockito.any(), Mockito.any(), Mockito.any());
     }
 
     @Test
@@ -409,11 +372,12 @@ public class TestClientAuthentication extends LocalServerTestBase {
         final HttpGet httpget = new HttpGet("http://test:test@" +  target.toHostString() + "/");
 
         final HttpClientContext context = HttpClientContext.create();
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        Assert.assertNotNull(entity);
-        EntityUtils.consume(entity);
+        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+            Assert.assertNotNull(entity);
+            EntityUtils.consume(entity);
+        }
     }
 
     @Test
@@ -423,11 +387,12 @@ public class TestClientAuthentication extends LocalServerTestBase {
         final HttpGet httpget = new HttpGet("http://test:all-wrong@" +  target.toHostString() + "/");
 
         final HttpClientContext context = HttpClientContext.create();
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
-        Assert.assertNotNull(entity);
-        EntityUtils.consume(entity);
+        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getCode());
+            Assert.assertNotNull(entity);
+            EntityUtils.consume(entity);
+        }
     }
 
     @Test
@@ -455,39 +420,19 @@ public class TestClientAuthentication extends LocalServerTestBase {
         final HttpGet httpget = new HttpGet("/thatway");
         final HttpClientContext context = HttpClientContext.create();
 
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        Assert.assertNotNull(entity);
-        EntityUtils.consume(entity);
-    }
-
-    static class CountingAuthenticator extends BasicTestAuthenticator {
-
-        private final AtomicLong count;
-
-        public CountingAuthenticator(final String userToken, final String realm) {
-            super(userToken, realm);
-            this.count = new AtomicLong();
-        }
-
-        @Override
-        public boolean authenticate(final URIAuthority authority, final String requestUri, final String credentials) {
-            this.count.incrementAndGet();
-            return super.authenticate(authority, requestUri, credentials);
-        }
-
-        public long getCount() {
-            return this.count.get();
+        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+            Assert.assertNotNull(entity);
+            EntityUtils.consume(entity);
         }
-
     }
 
     @Test
     public void testPreemptiveAuthentication() throws Exception {
         this.server.registerHandler("*", new EchoHandler());
-        final CountingAuthenticator countingAuthenticator = new CountingAuthenticator("test:test", "test realm");
-        final HttpHost target = start(countingAuthenticator);
+        final Authenticator authenticator = Mockito.spy(new BasicTestAuthenticator("test:test", "test realm"));
+        final HttpHost target = start(authenticator);
 
         final BasicScheme basicScheme = new BasicScheme();
         basicScheme.initPreemptive(new UsernamePasswordCredentials("test", "test".toCharArray()));
@@ -497,21 +442,21 @@ public class TestClientAuthentication extends LocalServerTestBase {
         context.setAuthCache(authCache);
 
         final HttpGet httpget = new HttpGet("/");
-        final ClassicHttpResponse response1 = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity1 = response1.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response1.getCode());
-        Assert.assertNotNull(entity1);
-        EntityUtils.consume(entity1);
+        try (final ClassicHttpResponse response1 = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity1 = response1.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response1.getCode());
+            Assert.assertNotNull(entity1);
+            EntityUtils.consume(entity1);
+        }
 
-        Assert.assertEquals(1, countingAuthenticator.getCount());
+        Mockito.verify(authenticator).authenticate(Mockito.any(), Mockito.any(), Mockito.any());
     }
 
     @Test
     public void testPreemptiveAuthenticationFailure() throws Exception {
         this.server.registerHandler("*", new EchoHandler());
-        final CountingAuthenticator countingAuthenticator = new CountingAuthenticator("test:test", "test realm");
-
-        final HttpHost target = start(countingAuthenticator);
+        final Authenticator authenticator = Mockito.spy(new BasicTestAuthenticator("test:test", "test realm"));
+        final HttpHost target = start(authenticator);
 
         final HttpClientContext context = HttpClientContext.create();
         final AuthCache authCache = new BasicAuthCache();
@@ -522,13 +467,14 @@ public class TestClientAuthentication extends LocalServerTestBase {
                 .build());
 
         final HttpGet httpget = new HttpGet("/");
-        final ClassicHttpResponse response1 = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity1 = response1.getEntity();
-        Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response1.getCode());
-        Assert.assertNotNull(entity1);
-        EntityUtils.consume(entity1);
+        try (final ClassicHttpResponse response1 = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity1 = response1.getEntity();
+            Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response1.getCode());
+            Assert.assertNotNull(entity1);
+            EntityUtils.consume(entity1);
+        }
 
-        Assert.assertEquals(1, countingAuthenticator.getCount());
+        Mockito.verify(authenticator).authenticate(Mockito.any(), Mockito.any(), Mockito.any());
     }
 
     static class ProxyAuthHandler implements HttpRequestHandler {
@@ -557,15 +503,15 @@ public class TestClientAuthentication extends LocalServerTestBase {
         final HttpHost target = super.start();
 
         final HttpClientContext context = HttpClientContext.create();
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(null);
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
         context.setCredentialsProvider(credsProvider);
 
         final HttpGet httpget = new HttpGet("/");
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED,
-                response.getCode());
-        EntityUtils.consume(entity);
+        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED, response.getCode());
+            EntityUtils.consume(entity);
+        }
     }
 
     @Test
@@ -592,9 +538,10 @@ public class TestClientAuthentication extends LocalServerTestBase {
         for (int i = 0; i < 2; i++) {
             final HttpGet httpget = new HttpGet("/");
 
-            final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-            EntityUtils.consume(response.getEntity());
-            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+            try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+                EntityUtils.consume(response.getEntity());
+                Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+            }
         }
     }
 
@@ -619,8 +566,9 @@ public class TestClientAuthentication extends LocalServerTestBase {
 
         };
 
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
 
         final RequestConfig config = RequestConfig.custom()
                 .setTargetPreferredAuthSchemes(Collections.singletonList("MyBasic"))
@@ -688,19 +636,20 @@ public class TestClientAuthentication extends LocalServerTestBase {
                 });
 
         final HttpClientContext context = HttpClientContext.create();
-        final TestCredentialsProvider credsProvider = new TestCredentialsProvider(
-                new UsernamePasswordCredentials("test", "test".toCharArray()));
+        final CredentialsProvider credsProvider = Mockito.mock(CredentialsProvider.class);
+        Mockito.when(credsProvider.getCredentials(Mockito.any(), Mockito.any()))
+                .thenReturn(new UsernamePasswordCredentials("test", "test".toCharArray()));
         context.setCredentialsProvider(credsProvider);
         final HttpGet httpget = new HttpGet("/");
 
-        final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context);
-        final HttpEntity entity = response.getEntity();
-        Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
-        Assert.assertNotNull(entity);
-        EntityUtils.consume(entity);
-        final AuthScope authscope = credsProvider.getAuthScope();
-        Assert.assertNotNull(authscope);
-        Assert.assertEquals("test realm", authscope.getRealm());
+        try (final ClassicHttpResponse response = this.httpclient.execute(target, httpget, context)) {
+            final HttpEntity entity = response.getEntity();
+            Assert.assertEquals(HttpStatus.SC_OK, response.getCode());
+            Assert.assertNotNull(entity);
+            EntityUtils.consume(entity);
+        }
+        Mockito.verify(credsProvider).getCredentials(
+                Mockito.eq(new AuthScope(target, "test realm", "basic")), Mockito.any());
     }
 
 }