test/jdk/java/net/httpclient/HttpClientBuilderTest.java
changeset 49765 ee6f7a61f3a5
parent 48083 b1c1b4ef4be2
child 50681 4254bed3c09d
child 56451 9585061fdb04
--- a/test/jdk/java/net/httpclient/HttpClientBuilderTest.java	Tue Apr 17 15:39:20 2018 +0200
+++ b/test/jdk/java/net/httpclient/HttpClientBuilderTest.java	Tue Apr 17 08:54:17 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -21,19 +21,33 @@
  * questions.
  */
 
+import java.io.IOException;
 import java.lang.reflect.Method;
 import java.net.Authenticator;
 import java.net.CookieHandler;
 import java.net.CookieManager;
 import java.net.InetSocketAddress;
 import java.net.ProxySelector;
+import java.net.URI;
+import java.net.http.HttpHeaders;
+import java.net.http.HttpRequest;
+import java.net.http.HttpRequest.BodyPublishers;
+import java.net.http.HttpResponse;
+import java.net.http.HttpResponse.BodyHandler;
+import java.net.http.HttpResponse.BodyHandlers;
+import java.net.http.HttpResponse.PushPromiseHandler;
+import java.time.Duration;
 import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.TreeMap;
+import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Executor;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLParameters;
-import jdk.incubator.http.HttpClient;
-import jdk.incubator.http.HttpClient.Redirect;
-import jdk.incubator.http.HttpClient.Version;
+import java.net.http.HttpClient;
+import java.net.http.HttpClient.Redirect;
+import java.net.http.HttpClient.Version;
 import jdk.testlibrary.SimpleSSLContext;
 import org.testng.annotations.Test;
 import static org.testng.Assert.*;
@@ -48,6 +62,9 @@
 
 public class HttpClientBuilderTest {
 
+    static final Class<NullPointerException> NPE = NullPointerException.class;
+    static final Class<IllegalArgumentException> IAE = IllegalArgumentException.class;
+
     @Test
     public void testDefaults() throws Exception {
         List<HttpClient> clients = List.of(HttpClient.newHttpClient(),
@@ -69,14 +86,14 @@
     @Test
     public void testNull() throws Exception {
         HttpClient.Builder builder = HttpClient.newBuilder();
-        assertThrows(NullPointerException.class, () -> builder.authenticator(null));
-        assertThrows(NullPointerException.class, () -> builder.cookieHandler(null));
-        assertThrows(NullPointerException.class, () -> builder.executor(null));
-        assertThrows(NullPointerException.class, () -> builder.proxy(null));
-        assertThrows(NullPointerException.class, () -> builder.sslParameters(null));
-        assertThrows(NullPointerException.class, () -> builder.followRedirects(null));
-        assertThrows(NullPointerException.class, () -> builder.sslContext(null));
-        assertThrows(NullPointerException.class, () -> builder.version(null));
+        assertThrows(NPE, () -> builder.authenticator(null));
+        assertThrows(NPE, () -> builder.cookieHandler(null));
+        assertThrows(NPE, () -> builder.executor(null));
+        assertThrows(NPE, () -> builder.proxy(null));
+        assertThrows(NPE, () -> builder.sslParameters(null));
+        assertThrows(NPE, () -> builder.followRedirects(null));
+        assertThrows(NPE, () -> builder.sslContext(null));
+        assertThrows(NPE, () -> builder.version(null));
     }
 
     static class TestAuthenticator extends Authenticator { }
@@ -90,7 +107,7 @@
         Authenticator b = new TestAuthenticator();
         builder.authenticator(b);
         assertTrue(builder.build().authenticator().get() == b);
-        assertThrows(NullPointerException.class, () -> builder.authenticator(null));
+        assertThrows(NPE, () -> builder.authenticator(null));
         Authenticator c = new TestAuthenticator();
         builder.authenticator(c);
         assertTrue(builder.build().authenticator().get() == c);
@@ -105,7 +122,7 @@
         CookieHandler b = new CookieManager();
         builder.cookieHandler(b);
         assertTrue(builder.build().cookieHandler().get() == b);
-        assertThrows(NullPointerException.class, () -> builder.cookieHandler(null));
+        assertThrows(NPE, () -> builder.cookieHandler(null));
         CookieManager c = new CookieManager();
         builder.cookieHandler(c);
         assertTrue(builder.build().cookieHandler().get() == c);
@@ -124,7 +141,7 @@
         TestExecutor b = new TestExecutor();
         builder.executor(b);
         assertTrue(builder.build().executor().get() == b);
-        assertThrows(NullPointerException.class, () -> builder.executor(null));
+        assertThrows(NPE, () -> builder.executor(null));
         TestExecutor c = new TestExecutor();
         builder.executor(c);
         assertTrue(builder.build().executor().get() == c);
@@ -139,7 +156,7 @@
         ProxySelector b = ProxySelector.of(InetSocketAddress.createUnresolved("foo", 80));
         builder.proxy(b);
         assertTrue(builder.build().proxy().get() == b);
-        assertThrows(NullPointerException.class, () -> builder.proxy(null));
+        assertThrows(NPE, () -> builder.proxy(null));
         ProxySelector c = ProxySelector.of(InetSocketAddress.createUnresolved("bar", 80));
         builder.proxy(c);
         assertTrue(builder.build().proxy().get() == c);
@@ -159,7 +176,7 @@
         builder.sslParameters(b);
         assertTrue(builder.build().sslParameters() != b);
         assertTrue(builder.build().sslParameters().getEnableRetransmissions());
-        assertThrows(NullPointerException.class, () -> builder.sslParameters(null));
+        assertThrows(NPE, () -> builder.sslParameters(null));
         SSLParameters c = new SSLParameters();
         c.setProtocols(new String[] { "C" });
         builder.sslParameters(c);
@@ -176,7 +193,7 @@
         SSLContext b = (new SimpleSSLContext()).get();
         builder.sslContext(b);
         assertTrue(builder.build().sslContext() == b);
-        assertThrows(NullPointerException.class, () -> builder.sslContext(null));
+        assertThrows(NPE, () -> builder.sslContext(null));
         SSLContext c = (new SimpleSSLContext()).get();
         builder.sslContext(c);
         assertTrue(builder.build().sslContext() == c);
@@ -189,11 +206,9 @@
         assertTrue(builder.build().followRedirects() == Redirect.ALWAYS);
         builder.followRedirects(Redirect.NEVER);
         assertTrue(builder.build().followRedirects() == Redirect.NEVER);
-        assertThrows(NullPointerException.class, () -> builder.followRedirects(null));
-        builder.followRedirects(Redirect.SAME_PROTOCOL);
-        assertTrue(builder.build().followRedirects() == Redirect.SAME_PROTOCOL);
-        builder.followRedirects(Redirect.SECURE);
-        assertTrue(builder.build().followRedirects() == Redirect.SECURE);
+        assertThrows(NPE, () -> builder.followRedirects(null));
+        builder.followRedirects(Redirect.NORMAL);
+        assertTrue(builder.build().followRedirects() == Redirect.NORMAL);
     }
 
     @Test
@@ -203,7 +218,7 @@
         assertTrue(builder.build().version() == Version.HTTP_2);
         builder.version(Version.HTTP_1_1);
         assertTrue(builder.build().version() == Version.HTTP_1_1);
-        assertThrows(NullPointerException.class, () -> builder.version(null));
+        assertThrows(NPE, () -> builder.version(null));
         builder.version(Version.HTTP_2);
         assertTrue(builder.build().version() == Version.HTTP_2);
         builder.version(Version.HTTP_1_1);
@@ -213,10 +228,10 @@
     @Test
     static void testPriority() throws Exception {
         HttpClient.Builder builder = HttpClient.newBuilder();
-        assertThrows(IllegalArgumentException.class, () -> builder.priority(-1));
-        assertThrows(IllegalArgumentException.class, () -> builder.priority(0));
-        assertThrows(IllegalArgumentException.class, () -> builder.priority(257));
-        assertThrows(IllegalArgumentException.class, () -> builder.priority(500));
+        assertThrows(IAE, () -> builder.priority(-1));
+        assertThrows(IAE, () -> builder.priority(0));
+        assertThrows(IAE, () -> builder.priority(257));
+        assertThrows(IAE, () -> builder.priority(500));
 
         builder.priority(1);
         builder.build();
@@ -224,6 +239,90 @@
         builder.build();
     }
 
+    // ---
+
+    static final URI uri = URI.create("http://foo.com/");
+
+    @Test
+    static void testHttpClientSendArgs() throws Exception {
+        HttpClient client = HttpClient.newHttpClient();
+        HttpRequest request = HttpRequest.newBuilder(uri).build();
+
+        assertThrows(NPE, () -> client.send(null, BodyHandlers.discarding()));
+        assertThrows(NPE, () -> client.send(request, null));
+        assertThrows(NPE, () -> client.send(null, null));
+
+        assertThrows(NPE, () -> client.sendAsync(null, BodyHandlers.discarding()));
+        assertThrows(NPE, () -> client.sendAsync(request, null));
+        assertThrows(NPE, () -> client.sendAsync(null, null));
+
+        assertThrows(NPE, () -> client.sendAsync(null, BodyHandlers.discarding(), null));
+        assertThrows(NPE, () -> client.sendAsync(request, null, null));
+        assertThrows(NPE, () -> client.sendAsync(null, null, null));
+
+        // CONNECT is disallowed in the implementation, since it is used for
+        // tunneling, and is handled separately for security checks.
+        HttpRequest connectRequest = new HttpConnectRequest();
+        assertThrows(IAE, () -> client.send(connectRequest, BodyHandlers.discarding()));
+        assertThrows(IAE, () -> client.sendAsync(connectRequest, BodyHandlers.discarding()));
+        assertThrows(IAE, () -> client.sendAsync(connectRequest, BodyHandlers.discarding(), null));
+    }
+
+    static class HttpConnectRequest extends HttpRequest {
+        @Override public Optional<BodyPublisher> bodyPublisher() { return Optional.empty(); }
+        @Override public String method() { return "CONNECT"; }
+        @Override public Optional<Duration> timeout() { return Optional.empty(); }
+        @Override public boolean expectContinue() { return false; }
+        @Override public URI uri() { return URI.create("http://foo.com/"); }
+        @Override public Optional<Version> version() { return Optional.empty(); }
+        private final FixedHttpHeaders headers = new FixedHttpHeaders();
+        @Override public HttpHeaders headers() { return headers; }
+        public class FixedHttpHeaders extends HttpHeaders {
+            private final Map<String, List<String>> map =
+                    new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
+            @Override
+            public Map<String, List<String>> map() {
+                return map;
+            }
+        }
+    }
+
+    // ---
+
+    static final Class<UnsupportedOperationException> UOE =
+            UnsupportedOperationException.class;
+
+    @Test
+    static void testUnsupportedWebSocket() throws Exception {
+        //  @implSpec The default implementation of this method throws
+        // {@code UnsupportedOperationException}.
+        assertThrows(UOE, () -> (new MockHttpClient()).newWebSocketBuilder());
+    }
+
+    static class MockHttpClient extends HttpClient {
+        @Override public Optional<CookieHandler> cookieHandler() { return null; }
+        @Override public Redirect followRedirects() { return null; }
+        @Override public Optional<ProxySelector> proxy() { return null; }
+        @Override public SSLContext sslContext() { return null; }
+        @Override public SSLParameters sslParameters() { return null; }
+        @Override public Optional<Authenticator> authenticator() { return null; }
+        @Override public Version version() { return null; }
+        @Override public Optional<Executor> executor() { return null; }
+        @Override public <T> HttpResponse<T>
+        send(HttpRequest request, BodyHandler<T> responseBodyHandler)
+                throws IOException, InterruptedException {
+            return null;
+        }
+        @Override public <T> CompletableFuture<HttpResponse<T>>
+        sendAsync(HttpRequest request, BodyHandler<T> responseBodyHandler) {
+            return null;
+        }
+        @Override
+        public <T> CompletableFuture<HttpResponse<T>>
+        sendAsync(HttpRequest x, BodyHandler<T> y, PushPromiseHandler<T> z) {
+            return null;
+        }
+    }
 
     /* ---- standalone entry point ---- */