33 import java.net.http.HttpRequest;
34 import java.net.http.HttpRequest.BodyPublishers;
35 import java.net.http.HttpResponse;
36 import java.net.http.HttpResponse.BodyHandler;
37 import java.net.http.HttpResponse.BodyHandlers;
38 import java.net.http.HttpResponse.PushPromiseHandler;
39 import java.time.Duration;
40 import java.util.List;
41 import java.util.Map;
42 import java.util.Optional;
43 import java.util.TreeMap;
44 import java.util.concurrent.CompletableFuture;
45 import java.util.concurrent.Executor;
46 import javax.net.ssl.SSLContext;
47 import javax.net.ssl.SSLParameters;
48 import java.net.http.HttpClient;
49 import java.net.http.HttpClient.Redirect;
50 import java.net.http.HttpClient.Version;
51 import jdk.testlibrary.SimpleSSLContext;
52 import org.testng.annotations.Test;
53 import static org.testng.Assert.*;
54
55 /*
56 * @test
57 * @summary HttpClient[.Builder] API and behaviour checks
58 * @library /lib/testlibrary/
59 * @build jdk.testlibrary.SimpleSSLContext
60 * @run testng HttpClientBuilderTest
61 */
62
63 public class HttpClientBuilderTest {
64
65 static final Class<NullPointerException> NPE = NullPointerException.class;
66 static final Class<IllegalArgumentException> IAE = IllegalArgumentException.class;
67
68 @Test
69 public void testDefaults() throws Exception {
70 List<HttpClient> clients = List.of(HttpClient.newHttpClient(),
71 HttpClient.newBuilder().build());
72
73 for (HttpClient client : clients) {
74 // Empty optionals and defaults
75 assertFalse(client.authenticator().isPresent());
76 assertFalse(client.cookieHandler().isPresent());
77 assertFalse(client.executor().isPresent());
78 assertFalse(client.proxy().isPresent());
79 assertTrue(client.sslParameters() != null);
80 assertTrue(client.followRedirects().equals(HttpClient.Redirect.NEVER));
81 assertTrue(client.sslContext() == SSLContext.getDefault());
82 assertTrue(client.version().equals(HttpClient.Version.HTTP_2));
83 }
84 }
85
86 @Test
87 public void testNull() throws Exception {
88 HttpClient.Builder builder = HttpClient.newBuilder();
89 assertThrows(NPE, () -> builder.authenticator(null));
90 assertThrows(NPE, () -> builder.cookieHandler(null));
91 assertThrows(NPE, () -> builder.executor(null));
92 assertThrows(NPE, () -> builder.proxy(null));
93 assertThrows(NPE, () -> builder.sslParameters(null));
94 assertThrows(NPE, () -> builder.followRedirects(null));
95 assertThrows(NPE, () -> builder.sslContext(null));
96 assertThrows(NPE, () -> builder.version(null));
97 }
98
99 static class TestAuthenticator extends Authenticator { }
100
101 @Test
102 public void testAuthenticator() {
103 HttpClient.Builder builder = HttpClient.newBuilder();
104 Authenticator a = new TestAuthenticator();
105 builder.authenticator(a);
106 assertTrue(builder.build().authenticator().get() == a);
107 Authenticator b = new TestAuthenticator();
108 builder.authenticator(b);
109 assertTrue(builder.build().authenticator().get() == b);
110 assertThrows(NPE, () -> builder.authenticator(null));
111 Authenticator c = new TestAuthenticator();
112 builder.authenticator(c);
113 assertTrue(builder.build().authenticator().get() == c);
114 }
115
116 @Test
117 public void testCookieHandler() {
118 HttpClient.Builder builder = HttpClient.newBuilder();
119 CookieHandler a = new CookieManager();
120 builder.cookieHandler(a);
121 assertTrue(builder.build().cookieHandler().get() == a);
122 CookieHandler b = new CookieManager();
123 builder.cookieHandler(b);
124 assertTrue(builder.build().cookieHandler().get() == b);
125 assertThrows(NPE, () -> builder.cookieHandler(null));
126 CookieManager c = new CookieManager();
127 builder.cookieHandler(c);
128 assertTrue(builder.build().cookieHandler().get() == c);
129 }
130
131 static class TestExecutor implements Executor {
132 public void execute(Runnable r) { }
133 }
134
135 @Test
136 public void testExecutor() {
137 HttpClient.Builder builder = HttpClient.newBuilder();
138 TestExecutor a = new TestExecutor();
139 builder.executor(a);
140 assertTrue(builder.build().executor().get() == a);
141 TestExecutor b = new TestExecutor();
142 builder.executor(b);
143 assertTrue(builder.build().executor().get() == b);
144 assertThrows(NPE, () -> builder.executor(null));
145 TestExecutor c = new TestExecutor();
146 builder.executor(c);
147 assertTrue(builder.build().executor().get() == c);
148 }
149
150 @Test
275 @Override public boolean expectContinue() { return false; }
276 @Override public URI uri() { return URI.create("http://foo.com/"); }
277 @Override public Optional<Version> version() { return Optional.empty(); }
278 @Override public HttpHeaders headers() { return HttpHeaders.of(Map.of(), (x, y) -> true); }
279 }
280
281 // ---
282
283 static final Class<UnsupportedOperationException> UOE =
284 UnsupportedOperationException.class;
285
286 @Test
287 static void testUnsupportedWebSocket() throws Exception {
288 // @implSpec The default implementation of this method throws
289 // {@code UnsupportedOperationException}.
290 assertThrows(UOE, () -> (new MockHttpClient()).newWebSocketBuilder());
291 }
292
293 static class MockHttpClient extends HttpClient {
294 @Override public Optional<CookieHandler> cookieHandler() { return null; }
295 @Override public Redirect followRedirects() { return null; }
296 @Override public Optional<ProxySelector> proxy() { return null; }
297 @Override public SSLContext sslContext() { return null; }
298 @Override public SSLParameters sslParameters() { return null; }
299 @Override public Optional<Authenticator> authenticator() { return null; }
300 @Override public Version version() { return null; }
301 @Override public Optional<Executor> executor() { return null; }
302 @Override public <T> HttpResponse<T>
303 send(HttpRequest request, BodyHandler<T> responseBodyHandler)
304 throws IOException, InterruptedException {
305 return null;
306 }
307 @Override public <T> CompletableFuture<HttpResponse<T>>
308 sendAsync(HttpRequest request, BodyHandler<T> responseBodyHandler) {
309 return null;
310 }
311 @Override
312 public <T> CompletableFuture<HttpResponse<T>>
313 sendAsync(HttpRequest x, BodyHandler<T> y, PushPromiseHandler<T> z) {
314 return null;
|
33 import java.net.http.HttpRequest;
34 import java.net.http.HttpRequest.BodyPublishers;
35 import java.net.http.HttpResponse;
36 import java.net.http.HttpResponse.BodyHandler;
37 import java.net.http.HttpResponse.BodyHandlers;
38 import java.net.http.HttpResponse.PushPromiseHandler;
39 import java.time.Duration;
40 import java.util.List;
41 import java.util.Map;
42 import java.util.Optional;
43 import java.util.TreeMap;
44 import java.util.concurrent.CompletableFuture;
45 import java.util.concurrent.Executor;
46 import javax.net.ssl.SSLContext;
47 import javax.net.ssl.SSLParameters;
48 import java.net.http.HttpClient;
49 import java.net.http.HttpClient.Redirect;
50 import java.net.http.HttpClient.Version;
51 import jdk.testlibrary.SimpleSSLContext;
52 import org.testng.annotations.Test;
53 import static java.time.Duration.*;
54 import static org.testng.Assert.*;
55
56 /*
57 * @test
58 * @summary HttpClient[.Builder] API and behaviour checks
59 * @library /lib/testlibrary/
60 * @build jdk.testlibrary.SimpleSSLContext
61 * @run testng HttpClientBuilderTest
62 */
63
64 public class HttpClientBuilderTest {
65
66 static final Class<NullPointerException> NPE = NullPointerException.class;
67 static final Class<IllegalArgumentException> IAE = IllegalArgumentException.class;
68
69 @Test
70 public void testDefaults() throws Exception {
71 List<HttpClient> clients = List.of(HttpClient.newHttpClient(),
72 HttpClient.newBuilder().build());
73
74 for (HttpClient client : clients) {
75 // Empty optionals and defaults
76 assertFalse(client.authenticator().isPresent());
77 assertFalse(client.cookieHandler().isPresent());
78 assertFalse(client.connectTimeout().isPresent());
79 assertFalse(client.executor().isPresent());
80 assertFalse(client.proxy().isPresent());
81 assertTrue(client.sslParameters() != null);
82 assertTrue(client.followRedirects().equals(HttpClient.Redirect.NEVER));
83 assertTrue(client.sslContext() == SSLContext.getDefault());
84 assertTrue(client.version().equals(HttpClient.Version.HTTP_2));
85 }
86 }
87
88 @Test
89 public void testNull() throws Exception {
90 HttpClient.Builder builder = HttpClient.newBuilder();
91 assertThrows(NPE, () -> builder.authenticator(null));
92 assertThrows(NPE, () -> builder.cookieHandler(null));
93 assertThrows(NPE, () -> builder.connectTimeout(null));
94 assertThrows(NPE, () -> builder.executor(null));
95 assertThrows(NPE, () -> builder.proxy(null));
96 assertThrows(NPE, () -> builder.sslParameters(null));
97 assertThrows(NPE, () -> builder.followRedirects(null));
98 assertThrows(NPE, () -> builder.sslContext(null));
99 assertThrows(NPE, () -> builder.version(null));
100 }
101
102 static class TestAuthenticator extends Authenticator { }
103
104 @Test
105 public void testAuthenticator() {
106 HttpClient.Builder builder = HttpClient.newBuilder();
107 Authenticator a = new TestAuthenticator();
108 builder.authenticator(a);
109 assertTrue(builder.build().authenticator().get() == a);
110 Authenticator b = new TestAuthenticator();
111 builder.authenticator(b);
112 assertTrue(builder.build().authenticator().get() == b);
113 assertThrows(NPE, () -> builder.authenticator(null));
114 Authenticator c = new TestAuthenticator();
115 builder.authenticator(c);
116 assertTrue(builder.build().authenticator().get() == c);
117 }
118
119 @Test
120 public void testCookieHandler() {
121 HttpClient.Builder builder = HttpClient.newBuilder();
122 CookieHandler a = new CookieManager();
123 builder.cookieHandler(a);
124 assertTrue(builder.build().cookieHandler().get() == a);
125 CookieHandler b = new CookieManager();
126 builder.cookieHandler(b);
127 assertTrue(builder.build().cookieHandler().get() == b);
128 assertThrows(NPE, () -> builder.cookieHandler(null));
129 CookieManager c = new CookieManager();
130 builder.cookieHandler(c);
131 assertTrue(builder.build().cookieHandler().get() == c);
132 }
133
134 @Test
135 public void testConnectTimeout() {
136 HttpClient.Builder builder = HttpClient.newBuilder();
137 Duration a = Duration.ofSeconds(5);
138 builder.connectTimeout(a);
139 assertTrue(builder.build().connectTimeout().get() == a);
140 Duration b = Duration.ofMinutes(1);
141 builder.connectTimeout(b);
142 assertTrue(builder.build().connectTimeout().get() == b);
143 assertThrows(NPE, () -> builder.cookieHandler(null));
144 Duration c = Duration.ofHours(100);
145 builder.connectTimeout(c);
146 assertTrue(builder.build().connectTimeout().get() == c);
147
148 assertThrows(IAE, () -> builder.connectTimeout(ZERO));
149 assertThrows(IAE, () -> builder.connectTimeout(ofSeconds(0)));
150 assertThrows(IAE, () -> builder.connectTimeout(ofSeconds(-1)));
151 assertThrows(IAE, () -> builder.connectTimeout(ofNanos(-100)));
152 }
153
154 static class TestExecutor implements Executor {
155 public void execute(Runnable r) { }
156 }
157
158 @Test
159 public void testExecutor() {
160 HttpClient.Builder builder = HttpClient.newBuilder();
161 TestExecutor a = new TestExecutor();
162 builder.executor(a);
163 assertTrue(builder.build().executor().get() == a);
164 TestExecutor b = new TestExecutor();
165 builder.executor(b);
166 assertTrue(builder.build().executor().get() == b);
167 assertThrows(NPE, () -> builder.executor(null));
168 TestExecutor c = new TestExecutor();
169 builder.executor(c);
170 assertTrue(builder.build().executor().get() == c);
171 }
172
173 @Test
298 @Override public boolean expectContinue() { return false; }
299 @Override public URI uri() { return URI.create("http://foo.com/"); }
300 @Override public Optional<Version> version() { return Optional.empty(); }
301 @Override public HttpHeaders headers() { return HttpHeaders.of(Map.of(), (x, y) -> true); }
302 }
303
304 // ---
305
306 static final Class<UnsupportedOperationException> UOE =
307 UnsupportedOperationException.class;
308
309 @Test
310 static void testUnsupportedWebSocket() throws Exception {
311 // @implSpec The default implementation of this method throws
312 // {@code UnsupportedOperationException}.
313 assertThrows(UOE, () -> (new MockHttpClient()).newWebSocketBuilder());
314 }
315
316 static class MockHttpClient extends HttpClient {
317 @Override public Optional<CookieHandler> cookieHandler() { return null; }
318 @Override public Optional<Duration> connectTimeout() { return null; }
319 @Override public Redirect followRedirects() { return null; }
320 @Override public Optional<ProxySelector> proxy() { return null; }
321 @Override public SSLContext sslContext() { return null; }
322 @Override public SSLParameters sslParameters() { return null; }
323 @Override public Optional<Authenticator> authenticator() { return null; }
324 @Override public Version version() { return null; }
325 @Override public Optional<Executor> executor() { return null; }
326 @Override public <T> HttpResponse<T>
327 send(HttpRequest request, BodyHandler<T> responseBodyHandler)
328 throws IOException, InterruptedException {
329 return null;
330 }
331 @Override public <T> CompletableFuture<HttpResponse<T>>
332 sendAsync(HttpRequest request, BodyHandler<T> responseBodyHandler) {
333 return null;
334 }
335 @Override
336 public <T> CompletableFuture<HttpResponse<T>>
337 sendAsync(HttpRequest x, BodyHandler<T> y, PushPromiseHandler<T> z) {
338 return null;
|