25
25
import static com .github .tomakehurst .wiremock .client .WireMock .urlEqualTo ;
26
26
import static org .assertj .core .api .Assertions .assertThat ;
27
27
import static org .assertj .core .api .Assertions .assertThatExceptionOfType ;
28
+ import static org .junit .jupiter .api .Assertions .assertTimeoutPreemptively ;
28
29
import static org .mockito .Mockito .mock ;
29
30
import static org .mockito .Mockito .times ;
30
31
31
32
import com .github .tomakehurst .wiremock .junit5 .WireMockRuntimeInfo ;
32
33
import com .github .tomakehurst .wiremock .junit5 .WireMockTest ;
33
34
import java .io .IOException ;
34
35
import java .net .URI ;
36
+ import java .time .Duration ;
35
37
import java .util .concurrent .CancellationException ;
36
38
import java .util .concurrent .CompletionException ;
37
39
import org .junit .jupiter .api .BeforeAll ;
@@ -95,7 +97,7 @@ private static void assertMockOnFailure(TransferListener transferListenerMock) {
95
97
96
98
@ ParameterizedTest
97
99
@ ValueSource (booleans = {true , false })
98
- void listeners_reports_ErrorsWithValidPayload (boolean multipartEnabled ) throws InterruptedException {
100
+ void listeners_reports_ErrorsWithValidPayload (boolean multipartEnabled ) {
99
101
S3AsyncClient s3Async = s3AsyncClient (multipartEnabled );
100
102
101
103
TransferListener transferListenerMock = mock (TransferListener .class );
@@ -113,8 +115,8 @@ void listeners_reports_ErrorsWithValidPayload(boolean multipartEnabled) throws I
113
115
.addTransferListener (transferListenerMock )
114
116
.build ());
115
117
118
+ assertTransferListenerCompletion (transferListener );
116
119
assertThatExceptionOfType (CompletionException .class ).isThrownBy (() -> fileUpload .completionFuture ().join ());
117
- Thread .sleep (500 );
118
120
assertThat (transferListener .getExceptionCaught ()).isInstanceOf (NoSuchBucketException .class );
119
121
assertThat (transferListener .isTransferComplete ()).isFalse ();
120
122
assertThat (transferListener .isTransferInitiated ()).isTrue ();
@@ -124,7 +126,7 @@ void listeners_reports_ErrorsWithValidPayload(boolean multipartEnabled) throws I
124
126
125
127
@ ParameterizedTest
126
128
@ ValueSource (booleans = {true , false })
127
- void listeners_reports_ErrorsWithValidInValidPayload (boolean multipartEnabled ) throws InterruptedException {
129
+ void listeners_reports_ErrorsWithValidInValidPayload (boolean multipartEnabled ) {
128
130
S3AsyncClient s3Async = s3AsyncClient (multipartEnabled );
129
131
130
132
TransferListener transferListenerMock = mock (TransferListener .class );
@@ -142,9 +144,8 @@ void listeners_reports_ErrorsWithValidInValidPayload(boolean multipartEnabled) t
142
144
.addTransferListener (transferListenerMock )
143
145
.build ());
144
146
147
+ assertTransferListenerCompletion (transferListener );
145
148
assertThatExceptionOfType (CompletionException .class ).isThrownBy (() -> fileUpload .completionFuture ().join ());
146
- Thread .sleep (500 );
147
-
148
149
assertThat (transferListener .getExceptionCaught ()).isInstanceOf (S3Exception .class );
149
150
assertThat (transferListener .isTransferComplete ()).isFalse ();
150
151
assertThat (transferListener .isTransferInitiated ()).isTrue ();
@@ -155,7 +156,7 @@ void listeners_reports_ErrorsWithValidInValidPayload(boolean multipartEnabled) t
155
156
156
157
@ ParameterizedTest
157
158
@ ValueSource (booleans = {true , false })
158
- void listeners_reports_ErrorsWhenCancelled (boolean multipartEnabled ) throws InterruptedException {
159
+ void listeners_reports_ErrorsWhenCancelled (boolean multipartEnabled ) {
159
160
S3AsyncClient s3Async = s3AsyncClient (multipartEnabled );
160
161
161
162
TransferListener transferListenerMock = mock (TransferListener .class );
@@ -171,9 +172,7 @@ void listeners_reports_ErrorsWhenCancelled(boolean multipartEnabled) throws Inte
171
172
.addTransferListener (transferListener )
172
173
.addTransferListener (transferListenerMock )
173
174
.build ()).completionFuture ().cancel (true );
174
-
175
- Thread .sleep (500 );
176
-
175
+ assertTransferListenerCompletion (transferListener );
177
176
assertThat (transferListener .getExceptionCaught ()).isInstanceOf (CancellationException .class );
178
177
assertThat (transferListener .isTransferComplete ()).isFalse ();
179
178
assertThat (transferListener .isTransferInitiated ()).isTrue ();
@@ -182,7 +181,7 @@ void listeners_reports_ErrorsWhenCancelled(boolean multipartEnabled) throws Inte
182
181
183
182
@ ParameterizedTest
184
183
@ ValueSource (booleans = {true , false })
185
- void listeners_reports_ProgressWhenSuccess (boolean multipartEnabled ) throws InterruptedException {
184
+ void listeners_reports_ProgressWhenSuccess (boolean multipartEnabled ) {
186
185
S3AsyncClient s3Async = s3AsyncClient (multipartEnabled );
187
186
188
187
TransferListener transferListenerMock = mock (TransferListener .class );
@@ -202,7 +201,7 @@ void listeners_reports_ProgressWhenSuccess(boolean multipartEnabled) throws Inte
202
201
.addTransferListener (transferListenerMock )
203
202
.build ()).completionFuture ().join ();
204
203
205
- Thread . sleep ( 500 );
204
+ assertTransferListenerCompletion ( transferListener );
206
205
assertThat (transferListener .getExceptionCaught ()).isNull ();
207
206
assertThat (transferListener .isTransferComplete ()).isTrue ();
208
207
assertThat (transferListener .isTransferInitiated ()).isTrue ();
@@ -215,7 +214,7 @@ void listeners_reports_ProgressWhenSuccess(boolean multipartEnabled) throws Inte
215
214
}
216
215
217
216
@ Test
218
- void copyWithJavaBasedClient_listeners_reports_ErrorsWithValidPayload () throws InterruptedException {
217
+ void copyWithJavaBasedClient_listeners_reports_ErrorsWithValidPayload () {
219
218
S3AsyncClient s3Async = s3AsyncClient (true );
220
219
221
220
TransferListener transferListenerMock = mock (TransferListener .class );
@@ -235,17 +234,16 @@ void copyWithJavaBasedClient_listeners_reports_ErrorsWithValidPayload() throws I
235
234
.addTransferListener (transferListener )
236
235
.addTransferListener (transferListenerMock )
237
236
.build ());
238
-
237
+ assertTransferListenerCompletion ( transferListener );
239
238
assertThatExceptionOfType (CompletionException .class ).isThrownBy (() -> copy .completionFuture ().join ());
240
- Thread .sleep (500 );
241
239
assertThat (transferListener .getExceptionCaught ()).isInstanceOf (NoSuchKeyException .class );
242
240
assertThat (transferListener .isTransferComplete ()).isFalse ();
243
241
assertThat (transferListener .isTransferInitiated ()).isTrue ();
244
242
assertMockOnFailure (transferListenerMock );
245
243
}
246
244
247
245
@ Test
248
- void copyWithJavaBasedClient_listeners_reports_ErrorsWithValidInValidPayload () throws InterruptedException {
246
+ void copyWithJavaBasedClient_listeners_reports_ErrorsWithValidInValidPayload () {
249
247
S3AsyncClient s3Async = s3AsyncClient (true );
250
248
251
249
TransferListener transferListenerMock = mock (TransferListener .class );
@@ -266,8 +264,8 @@ void copyWithJavaBasedClient_listeners_reports_ErrorsWithValidInValidPayload() t
266
264
.addTransferListener (transferListenerMock )
267
265
.build ());
268
266
267
+ assertTransferListenerCompletion (transferListener );
269
268
assertThatExceptionOfType (CompletionException .class ).isThrownBy (() -> copy .completionFuture ().join ());
270
- Thread .sleep (500 );
271
269
assertThat (transferListener .getExceptionCaught ()).isInstanceOf (S3Exception .class );
272
270
assertThat (transferListener .isTransferComplete ()).isFalse ();
273
271
assertThat (transferListener .isTransferInitiated ()).isTrue ();
@@ -295,15 +293,15 @@ void copyWithJavaBasedClient_listeners_reports_ErrorsWhenCancelled() throws Inte
295
293
.addTransferListener (transferListenerMock )
296
294
.build ()).completionFuture ().cancel (true );
297
295
298
- Thread . sleep ( 500 );
296
+ assertTransferListenerCompletion ( transferListener );
299
297
assertThat (transferListener .getExceptionCaught ()).isInstanceOf (CancellationException .class );
300
298
assertThat (transferListener .isTransferComplete ()).isFalse ();
301
299
assertThat (transferListener .isTransferInitiated ()).isTrue ();
302
300
assertMockOnFailure (transferListenerMock );
303
301
}
304
302
305
303
@ Test
306
- void copyWithJavaBasedClient_listeners_reports_ProgressWhenSuccess_copy () throws InterruptedException {
304
+ void copyWithJavaBasedClient_listeners_reports_ProgressWhenSuccess_copy () {
307
305
String destinationKey = "copiedObj" ;
308
306
S3AsyncClient s3Async = s3AsyncClient (true );
309
307
@@ -339,7 +337,7 @@ void copyWithJavaBasedClient_listeners_reports_ProgressWhenSuccess_copy() throws
339
337
.addTransferListener (transferListenerMock )
340
338
.build ());
341
339
342
- Thread . sleep ( 500 );
340
+ assertTransferListenerCompletion ( transferListener );
343
341
assertThat (transferListener .getExceptionCaught ()).isNull ();
344
342
assertThat (transferListener .isTransferComplete ()).isTrue ();
345
343
assertThat (transferListener .isTransferInitiated ()).isTrue ();
@@ -350,4 +348,14 @@ void copyWithJavaBasedClient_listeners_reports_ProgressWhenSuccess_copy() throws
350
348
int numTimesBytesTransferred = 2 ;
351
349
Mockito .verify (transferListenerMock , times (numTimesBytesTransferred )).bytesTransferred (ArgumentMatchers .any ());
352
350
}
351
+
352
+ private static void assertTransferListenerCompletion (CaptureTransferListener transferListener ) {
353
+ Duration waitDuration = Duration .ofSeconds (5 );
354
+ assertTimeoutPreemptively (
355
+ waitDuration , () -> {
356
+ while (!transferListener .getCompletionFuture ().isDone ()) {
357
+ Thread .sleep (50 );
358
+ }
359
+ }, "TransferListener future not completed even after waiting for " + waitDuration );
360
+ }
353
361
}
0 commit comments