11package controllers ;
22
3+ import java .util .concurrent .ExecutionException ;
34import org .junit .Before ;
45import org .junit .Test ;
56import org .slf4j .Logger ;
89import play .inject .guice .GuiceApplicationBuilder ;
910import play .libs .concurrent .Futures ;
1011import play .libs .ws .WSClient ;
12+ import play .libs .ws .WSResponse ;
1113import play .libs .ws .ahc .AhcCurlRequestLogger ;
1214import play .mvc .Result ;
1315import play .mvc .Results ;
2527import static org .junit .Assert .assertEquals ;
2628import static play .mvc .Http .Status .SERVICE_UNAVAILABLE ;
2729
30+ import play .mvc .Http .MultipartFormData .*;
31+ import akka .stream .javadsl .*;
32+ import akka .util .ByteString ;
33+
2834public class HomeControllerTest extends WithServer {
35+
2936 private final Logger log = LoggerFactory .getLogger (HomeControllerTest .class );
3037 private String url ;
3138 private int port ;
@@ -47,41 +54,120 @@ public void setup() {
4754 }
4855 }
4956
57+ @ Test
58+ public void givenASingleGetRequestWhenResponseThenBlockWithCompletableAndLog ()
59+ throws InterruptedException , ExecutionException {
60+ AtomicInteger completedReqs = new AtomicInteger (0 );
61+ WSClient ws = play .test .WSTestClient .newClient (port );
62+ WSResponse wsResponse = ws .url (url )
63+ .setRequestFilter (new AhcCurlRequestLogger ())
64+ .addHeader ("key" , "value" )
65+ .addQueryParameter ("num" , "" + 1 )
66+ .get ()
67+ .toCompletableFuture ()
68+ .get ();
69+
70+ log .debug ("Thread#" + Thread .currentThread ()
71+ .getId () + " Request complete: Response code = "
72+ + wsResponse .getStatus ()
73+ + " | Response: " + wsResponse .getBody () + " | Current Time:"
74+ + System .currentTimeMillis ());
75+ }
76+
77+ @ Test
78+ public void givenASingleGetRequestWhenResponseThenLog () throws InterruptedException {
79+ AtomicInteger completedReqs = new AtomicInteger (0 );
80+ WSClient ws = play .test .WSTestClient .newClient (port );
81+ ws .url (url )
82+ .setRequestFilter (new AhcCurlRequestLogger ())
83+ .addHeader ("key" , "value" )
84+ .addQueryParameter ("num" , "" + 1 )
85+ .get ()
86+ .thenAccept (r -> {
87+ log .debug ("Thread#" + Thread .currentThread ()
88+ .getId () + " Request complete: Response code = "
89+ + r .getStatus ()
90+ + " | Response: " + r .getBody () + " | Current Time:" + System .currentTimeMillis ());
91+ completedReqs .incrementAndGet ();
92+ });
93+
94+ log .debug (
95+ "Waiting for requests to be completed. Current Time: " + System .currentTimeMillis ());
96+ while (completedReqs .get () != 1 ) {
97+ Thread .sleep (100 );
98+ }
99+ log .debug ("All requests have been completed. Exiting test." );
100+ }
101+
102+ @ Test
103+ public void givenASinglePostRequestWhenResponseThenLog () throws InterruptedException {
104+ AtomicInteger completedReqs = new AtomicInteger (0 );
105+ WSClient ws = play .test .WSTestClient .newClient (port );
106+ ws .url (url )
107+ .setContentType ("application/x-www-form-urlencoded" )
108+ .post ("key1=value1&key2=value2" )
109+ .thenAccept (r -> {
110+ log .debug ("Thread#" + Thread .currentThread ()
111+ .getId () + " Request complete: Response code = "
112+ + r .getStatus ()
113+ + " | Response: " + r .getBody () + " | Current Time:" + System .currentTimeMillis ());
114+ completedReqs .incrementAndGet ();
115+ });
116+
117+ log .debug (
118+ "Waiting for requests to be completed. Current Time: " + System .currentTimeMillis ());
119+ while (completedReqs .get () != 1 ) {
120+ Thread .sleep (100 );
121+ }
122+ log .debug ("All requests have been completed. Exiting test." );
123+ }
124+
50125 @ Test
51126 public void givenMultipleRequestsWhenResponseThenLog () throws InterruptedException {
52127 AtomicInteger completedReqs = new AtomicInteger (0 );
53128 WSClient ws = play .test .WSTestClient .newClient (port );
54- IntStream .range (0 , 100 ).parallel ().forEach (num ->
55- ws .url (url )
56- .setRequestFilter (new AhcCurlRequestLogger ())
57- .addHeader ("key" , "value" )
58- .addQueryParameter ("num" , "" + num )
59- .get ()
60- .thenAccept (r -> {
61- log .debug ("Thread#" + num + " Request complete: Response code = " + r .getStatus () + " | Response: " + r .getBody () + " | Current Time:" + System .currentTimeMillis ());
62- completedReqs .incrementAndGet ();
63- })
64- );
129+ IntStream .range (0 , 100 )
130+ .parallel ()
131+ .forEach (num ->
132+ ws .url (url )
133+ .setRequestFilter (new AhcCurlRequestLogger ())
134+ .addHeader ("key" , "value" )
135+ .addQueryParameter ("num" , "" + num )
136+ .get ()
137+ .thenAccept (r -> {
138+ log .debug (
139+ "Thread#" + num + " Request complete: Response code = " + r .getStatus ()
140+ + " | Response: " + r .getBody () + " | Current Time:"
141+ + System .currentTimeMillis ());
142+ completedReqs .incrementAndGet ();
143+ })
144+ );
65145
66- log .debug ("Waiting for requests to be completed. Current Time: " + System .currentTimeMillis ());
146+ log .debug (
147+ "Waiting for requests to be completed. Current Time: " + System .currentTimeMillis ());
67148 while (completedReqs .get () != 100 ) {
68149 Thread .sleep (100 );
69150 }
70151 log .debug ("All requests have been completed. Exiting test." );
71152 }
72153
73154 @ Test
74- public void givenLongResponseWhenTimeoutThenHandle () {
155+ public void givenLongResponseWhenTimeoutThenHandle () throws InterruptedException {
75156 WSClient ws = play .test .WSTestClient .newClient (port );
76- Futures futures = app .injector ().instanceOf (Futures .class );
77- CompletionStage <Result > f = futures .timeout (ws .url (url ).setRequestTimeout (Duration .of (1 , SECONDS )).get ().thenApply (result -> {
78- try {
79- Thread .sleep (2000L );
80- return Results .ok ();
81- } catch (InterruptedException e ) {
82- return Results .status (SERVICE_UNAVAILABLE );
83- }
84- }), 1L , TimeUnit .SECONDS );
157+ Futures futures = app .injector ()
158+ .instanceOf (Futures .class );
159+ CompletionStage <Result > f = futures .timeout (ws .url (url )
160+ .setRequestTimeout (Duration .of (1 , SECONDS ))
161+ .get ()
162+ .thenApply (result -> {
163+ try {
164+ Thread .sleep (2000L );
165+ return Results .ok ();
166+ } catch (InterruptedException e ) {
167+ return Results .status (
168+ SERVICE_UNAVAILABLE );
169+ }
170+ }), 1L , TimeUnit .SECONDS );
85171 CompletionStage <Object > res = f .handleAsync ((result , e ) -> {
86172 if (e != null ) {
87173 log .error ("Exception thrown" , e );
@@ -93,5 +179,6 @@ public void givenLongResponseWhenTimeoutThenHandle() {
93179 res .thenAccept (result ->
94180 assertEquals (TimeoutException .class , result )
95181 );
182+ Thread .sleep (2500 );
96183 }
97184}
0 commit comments