--- old/test/jdk/java/net/httpclient/TimeoutBasic.java 2017-11-30 04:05:06.362942601 -0800 +++ new/test/jdk/java/net/httpclient/TimeoutBasic.java 2017-11-30 04:05:06.156924595 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, 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 @@ -28,66 +28,157 @@ import jdk.incubator.http.HttpRequest; import jdk.incubator.http.HttpResponse; import jdk.incubator.http.HttpTimeoutException; +import jdk.testlibrary.SimpleSSLContext; + +import javax.net.ServerSocketFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLServerSocketFactory; import java.time.Duration; +import java.util.Arrays; import java.util.List; -import java.util.concurrent.*; +import java.util.concurrent.CompletionException; +import java.util.function.Function; import static java.lang.System.out; import static jdk.incubator.http.HttpResponse.BodyHandler.discard; /** * @test + * @library /lib/testlibrary + * @build jdk.testlibrary.SimpleSSLContext * @summary Basic tests for response timeouts * @run main/othervm TimeoutBasic - * @ignore */ public class TimeoutBasic { - static List TIMEOUTS = List.of(/*Duration.ofSeconds(1), - Duration.ofMillis(100),*/ - Duration.ofNanos(99) - /* Duration.ofNanos(1)*/); + static List TIMEOUTS = List.of(Duration.ofSeconds(1), + Duration.ofMillis(100), + Duration.ofNanos(99), + Duration.ofNanos(1)); + + static final List> METHODS = + Arrays.asList(HttpRequest.Builder::GET, + TimeoutBasic::DELETE, + TimeoutBasic::PUT, + TimeoutBasic::POST, + null); + + static final List VERSIONS = + Arrays.asList(HttpClient.Version.HTTP_2, HttpClient.Version.HTTP_1_1, null); + + static final List SCHEMES = List.of("https", "http"); + + static { + try { + SSLContext.setDefault(new SimpleSSLContext().get()); + } catch (IOException x) { + throw new ExceptionInInitializerError(x); + } + } public static void main(String[] args) throws Exception { - HttpClient client = HttpClient.newHttpClient(); - try (ServerSocket ss = new ServerSocket(0, 20)) { + for (Function m : METHODS) { + for (HttpClient.Version version : List.of(HttpClient.Version.HTTP_1_1)) { + for (HttpClient.Version reqVersion : VERSIONS) { + for (String scheme : SCHEMES) { + ServerSocketFactory ssf; + if (scheme.equalsIgnoreCase("https")) { + ssf = SSLServerSocketFactory.getDefault(); + } else { + ssf = ServerSocketFactory.getDefault(); + } + test(version, reqVersion, scheme, m, ssf); + } + } + } + } + } + + static HttpRequest.Builder DELETE(HttpRequest.Builder builder) { + HttpRequest.BodyPublisher noBody = HttpRequest.BodyPublisher.noBody(); + return builder.DELETE(noBody); + } + + static HttpRequest.Builder PUT(HttpRequest.Builder builder) { + HttpRequest.BodyPublisher noBody = HttpRequest.BodyPublisher.noBody(); + return builder.PUT(noBody); + } + + static HttpRequest.Builder POST(HttpRequest.Builder builder) { + HttpRequest.BodyPublisher noBody = HttpRequest.BodyPublisher.noBody(); + return builder.POST(noBody); + } + + static HttpRequest newRequest(URI uri, + Duration duration, + HttpClient.Version reqVersion, + Function method) { + HttpRequest.Builder reqBuilder = HttpRequest.newBuilder(uri) + .timeout(duration); + if (method != null) reqBuilder = method.apply(reqBuilder); + if (reqVersion != null) reqBuilder = reqBuilder.version(reqVersion); + HttpRequest request = reqBuilder.build(); + if (duration.compareTo(Duration.ofSeconds(1)) >= 0) { + if (method == null || !request.method().equalsIgnoreCase("get")) { + out.println("Skipping " + duration + " for " + request.method()); + return null; + } + } + return request; + } + + public static void test(HttpClient.Version version, + HttpClient.Version reqVersion, + String scheme, + Function method, + ServerSocketFactory ssf) + throws Exception + { + HttpClient.Builder builder = HttpClient.newBuilder() + .proxy(HttpClient.Builder.NO_PROXY); + if (version != null) builder.version(version); + HttpClient client = builder.build(); + out.printf("%ntest(version=%s, reqVersion=%s, scheme=%s)%n", version, reqVersion, scheme); + try (ServerSocket ss = ssf.createServerSocket(0, 20)) { int port = ss.getLocalPort(); - URI uri = new URI("http://127.0.0.1:" + port + "/"); + URI uri = new URI(scheme +"://127.0.0.1:" + port + "/"); -// out.println("--- TESTING Async"); -// for (Duration duration : TIMEOUTS) { -// out.println(" with duration of " + duration); -// HttpRequest request = HttpRequest.newBuilder(uri) -// .timeout(duration) -// .GET().build(); -// try { -// HttpResponse resp = client.sendAsync(request, discard(null)).join(); -// throw new RuntimeException("Unexpected response: " + resp.statusCode()); -// } catch (CompletionException e) { -// if (!(e.getCause() instanceof HttpTimeoutException)) { -// throw new RuntimeException("Unexpected exception: " + e.getCause()); -// } else { -// out.println("Caught expected timeout: " + e.getCause()); -// } -// } -// } + out.println("--- TESTING Async"); + int count = 0; + for (Duration duration : TIMEOUTS) { + out.println(" with duration of " + duration); + HttpRequest request = newRequest(uri, duration, reqVersion, method); + if (request == null) continue; + count++; + try { + HttpResponse resp = client.sendAsync(request, discard(null)).join(); + throw new RuntimeException("Unexpected response: " + resp.statusCode()); + } catch (CompletionException e) { + if (!(e.getCause() instanceof HttpTimeoutException)) { + throw new RuntimeException("Unexpected exception: " + e.getCause()); + } else { + out.println("Caught expected timeout: " + e.getCause()); + } + } + } + assert count >= TIMEOUTS.size() -1; out.println("--- TESTING Sync"); + count = 0; for (Duration duration : TIMEOUTS) { out.println(" with duration of " + duration); - HttpRequest request = HttpRequest.newBuilder(uri) - .timeout(duration) - .GET() - .build(); + HttpRequest request = newRequest(uri, duration, reqVersion, method); + if (request == null) continue; + count++; try { client.send(request, discard(null)); } catch (HttpTimeoutException e) { out.println("Caught expected timeout: " + e); } } - } finally { - ((ExecutorService) client.executor()).shutdownNow(); + assert count >= TIMEOUTS.size() -1; + } } }