1 /*
2  * Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 import java.io.ByteArrayOutputStream;
25 import java.io.IOException;
26 import java.io.InputStream;
27 import java.io.OutputStream;
28 import java.io.UncheckedIOException;
29 import java.net.InetAddress;
30 import java.net.InetSocketAddress;
31 import java.net.URI;
32 import java.nio.ByteBuffer;
33 import java.util.Collection;
34 import java.util.List;
35 import java.util.concurrent.CompletableFuture;
36 import java.util.concurrent.Flow;
37 import java.util.concurrent.Flow.Subscriber;
38 import java.util.function.Function;
39 import java.util.function.Supplier;
40 import com.sun.net.httpserver.HttpExchange;
41 import com.sun.net.httpserver.HttpHandler;
42 import com.sun.net.httpserver.HttpServer;
43 import com.sun.net.httpserver.HttpsConfigurator;
44 import com.sun.net.httpserver.HttpsServer;
45 import java.net.http.HttpClient;
46 import java.net.http.HttpRequest;
47 import java.net.http.HttpRequest.BodyPublishers;
48 import java.net.http.HttpResponse;
49 import java.net.http.HttpResponse.BodyHandlers;
50 import java.net.http.HttpResponse.BodySubscribers;
51 import jdk.test.lib.net.SimpleSSLContext;
52 import org.testng.annotations.AfterTest;
53 import org.testng.annotations.BeforeTest;
54 import org.testng.annotations.DataProvider;
55 import org.testng.annotations.Test;
56 import javax.net.ssl.SSLContext;
57 import static java.nio.charset.StandardCharsets.UTF_8;
58 import static org.testng.Assert.assertEquals;
59 import static org.testng.Assert.assertThrows;
60 import static org.testng.Assert.assertTrue;
61 
62 /*
63  * @test
64  * @summary Basic tests for Flow adapter Subscribers
65  * @modules java.base/sun.net.www.http
66  *          java.net.http/jdk.internal.net.http.common
67  *          java.net.http/jdk.internal.net.http.frame
68  *          java.net.http/jdk.internal.net.http.hpack
69  *          java.logging
70  *          jdk.httpserver
71  * @library /test/lib http2/server
72  * @build Http2TestServer
73  * @build jdk.test.lib.net.SimpleSSLContext
74  * @run testng/othervm -Djdk.internal.httpclient.debug=true FlowAdapterSubscriberTest
75  */
76 
77 public class FlowAdapterSubscriberTest {
78 
79     SSLContext sslContext;
80     HttpServer httpTestServer;         // HTTP/1.1    [ 4 servers ]
81     HttpsServer httpsTestServer;       // HTTPS/1.1
82     Http2TestServer http2TestServer;   // HTTP/2 ( h2c )
83     Http2TestServer https2TestServer;  // HTTP/2 ( h2  )
84     String httpURI;
85     String httpsURI;
86     String http2URI;
87     String https2URI;
88     static final long start = System.nanoTime();
now()89     public static String now() {
90         long now = System.nanoTime() - start;
91         long secs = now / 1000_000_000;
92         long mill = (now % 1000_000_000) / 1000_000;
93         long nan = now % 1000_000;
94         return String.format("[%d s, %d ms, %d ns] ", secs, mill, nan);
95     }
96 
97     @DataProvider(name = "uris")
variants()98     public Object[][] variants() {
99         return new Object[][]{
100                 { httpURI   },
101                 { httpsURI  },
102                 { http2URI  },
103                 { https2URI },
104         };
105     }
106 
107     static final Class<NullPointerException> NPE = NullPointerException.class;
108 
109     @Test
testNull()110     public void testNull() {
111         System.out.printf(now() + "testNull() starting%n");
112         assertThrows(NPE, () -> BodyHandlers.fromSubscriber(null));
113         assertThrows(NPE, () -> BodyHandlers.fromSubscriber(null, Function.identity()));
114         assertThrows(NPE, () -> BodyHandlers.fromSubscriber(new ListSubscriber(), null));
115         assertThrows(NPE, () -> BodyHandlers.fromSubscriber(null, null));
116 
117         assertThrows(NPE, () -> BodySubscribers.fromSubscriber(null));
118         assertThrows(NPE, () -> BodySubscribers.fromSubscriber(null, Function.identity()));
119         assertThrows(NPE, () -> BodySubscribers.fromSubscriber(new ListSubscriber(), null));
120         assertThrows(NPE, () -> BodySubscribers.fromSubscriber(null, null));
121 
122         Subscriber subscriber = BodySubscribers.fromSubscriber(new ListSubscriber());
123         assertThrows(NPE, () -> subscriber.onSubscribe(null));
124         assertThrows(NPE, () -> subscriber.onNext(null));
125         assertThrows(NPE, () -> subscriber.onError(null));
126     }
127 
128     // List<ByteBuffer>
129 
130     @Test(dataProvider = "uris")
testListWithFinisher(String url)131     void testListWithFinisher(String url) {
132         System.out.printf(now() + "testListWithFinisher(%s) starting%n", url);
133         HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();
134         HttpRequest request = HttpRequest.newBuilder(URI.create(url))
135                 .POST(BodyPublishers.ofString("May the luck of the Irish be with you!")).build();
136 
137         ListSubscriber subscriber = new ListSubscriber();
138         HttpResponse<String> response = client.sendAsync(request,
139                 BodyHandlers.fromSubscriber(subscriber, Supplier::get)).join();
140         String text = response.body();
141         System.out.println(text);
142         assertEquals(response.statusCode(), 200);
143         assertEquals(text, "May the luck of the Irish be with you!");
144     }
145 
146     @Test(dataProvider = "uris")
testListWithoutFinisher(String url)147     void testListWithoutFinisher(String url) {
148         System.out.printf(now() + "testListWithoutFinisher(%s) starting%n", url);
149         HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();
150         HttpRequest request = HttpRequest.newBuilder(URI.create(url))
151                 .POST(BodyPublishers.ofString("May the luck of the Irish be with you!")).build();
152 
153         ListSubscriber subscriber = new ListSubscriber();
154         HttpResponse<Void> response = client.sendAsync(request,
155                 BodyHandlers.fromSubscriber(subscriber)).join();
156         String text = subscriber.get();
157         System.out.println(text);
158         assertEquals(response.statusCode(), 200);
159         assertEquals(text, "May the luck of the Irish be with you!");
160     }
161 
162     @Test(dataProvider = "uris")
testListWithFinisherBlocking(String url)163     void testListWithFinisherBlocking(String url) throws Exception {
164         System.out.printf(now() + "testListWithFinisherBlocking(%s) starting%n", url);
165         HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();
166         HttpRequest request = HttpRequest.newBuilder(URI.create(url))
167                 .POST(BodyPublishers.ofString("May the luck of the Irish be with you!")).build();
168 
169         ListSubscriber subscriber = new ListSubscriber();
170         HttpResponse<String> response = client.send(request,
171                 BodyHandlers.fromSubscriber(subscriber, Supplier::get));
172         String text = response.body();
173         System.out.println(text);
174         assertEquals(response.statusCode(), 200);
175         assertEquals(text, "May the luck of the Irish be with you!");
176     }
177 
178     @Test(dataProvider = "uris")
testListWithoutFinisherBlocking(String url)179     void testListWithoutFinisherBlocking(String url) throws Exception {
180         System.out.printf(now() + "testListWithoutFinisherBlocking(%s) starting%n", url);
181         HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();
182         HttpRequest request = HttpRequest.newBuilder(URI.create(url))
183                 .POST(BodyPublishers.ofString("May the luck of the Irish be with you!")).build();
184 
185         ListSubscriber subscriber = new ListSubscriber();
186         HttpResponse<Void> response = client.send(request,
187                 BodyHandlers.fromSubscriber(subscriber));
188         String text = subscriber.get();
189         System.out.println(text);
190         assertEquals(response.statusCode(), 200);
191         assertEquals(text, "May the luck of the Irish be with you!");
192     }
193 
194     // Collection<ByteBuffer>
195 
196     @Test(dataProvider = "uris")
testCollectionWithFinisher(String url)197     void testCollectionWithFinisher(String url) {
198         System.out.printf(now() + "testCollectionWithFinisher(%s) starting%n", url);
199         HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();
200         HttpRequest request = HttpRequest.newBuilder(URI.create(url))
201                 .POST(BodyPublishers.ofString("What's the craic?")).build();
202 
203         CollectionSubscriber subscriber = new CollectionSubscriber();
204         HttpResponse<String> response = client.sendAsync(request,
205                 BodyHandlers.fromSubscriber(subscriber, CollectionSubscriber::get)).join();
206         String text = response.body();
207         System.out.println(text);
208         assertEquals(response.statusCode(), 200);
209         assertEquals(text, "What's the craic?");
210     }
211 
212     @Test(dataProvider = "uris")
testCollectionWithoutFinisher(String url)213     void testCollectionWithoutFinisher(String url) {
214         System.out.printf(now() + "testCollectionWithoutFinisher(%s) starting%n", url);
215         HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();
216         HttpRequest request = HttpRequest.newBuilder(URI.create(url))
217                 .POST(BodyPublishers.ofString("What's the craic?")).build();
218 
219         CollectionSubscriber subscriber = new CollectionSubscriber();
220         HttpResponse<Void> response = client.sendAsync(request,
221                 BodyHandlers.fromSubscriber(subscriber)).join();
222         String text = subscriber.get();
223         System.out.println(text);
224         assertEquals(response.statusCode(), 200);
225         assertEquals(text, "What's the craic?");
226     }
227 
228     @Test(dataProvider = "uris")
testCollectionWithFinisherBlocking(String url)229     void testCollectionWithFinisherBlocking(String url) throws Exception {
230         System.out.printf(now() + "testCollectionWithFinisherBlocking(%s) starting%n", url);
231         HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();
232         HttpRequest request = HttpRequest.newBuilder(URI.create(url))
233                 .POST(BodyPublishers.ofString("What's the craic?")).build();
234 
235         CollectionSubscriber subscriber = new CollectionSubscriber();
236         HttpResponse<String> response = client.send(request,
237                 BodyHandlers.fromSubscriber(subscriber, CollectionSubscriber::get));
238         String text = response.body();
239         System.out.println(text);
240         assertEquals(response.statusCode(), 200);
241         assertEquals(text, "What's the craic?");
242     }
243 
244     @Test(dataProvider = "uris")
testCollectionWithoutFinisheBlocking(String url)245     void testCollectionWithoutFinisheBlocking(String url) throws Exception {
246         System.out.printf(now() + "testCollectionWithoutFinisheBlocking(%s) starting%n", url);
247         HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();
248         HttpRequest request = HttpRequest.newBuilder(URI.create(url))
249                 .POST(BodyPublishers.ofString("What's the craic?")).build();
250 
251         CollectionSubscriber subscriber = new CollectionSubscriber();
252         HttpResponse<Void> response = client.send(request,
253                 BodyHandlers.fromSubscriber(subscriber));
254         String text = subscriber.get();
255         System.out.println(text);
256         assertEquals(response.statusCode(), 200);
257         assertEquals(text, "What's the craic?");
258     }
259 
260     // Iterable<ByteBuffer>
261 
262     @Test(dataProvider = "uris")
testIterableWithFinisher(String url)263     void testIterableWithFinisher(String url) {
264         System.out.printf(now() + "testIterableWithFinisher(%s) starting%n", url);
265         HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();
266         HttpRequest request = HttpRequest.newBuilder(URI.create(url))
267                 .POST(BodyPublishers.ofString("We're sucking diesel now!")).build();
268 
269         IterableSubscriber subscriber = new IterableSubscriber();
270         HttpResponse<String> response = client.sendAsync(request,
271                 BodyHandlers.fromSubscriber(subscriber, Supplier::get)).join();
272         String text = response.body();
273         System.out.println(text);
274         assertEquals(response.statusCode(), 200);
275         assertEquals(text, "We're sucking diesel now!");
276     }
277 
278     @Test(dataProvider = "uris")
testIterableWithoutFinisher(String url)279     void testIterableWithoutFinisher(String url) {
280         System.out.printf(now() + "testIterableWithoutFinisher(%s) starting%n", url);
281         HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();
282         HttpRequest request = HttpRequest.newBuilder(URI.create(url))
283                 .POST(BodyPublishers.ofString("We're sucking diesel now!")).build();
284 
285         IterableSubscriber subscriber = new IterableSubscriber();
286         HttpResponse<Void> response = client.sendAsync(request,
287                 BodyHandlers.fromSubscriber(subscriber)).join();
288         String text = subscriber.get();
289         System.out.println(text);
290         assertEquals(response.statusCode(), 200);
291         assertEquals(text, "We're sucking diesel now!");
292     }
293 
294     @Test(dataProvider = "uris")
testIterableWithFinisherBlocking(String url)295     void testIterableWithFinisherBlocking(String url) throws Exception {
296         System.out.printf(now() + "testIterableWithFinisherBlocking(%s) starting%n", url);
297         HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();
298         HttpRequest request = HttpRequest.newBuilder(URI.create(url))
299                 .POST(BodyPublishers.ofString("We're sucking diesel now!")).build();
300 
301         IterableSubscriber subscriber = new IterableSubscriber();
302         HttpResponse<String> response = client.send(request,
303                 BodyHandlers.fromSubscriber(subscriber, Supplier::get));
304         String text = response.body();
305         System.out.println(text);
306         assertEquals(response.statusCode(), 200);
307         assertEquals(text, "We're sucking diesel now!");
308     }
309 
310     @Test(dataProvider = "uris")
testIterableWithoutFinisherBlocking(String url)311     void testIterableWithoutFinisherBlocking(String url) throws Exception {
312         System.out.printf(now() + "testIterableWithoutFinisherBlocking(%s) starting%n", url);
313         HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();
314         HttpRequest request = HttpRequest.newBuilder(URI.create(url))
315                 .POST(BodyPublishers.ofString("We're sucking diesel now!")).build();
316 
317         IterableSubscriber subscriber = new IterableSubscriber();
318         HttpResponse<Void> response = client.send(request,
319                 BodyHandlers.fromSubscriber(subscriber));
320         String text = subscriber.get();
321         System.out.println(text);
322         assertEquals(response.statusCode(), 200);
323         assertEquals(text, "We're sucking diesel now!");
324     }
325 
326     // Subscriber<Object>
327 
328     @Test(dataProvider = "uris")
testObjectWithFinisher(String url)329     void testObjectWithFinisher(String url) {
330         System.out.printf(now() + "testObjectWithFinisher(%s) starting%n", url);
331         HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();
332         HttpRequest request = HttpRequest.newBuilder(URI.create(url))
333                 .POST(BodyPublishers.ofString("May the wind always be at your back.")).build();
334 
335         ObjectSubscriber subscriber = new ObjectSubscriber();
336         HttpResponse<String> response = client.sendAsync(request,
337                 BodyHandlers.fromSubscriber(subscriber, ObjectSubscriber::get)).join();
338         String text = response.body();
339         System.out.println(text);
340         assertEquals(response.statusCode(), 200);
341         assertTrue(text.length() != 0);  // what else can be asserted!
342     }
343 
344     @Test(dataProvider = "uris")
testObjectWithoutFinisher(String url)345     void testObjectWithoutFinisher(String url) {
346         System.out.printf(now() + "testObjectWithoutFinisher(%s) starting%n", url);
347         HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();
348         HttpRequest request = HttpRequest.newBuilder(URI.create(url))
349                 .POST(BodyPublishers.ofString("May the wind always be at your back.")).build();
350 
351         ObjectSubscriber subscriber = new ObjectSubscriber();
352         HttpResponse<Void> response = client.sendAsync(request,
353                 BodyHandlers.fromSubscriber(subscriber)).join();
354         String text = subscriber.get();
355         System.out.println(text);
356         assertEquals(response.statusCode(), 200);
357         assertTrue(text.length() != 0);  // what else can be asserted!
358     }
359 
360     @Test(dataProvider = "uris")
testObjectWithFinisherBlocking(String url)361     void testObjectWithFinisherBlocking(String url) throws Exception {
362         System.out.printf(now() + "testObjectWithFinisherBlocking(%s) starting%n", url);
363         HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();
364         HttpRequest request = HttpRequest.newBuilder(URI.create(url))
365                 .POST(BodyPublishers.ofString("May the wind always be at your back.")).build();
366 
367         ObjectSubscriber subscriber = new ObjectSubscriber();
368         HttpResponse<String> response = client.send(request,
369                 BodyHandlers.fromSubscriber(subscriber, ObjectSubscriber::get));
370         String text = response.body();
371         System.out.println(text);
372         assertEquals(response.statusCode(), 200);
373         assertTrue(text.length() != 0);  // what else can be asserted!
374     }
375 
376     @Test(dataProvider = "uris")
testObjectWithoutFinisherBlocking(String url)377     void testObjectWithoutFinisherBlocking(String url) throws Exception {
378         System.out.printf(now() + "testObjectWithoutFinisherBlocking(%s) starting%n", url);
379         HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();
380         HttpRequest request = HttpRequest.newBuilder(URI.create(url))
381                 .POST(BodyPublishers.ofString("May the wind always be at your back.")).build();
382 
383         ObjectSubscriber subscriber = new ObjectSubscriber();
384         HttpResponse<Void> response = client.send(request,
385                 BodyHandlers.fromSubscriber(subscriber));
386         String text = subscriber.get();
387         System.out.println(text);
388         assertEquals(response.statusCode(), 200);
389         assertTrue(text.length() != 0);  // what else can be asserted!
390     }
391 
392 
393     // -- mapping using convenience handlers
394 
395     @Test(dataProvider = "uris")
mappingFromByteArray(String url)396     void mappingFromByteArray(String url) throws Exception {
397         System.out.printf(now() + "mappingFromByteArray(%s) starting%n", url);
398         HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();
399         HttpRequest request = HttpRequest.newBuilder(URI.create(url))
400                 .POST(BodyPublishers.ofString("We're sucking diesel now!")).build();
401 
402         client.sendAsync(request, BodyHandlers.fromSubscriber(BodySubscribers.ofByteArray(),
403                     bas -> new String(bas.getBody().toCompletableFuture().join(), UTF_8)))
404                 .thenApply(FlowAdapterSubscriberTest::assert200ResponseCode)
405                 .thenApply(HttpResponse::body)
406                 .thenAccept(body -> assertEquals(body, "We're sucking diesel now!"))
407                 .join();
408     }
409 
410     @Test(dataProvider = "uris")
mappingFromInputStream(String url)411     void mappingFromInputStream(String url) throws Exception {
412         System.out.printf(now() + "mappingFromInputStream(%s) starting%n", url);
413         HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();
414         HttpRequest request = HttpRequest.newBuilder(URI.create(url))
415                 .POST(BodyPublishers.ofString("May the wind always be at your back.")).build();
416 
417         client.sendAsync(request, BodyHandlers.fromSubscriber(BodySubscribers.ofInputStream(),
418                     ins -> {
419                         InputStream is = ins.getBody().toCompletableFuture().join();
420                         return new String(uncheckedReadAllBytes(is), UTF_8); } ))
421                 .thenApply(FlowAdapterSubscriberTest::assert200ResponseCode)
422                 .thenApply(HttpResponse::body)
423                 .thenAccept(body -> assertEquals(body, "May the wind always be at your back."))
424                 .join();
425     }
426 
427     /** An abstract Subscriber that converts all received data into a String. */
428     static abstract class AbstractSubscriber implements Supplier<String> {
429         protected volatile Flow.Subscription subscription;
430         protected volatile ByteArrayOutputStream baos = new ByteArrayOutputStream();
431         protected volatile String text;
432 
onSubscribe(Flow.Subscription subscription)433         public void onSubscribe(Flow.Subscription subscription) {
434             this.subscription = subscription;
435             subscription.request(Long.MAX_VALUE);
436         }
onError(Throwable throwable)437         public void onError(Throwable throwable) {
438             throw new RuntimeException(throwable);
439         }
onComplete()440         public void onComplete() {
441             text = new String(baos.toByteArray(), UTF_8);
442         }
get()443         @Override public String get() { return text; }
444     }
445 
446     static class ListSubscriber extends AbstractSubscriber
447         implements Flow.Subscriber<List<ByteBuffer>>, Supplier<String>
448     {
onNext(List<ByteBuffer> item)449         @Override public void onNext(List<ByteBuffer> item) {
450             for (ByteBuffer bb : item) {
451                 byte[] ba = new byte[bb.remaining()];
452                 bb.get(ba);
453                 uncheckedWrite(baos, ba);
454             }
455         }
456     }
457 
458     static class CollectionSubscriber extends AbstractSubscriber
459         implements Flow.Subscriber<Collection<ByteBuffer>>, Supplier<String>
460     {
onNext(Collection<ByteBuffer> item)461         @Override public void onNext(Collection<ByteBuffer> item) {
462             for (ByteBuffer bb : item) {
463                 byte[] ba = new byte[bb.remaining()];
464                 bb.get(ba);
465                 uncheckedWrite(baos, ba);
466             }
467         }
468     }
469 
470     static class IterableSubscriber extends AbstractSubscriber
471         implements Flow.Subscriber<Iterable<ByteBuffer>>, Supplier<String>
472     {
onNext(Iterable<ByteBuffer> item)473         @Override public void onNext(Iterable<ByteBuffer> item) {
474             for (ByteBuffer bb : item) {
475                 byte[] ba = new byte[bb.remaining()];
476                 bb.get(ba);
477                 uncheckedWrite(baos, ba);
478             }
479         }
480     }
481 
482     static class ObjectSubscriber extends AbstractSubscriber
483         implements Flow.Subscriber<Object>, Supplier<String>
484     {
onNext(Object item)485         @Override public void onNext(Object item) {
486             // What can anyone do with Object, cast or toString it ?
487             uncheckedWrite(baos, item.toString().getBytes(UTF_8));
488         }
489     }
490 
uncheckedWrite(ByteArrayOutputStream baos, byte[] ba)491     static void uncheckedWrite(ByteArrayOutputStream baos, byte[] ba) {
492         try {
493             baos.write(ba);
494         } catch (IOException e) {
495             throw new UncheckedIOException(e);
496         }
497     }
498 
uncheckedReadAllBytes(InputStream is)499     static byte[] uncheckedReadAllBytes(InputStream is) {
500         try {
501             return is.readAllBytes();
502         } catch (IOException e) {
503             throw new UncheckedIOException(e);
504         }
505     }
506 
assert200ResponseCode(HttpResponse<T> response)507     static final <T> HttpResponse<T> assert200ResponseCode(HttpResponse<T> response) {
508         assertEquals(response.statusCode(), 200);
509         return response;
510     }
511 
serverAuthority(HttpServer server)512     static String serverAuthority(HttpServer server) {
513         return InetAddress.getLoopbackAddress().getHostName() + ":"
514                 + server.getAddress().getPort();
515     }
516 
517     @BeforeTest
setup()518     public void setup() throws Exception {
519         sslContext = new SimpleSSLContext().get();
520         if (sslContext == null)
521             throw new AssertionError("Unexpected null sslContext");
522 
523         InetSocketAddress sa = new InetSocketAddress(InetAddress.getLoopbackAddress(), 0);
524         httpTestServer = HttpServer.create(sa, 0);
525         httpTestServer.createContext("/http1/echo", new Http1EchoHandler());
526         httpURI = "http://" + serverAuthority(httpTestServer) + "/http1/echo";
527 
528         httpsTestServer = HttpsServer.create(sa, 0);
529         httpsTestServer.setHttpsConfigurator(new HttpsConfigurator(sslContext));
530         httpsTestServer.createContext("/https1/echo", new Http1EchoHandler());
531         httpsURI = "https://" + serverAuthority(httpsTestServer) + "/https1/echo";
532 
533         http2TestServer = new Http2TestServer("localhost", false, 0);
534         http2TestServer.addHandler(new Http2EchoHandler(), "/http2/echo");
535         http2URI = "http://" + http2TestServer.serverAuthority() + "/http2/echo";
536 
537         https2TestServer = new Http2TestServer("localhost", true, sslContext);
538         https2TestServer.addHandler(new Http2EchoHandler(), "/https2/echo");
539         https2URI = "https://" + https2TestServer.serverAuthority() + "/https2/echo";
540 
541         httpTestServer.start();
542         httpsTestServer.start();
543         http2TestServer.start();
544         https2TestServer.start();
545     }
546 
547     @AfterTest
teardown()548     public void teardown() throws Exception {
549         httpTestServer.stop(0);
550         httpsTestServer.stop(0);
551         http2TestServer.stop();
552         https2TestServer.stop();
553     }
554 
555     static class Http1EchoHandler implements HttpHandler {
556         @Override
handle(HttpExchange t)557         public void handle(HttpExchange t) throws IOException {
558             try (InputStream is = t.getRequestBody();
559                  OutputStream os = t.getResponseBody()) {
560                 byte[] bytes = is.readAllBytes();
561                 t.sendResponseHeaders(200, bytes.length);
562                 os.write(bytes);
563             }
564         }
565     }
566 
567     static class Http2EchoHandler implements Http2Handler {
568         @Override
handle(Http2TestExchange t)569         public void handle(Http2TestExchange t) throws IOException {
570             try (InputStream is = t.getRequestBody();
571                  OutputStream os = t.getResponseBody()) {
572                 byte[] bytes = is.readAllBytes();
573                 t.sendResponseHeaders(200, bytes.length);
574                 os.write(bytes);
575             }
576         }
577     }
578 }
579