1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package org.apache.hc.client5.testing.sync.extension;
29
30 import java.io.IOException;
31 import java.util.function.Consumer;
32
33 import org.apache.hc.client5.http.config.ConnectionConfig;
34 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
35 import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
36 import org.apache.hc.client5.http.impl.classic.HttpClients;
37 import org.apache.hc.client5.http.impl.classic.MinimalHttpClient;
38 import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
39 import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
40 import org.apache.hc.client5.testing.SSLTestContexts;
41 import org.apache.hc.core5.function.Decorator;
42 import org.apache.hc.core5.http.HttpHost;
43 import org.apache.hc.core5.http.URIScheme;
44 import org.apache.hc.core5.http.config.Http1Config;
45 import org.apache.hc.core5.http.io.HttpServerRequestHandler;
46 import org.apache.hc.core5.http.io.SocketConfig;
47 import org.apache.hc.core5.http.protocol.HttpProcessor;
48 import org.apache.hc.core5.io.CloseMode;
49 import org.apache.hc.core5.testing.classic.ClassicTestServer;
50 import org.apache.hc.core5.util.Timeout;
51 import org.junit.jupiter.api.Assertions;
52 import org.junit.jupiter.api.extension.AfterEachCallback;
53 import org.junit.jupiter.api.extension.BeforeEachCallback;
54 import org.junit.jupiter.api.extension.ExtensionContext;
55 import org.slf4j.Logger;
56 import org.slf4j.LoggerFactory;
57
58 public class TestClientResources implements BeforeEachCallback, AfterEachCallback {
59
60 private static final Logger LOG = LoggerFactory.getLogger(TestClientResources.class);
61
62 private final URIScheme scheme;
63 private final Timeout timeout;
64
65 private ClassicTestServer server;
66 private PoolingHttpClientConnectionManager connManager;
67 private CloseableHttpClient client;
68
69 public TestClientResources(final URIScheme scheme, final Timeout timeout) {
70 this.scheme = scheme;
71 this.timeout = timeout;
72 }
73
74 @Override
75 public void beforeEach(final ExtensionContext extensionContext) throws Exception {
76 LOG.debug("Starting up test server");
77 server = new ClassicTestServer(
78 scheme == URIScheme.HTTPS ? SSLTestContexts.createServerSSLContext() : null,
79 SocketConfig.custom()
80 .setSoTimeout(timeout)
81 .build());
82 }
83
84 @Override
85 public void afterEach(final ExtensionContext extensionContext) throws Exception {
86 LOG.debug("Shutting down test server");
87
88 if (client != null) {
89 client.close(CloseMode.GRACEFUL);
90 }
91
92 if (connManager != null) {
93 connManager.close(CloseMode.IMMEDIATE);
94 }
95
96 if (server != null) {
97 server.shutdown(CloseMode.IMMEDIATE);
98 }
99 }
100
101 public ClassicTestServer startServer(
102 final Http1Config http1Config,
103 final HttpProcessor httpProcessor,
104 final Decorator<HttpServerRequestHandler> handlerDecorator) throws IOException {
105 Assertions.assertNotNull(server);
106 server.start(http1Config, httpProcessor, handlerDecorator);
107 return server;
108 }
109
110 public HttpHost targetHost() {
111 Assertions.assertNotNull(server);
112 return new HttpHost(scheme.id, "localhost", server.getPort());
113 }
114
115 public CloseableHttpClient startClient(
116 final Consumer<PoolingHttpClientConnectionManagerBuilder> connManagerCustomizer,
117 final Consumer<HttpClientBuilder> clientCustomizer) {
118 Assertions.assertNull(connManager);
119 Assertions.assertNull(client);
120
121 final PoolingHttpClientConnectionManagerBuilder connManagerBuilder = PoolingHttpClientConnectionManagerBuilder.create();
122 connManagerBuilder.setDefaultSocketConfig(SocketConfig.custom()
123 .setSoTimeout(timeout)
124 .build());
125 connManagerBuilder.setDefaultConnectionConfig(ConnectionConfig.custom()
126 .setConnectTimeout(timeout)
127 .build());
128 connManagerCustomizer.accept(connManagerBuilder);
129
130 connManager = connManagerBuilder.build();
131
132 final HttpClientBuilder clientBuilder = HttpClientBuilder.create()
133 .setConnectionManager(connManager);
134 clientCustomizer.accept(clientBuilder);
135 client = clientBuilder.build();
136 return client;
137 }
138
139 public MinimalHttpClient startMinimalClient() {
140 Assertions.assertNull(connManager);
141 Assertions.assertNull(client);
142
143 final PoolingHttpClientConnectionManagerBuilder connManagerBuilder = PoolingHttpClientConnectionManagerBuilder.create();
144 connManagerBuilder.setDefaultSocketConfig(SocketConfig.custom()
145 .setSoTimeout(timeout)
146 .build());
147 connManagerBuilder.setDefaultConnectionConfig(ConnectionConfig.custom()
148 .setConnectTimeout(timeout)
149 .build());
150 connManager = connManagerBuilder.build();
151
152 final MinimalHttpClient minimalClient = HttpClients.createMinimal(connManager);
153 client = minimalClient;
154 return minimalClient;
155 }
156
157 public CloseableHttpClient startClient(
158 final Consumer<HttpClientBuilder> clientCustomizer) {
159 return startClient(b -> {}, clientCustomizer);
160 }
161
162 public PoolingHttpClientConnectionManager connManager() {
163 Assertions.assertNotNull(connManager);
164 return connManager;
165 }
166
167 }