36
36
import java .util .concurrent .CompletableFuture ;
37
37
import java .util .concurrent .ExecutionException ;
38
38
import java .util .function .Supplier ;
39
+ import java .util .stream .Collectors ;
40
+ import java .util .stream .Stream ;
39
41
import org .junit .jupiter .api .AfterAll ;
40
42
import org .junit .jupiter .api .BeforeAll ;
41
43
import org .junit .jupiter .api .BeforeEach ;
@@ -96,6 +98,7 @@ public class S3ExpressIntegrationTest extends S3ExpressIntegrationTestBase {
96
98
private static final String AZ = "use1-az4" ;
97
99
private static S3Client s3 ;
98
100
private static S3AsyncClient s3Async ;
101
+ private static S3AsyncClient s3CrtAsync ;
99
102
private static String testBucket ;
100
103
101
104
@ BeforeAll
@@ -104,6 +107,7 @@ static void setup() {
104
107
.build ();
105
108
s3Async = s3AsyncClientBuilder (TEST_REGION ).overrideConfiguration (o -> o .addExecutionInterceptor (capturingInterceptor ))
106
109
.build ();
110
+ s3CrtAsync = s3CrtAsyncClientBuilder (TEST_REGION ).build ();
107
111
testBucket = getS3ExpressBucketNameForAz (AZ );
108
112
createBucketS3Express (s3 , testBucket , AZ );
109
113
}
@@ -113,25 +117,31 @@ static void teardown() {
113
117
deleteBucketAndAllContents (s3 , testBucket );
114
118
s3 .close ();
115
119
s3Async .close ();
120
+ s3CrtAsync .close ();
116
121
}
117
122
118
123
@ BeforeEach
119
124
void reset () {
120
125
capturingInterceptor .reset ();
121
126
}
122
127
123
- @ Test
124
- public void putCopyGetDeleteAsync () {
125
- s3Async .putObject (r -> r .bucket (testBucket ).key (KEY ), AsyncRequestBody .fromString (CONTENTS )).join ();
126
- s3Async .headObject (r -> r .bucket (testBucket ).key (KEY )).join ();
128
+ private static Stream <S3AsyncClient > asyncClients () {
129
+ return Stream .of (s3Async , s3CrtAsync );
130
+ }
131
+
132
+ @ ParameterizedTest (autoCloseArguments = false )
133
+ @ MethodSource ("asyncClients" )
134
+ public void putCopyGetDeleteAsync (S3AsyncClient s3AsyncClient ) {
135
+ s3AsyncClient .putObject (r -> r .bucket (testBucket ).key (KEY ), AsyncRequestBody .fromString (CONTENTS )).join ();
136
+ s3AsyncClient .headObject (r -> r .bucket (testBucket ).key (KEY )).join ();
127
137
128
138
s3 .copyObject (r -> r .sourceBucket (testBucket ).sourceKey (KEY ).destinationBucket (testBucket ).destinationKey (COPY_DESTINATION_KEY ));
129
- s3Async .headObject (r -> r .bucket (testBucket ).key (COPY_DESTINATION_KEY )).join ();
139
+ s3AsyncClient .headObject (r -> r .bucket (testBucket ).key (COPY_DESTINATION_KEY )).join ();
130
140
131
- String result = s3Async .getObject (r -> r .bucket (testBucket ).key (KEY ), AsyncResponseTransformer .toBytes ()).join ().asUtf8String ();
141
+ String result = s3AsyncClient .getObject (r -> r .bucket (testBucket ).key (KEY ), AsyncResponseTransformer .toBytes ()).join ().asUtf8String ();
132
142
assertThat (result ).isEqualTo (CONTENTS );
133
143
134
- s3Async .deleteObject (r -> r .bucket (testBucket ).key (KEY )).join ();
144
+ s3AsyncClient .deleteObject (r -> r .bucket (testBucket ).key (KEY )).join ();
135
145
}
136
146
137
147
@ Test
@@ -148,16 +158,17 @@ public void putCopyGetDeleteSync() {
148
158
s3 .deleteObject (r -> r .bucket (testBucket ).key (KEY ));
149
159
}
150
160
151
- @ Test
152
- public void uploadMultiplePartAsync () {
153
- String uploadId = s3Async .createMultipartUpload (b -> b .bucket (testBucket ).key (KEY )).join ().uploadId ();
161
+ @ ParameterizedTest (autoCloseArguments = false )
162
+ @ MethodSource ("asyncClients" )
163
+ public void uploadMultiplePartAsync (S3AsyncClient s3AsyncClient ) {
164
+ String uploadId = s3AsyncClient .createMultipartUpload (b -> b .bucket (testBucket ).key (KEY )).join ().uploadId ();
154
165
155
166
UploadPartRequest uploadPartRequest = UploadPartRequest .builder ().bucket (testBucket ).key (KEY )
156
167
.uploadId (uploadId )
157
168
.partNumber (1 )
158
169
.build ();
159
170
160
- UploadPartResponse response = s3Async .uploadPart (uploadPartRequest , AsyncRequestBody .fromString (CONTENTS )).join ();
171
+ UploadPartResponse response = s3AsyncClient .uploadPart (uploadPartRequest , AsyncRequestBody .fromString (CONTENTS )).join ();
161
172
162
173
List <CompletedPart > completedParts = new ArrayList <>();
163
174
completedParts .add (CompletedPart .builder ().eTag (response .eTag ()).partNumber (1 ).build ());
@@ -168,7 +179,7 @@ public void uploadMultiplePartAsync() {
168
179
.uploadId (uploadId )
169
180
.multipartUpload (completedUploadParts )
170
181
.build ();
171
- CompleteMultipartUploadResponse completeMultipartUploadResponse = s3Async .completeMultipartUpload (completeRequest ).join ();
182
+ CompleteMultipartUploadResponse completeMultipartUploadResponse = s3AsyncClient .completeMultipartUpload (completeRequest ).join ();
172
183
assertThat (completeMultipartUploadResponse ).isNotNull ();
173
184
174
185
ResponseBytes <GetObjectResponse > objectAsBytes = s3 .getObject (b -> b .bucket (testBucket ).key (KEY ), ResponseTransformer .toBytes ());
@@ -183,7 +194,7 @@ public void s3Express_nonObjectTransferApis_Sync(SyncTestCase tc) {
183
194
}
184
195
185
196
@ MethodSource ("asyncTestCases" )
186
- @ ParameterizedTest
197
+ @ ParameterizedTest ( autoCloseArguments = false )
187
198
public void s3Express_nonObjectTransferApis_Async (AsyncTestCase tc ) {
188
199
runAndVerify (tc );
189
200
}
@@ -351,30 +362,36 @@ private static List<SyncTestCase> syncTestCases() {
351
362
}
352
363
353
364
private static List <AsyncTestCase > asyncTestCases () {
365
+ return Stream .concat (asyncTestCasesPerClient (s3Async ).stream (), asyncTestCasesPerClient (s3CrtAsync ).stream ()).collect (Collectors .toList ());
366
+ }
367
+
368
+ private static List <AsyncTestCase > asyncTestCasesPerClient (S3AsyncClient s3Async ) {
369
+ // getSimpleName is not "simple", but it's fine to be used for testing
370
+ String simpleName = s3Async .getClass ().getSimpleName ();
354
371
return Arrays .asList (
355
372
//control plane APIs
356
- new AsyncTestCase ("ListDirectoryBuckets" , () -> {
373
+ new AsyncTestCase ("ListDirectoryBuckets-" + simpleName , () -> {
357
374
ListDirectoryBucketsRequest request = ListDirectoryBucketsRequest .builder ().build ();
358
375
return s3Async .listDirectoryBuckets (request );
359
376
}, Expect .builder ().build ()),
360
- new AsyncTestCase ("PutBucketPolicy" , () -> {
377
+ new AsyncTestCase ("PutBucketPolicy-" + simpleName , () -> {
361
378
PutBucketPolicyRequest request = PutBucketPolicyRequest .builder ().bucket (testBucket ).policy ("fake" ).build ();
362
379
return s3Async .putBucketPolicy (request );
363
380
}, Expect .builder ().error ("Policies must be valid JSON" ).build ()),
364
- new AsyncTestCase ("GetBucketPolicy" , () -> {
381
+ new AsyncTestCase ("GetBucketPolicy-" + simpleName , () -> {
365
382
GetBucketPolicyRequest request = GetBucketPolicyRequest .builder ().bucket (testBucket ).build ();
366
383
return s3Async .getBucketPolicy (request );
367
384
}, Expect .builder ().error ("The bucket policy does not exist" ).build ()),
368
- new AsyncTestCase ("DeleteBucketPolicy" , () -> {
385
+ new AsyncTestCase ("DeleteBucketPolicy-" + simpleName , () -> {
369
386
DeleteBucketPolicyRequest request = DeleteBucketPolicyRequest .builder ().bucket (testBucket ).build ();
370
387
return s3Async .deleteBucketPolicy (request );
371
388
}, Expect .builder ().build ()),
372
389
//data plane APIs
373
- new AsyncTestCase ("ListObjectsV2" , () -> {
390
+ new AsyncTestCase ("ListObjectsV2-" + simpleName , () -> {
374
391
ListObjectsV2Request request = ListObjectsV2Request .builder ().bucket (testBucket ).build ();
375
392
return s3Async .listObjectsV2 (request );
376
393
}, Expect .builder ().build ()),
377
- new AsyncTestCase ("DeleteObjects" , () -> {
394
+ new AsyncTestCase ("DeleteObjects-" + simpleName , () -> {
378
395
DeleteObjectsRequest request = DeleteObjectsRequest .builder ()
379
396
.bucket (testBucket )
380
397
.delete (Delete .builder ()
@@ -385,7 +402,7 @@ private static List<AsyncTestCase> asyncTestCases() {
385
402
.build ();
386
403
return s3Async .deleteObjects (request );
387
404
}, Expect .builder ().build ()),
388
- new AsyncTestCase ("HeadBucket" , () -> {
405
+ new AsyncTestCase ("HeadBucket-" + simpleName , () -> {
389
406
HeadBucketRequest request = HeadBucketRequest .builder ().bucket (testBucket ).build ();
390
407
return s3Async .headBucket (request );
391
408
}, Expect .builder ().build ())
@@ -422,8 +439,6 @@ protected static void runAndVerify(SyncTestCase testCase) {
422
439
}
423
440
List <String > contentSha256Value = req .headers ().get ("x-amz-content-sha256" );
424
441
assertThat (contentSha256Value ).isNotNull ().hasSize (1 ).isEqualTo (Collections .singletonList ("UNSIGNED-PAYLOAD" ));
425
-
426
- req .headers ().keySet ().forEach (k -> System .out .println (k + " " + req .headers ().get (k )));
427
442
});
428
443
}
429
444
0 commit comments