1
1
/*
2
- * Copyright (c) 2020, 2023 , Oracle and/or its affiliates. All rights reserved.
2
+ * Copyright (c) 2020, 2025 , Oracle and/or its affiliates. All rights reserved.
3
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
4
*
5
5
* This code is free software; you can redistribute it and/or modify it
33
33
* @summary Tests HttpRequest.BodyPublishers::concat
34
34
*/
35
35
36
- import java .net .InetAddress ;
37
- import java .net .InetSocketAddress ;
38
36
import java .net .URI ;
39
37
import java .net .http .HttpClient ;
40
38
import java .net .http .HttpRequest ;
57
55
import java .util .concurrent .Flow ;
58
56
import java .util .concurrent .Flow .Subscriber ;
59
57
import java .util .concurrent .Flow .Subscription ;
58
+ import java .util .concurrent .Semaphore ;
60
59
import java .util .concurrent .TimeUnit ;
61
60
import java .util .concurrent .TimeoutException ;
62
61
import java .util .concurrent .atomic .AtomicLong ;
67
66
import java .util .stream .LongStream ;
68
67
import java .util .stream .Stream ;
69
68
import jdk .httpclient .test .lib .common .HttpServerAdapters ;
70
- import jdk .httpclient .test .lib .http2 .Http2TestServer ;
71
69
import javax .net .ssl .SSLContext ;
72
70
73
- import com .sun .net .httpserver .HttpServer ;
74
- import com .sun .net .httpserver .HttpsConfigurator ;
75
- import com .sun .net .httpserver .HttpsServer ;
76
71
import jdk .test .lib .net .SimpleSSLContext ;
77
72
import org .testng .Assert ;
78
73
import org .testng .ITestContext ;
@@ -419,9 +414,11 @@ public void cancel() {
419
414
}
420
415
421
416
static class RequestSubscriber implements Flow .Subscriber <ByteBuffer > {
422
- CompletableFuture <Subscription > subscriptionCF = new CompletableFuture <>();
423
- ConcurrentLinkedDeque <ByteBuffer > items = new ConcurrentLinkedDeque <>();
424
- CompletableFuture <List <ByteBuffer >> resultCF = new CompletableFuture <>();
417
+ final CompletableFuture <Subscription > subscriptionCF = new CompletableFuture <>();
418
+ final ConcurrentLinkedDeque <ByteBuffer > items = new ConcurrentLinkedDeque <>();
419
+ final CompletableFuture <List <ByteBuffer >> resultCF = new CompletableFuture <>();
420
+
421
+ final Semaphore semaphore = new Semaphore (0 );
425
422
426
423
@ Override
427
424
public void onSubscribe (Subscription subscription ) {
@@ -431,6 +428,11 @@ public void onSubscribe(Subscription subscription) {
431
428
@ Override
432
429
public void onNext (ByteBuffer item ) {
433
430
items .addLast (item );
431
+ int available = semaphore .availablePermits ();
432
+ if (available > Integer .MAX_VALUE - 8 ) {
433
+ onError (new IllegalStateException ("too many buffers in queue: " + available ));
434
+ }
435
+ semaphore .release ();
434
436
}
435
437
436
438
@ Override
@@ -443,6 +445,18 @@ public void onComplete() {
443
445
resultCF .complete (items .stream ().collect (Collectors .toUnmodifiableList ()));
444
446
}
445
447
448
+ public ByteBuffer take () {
449
+ // it is not guaranteed that the buffer will be added to
450
+ // the queue in the same thread that calls request(1).
451
+ try {
452
+ semaphore .acquire ();
453
+ } catch (InterruptedException x ) {
454
+ Thread .currentThread ().interrupt ();
455
+ throw new CompletionException (x );
456
+ }
457
+ return items .pop ();
458
+ }
459
+
446
460
CompletableFuture <List <ByteBuffer >> resultCF () { return resultCF ; }
447
461
}
448
462
@@ -628,8 +642,9 @@ public void testPositiveRequests() {
628
642
publisher .subscribe (requestSubscriber1 );
629
643
Subscription subscription1 = requestSubscriber1 .subscriptionCF .join ();
630
644
subscription1 .request (16 );
631
- assertTrue ( requestSubscriber1 . resultCF (). isDone ());
645
+ // onNext() may not be called in the same thread than request()
632
646
List <ByteBuffer > list1 = requestSubscriber1 .resultCF ().join ();
647
+ assertTrue (requestSubscriber1 .resultCF ().isDone ());
633
648
String result1 = stringFromBytes (list1 .stream ());
634
649
assertEquals (result1 , "Lorem ipsum dolor sit amet, consectetur adipiscing elit." );
635
650
System .out .println ("Got expected sentence with one request: \" %s\" " .formatted (result1 ));
@@ -646,8 +661,8 @@ public void testPositiveRequests() {
646
661
subscription2 .request (4 );
647
662
assertFalse (requestSubscriber2 .resultCF ().isDone ());
648
663
subscription2 .request (1 );
649
- assertTrue (requestSubscriber2 .resultCF ().isDone ());
650
664
List <ByteBuffer > list2 = requestSubscriber2 .resultCF ().join ();
665
+ assertTrue (requestSubscriber2 .resultCF ().isDone ());
651
666
String result2 = stringFromBytes (list2 .stream ());
652
667
assertEquals (result2 , "Lorem ipsum dolor sit amet, consectetur adipiscing elit." );
653
668
System .out .println ("Got expected sentence with 4 requests: \" %s\" " .formatted (result1 ));
@@ -689,7 +704,7 @@ public void testCancel() {
689
704
// receive half the data
690
705
for (int i = 0 ; i < n ; i ++) {
691
706
subscription .request (1 );
692
- ByteBuffer buffer = subscriber .items . pop ();
707
+ ByteBuffer buffer = subscriber .take ();
693
708
}
694
709
695
710
// cancel subscription
@@ -789,7 +804,8 @@ public void testCancelSubscription() {
789
804
@ Test (dataProvider = "variants" )
790
805
public void test (String uri , boolean sameClient ) throws Exception {
791
806
checkSkip ();
792
- System .out .println ("Request to " + uri );
807
+ System .out .printf ("Request to %s (sameClient: %s)%n" , uri , sameClient );
808
+ System .err .printf ("Request to %s (sameClient: %s)%n" , uri , sameClient );
793
809
794
810
HttpClient client = newHttpClient (sameClient );
795
811
@@ -802,7 +818,8 @@ public void test(String uri, boolean sameClient) throws Exception {
802
818
.POST (publisher )
803
819
.build ();
804
820
for (int i = 0 ; i < ITERATION_COUNT ; i ++) {
805
- System .out .println ("Iteration: " + i );
821
+ System .out .println (uri + ": Iteration: " + i );
822
+ System .err .println (uri + ": Iteration: " + i );
806
823
HttpResponse <String > response = client .send (request , BodyHandlers .ofString ());
807
824
int expectedResponse = RESPONSE_CODE ;
808
825
if (response .statusCode () != expectedResponse )
0 commit comments