17
17
18
18
import static org .assertj .core .api .Assertions .assertThat ;
19
19
import static org .assertj .core .api .Assertions .assertThatExceptionOfType ;
20
+ import static software .amazon .awssdk .services .s3 .internal .crossregion .S3DecoratorRedirectTestBase .CHANGED_CROSS_REGION ;
20
21
import static software .amazon .awssdk .services .s3 .internal .crossregion .S3DecoratorRedirectTestBase .CROSS_REGION ;
21
22
import static software .amazon .awssdk .services .s3 .internal .crossregion .S3DecoratorRedirectTestBase .OVERRIDE_CONFIGURED_REGION ;
22
23
import static software .amazon .awssdk .services .s3 .internal .crossregion .S3DecoratorRedirectTestBase .X_AMZ_BUCKET_REGION ;
52
53
import software .amazon .awssdk .regions .Region ;
53
54
import software .amazon .awssdk .services .s3 .S3AsyncClient ;
54
55
import software .amazon .awssdk .services .s3 .S3AsyncClientBuilder ;
56
+ import software .amazon .awssdk .services .s3 .S3Client ;
55
57
import software .amazon .awssdk .services .s3 .endpoints .internal .DefaultS3EndpointProvider ;
56
58
import software .amazon .awssdk .services .s3 .internal .crossregion .endpointprovider .BucketEndpointProvider ;
57
59
import software .amazon .awssdk .services .s3 .model .GetObjectRequest ;
@@ -69,12 +71,13 @@ class S3CrossRegionAsyncClientTest {
69
71
private static final String BUCKET = "bucket" ;
70
72
private static final String KEY = "key" ;
71
73
private static final String TOKEN = "token" ;
72
- private final MockAsyncHttpClient mockAsyncHttpClient = new MockAsyncHttpClient () ;
74
+ private MockAsyncHttpClient mockAsyncHttpClient ;
73
75
private CaptureInterceptor captureInterceptor ;
74
76
private S3AsyncClient s3Client ;
75
77
76
78
@ BeforeEach
77
79
void before () {
80
+ mockAsyncHttpClient = new MockAsyncHttpClient ();
78
81
captureInterceptor = new CaptureInterceptor ();
79
82
s3Client = clientBuilder ().build ();
80
83
}
@@ -248,6 +251,69 @@ void crossRegionClient_cancelsTheThread_when_futureIsCancelled(){
248
251
assertThat (completableFuture .isCancelled ()).isTrue ();
249
252
}
250
253
254
+ @ Test
255
+ void crossRegionClient_when_redirectsAfterCaching () {
256
+ mockAsyncHttpClient .stubResponses (customHttpResponse (301 , CROSS_REGION ),
257
+ successHttpResponse (),
258
+ successHttpResponse (),
259
+ customHttpResponse (301 , CHANGED_CROSS_REGION ),
260
+ successHttpResponse ());
261
+ S3AsyncClient crossRegionClient =
262
+ clientBuilder ().endpointOverride (null ).region (OVERRIDE_CONFIGURED_REGION ).serviceConfiguration (c -> c .crossRegionAccessEnabled (true )).build ();
263
+ crossRegionClient .getObject (r -> r .bucket (BUCKET ).key (KEY ), AsyncResponseTransformer .toBytes ()).join ();
264
+ crossRegionClient .getObject (r -> r .bucket (BUCKET ).key (KEY ), AsyncResponseTransformer .toBytes ()).join ();
265
+ crossRegionClient .getObject (r -> r .bucket (BUCKET ).key (KEY ), AsyncResponseTransformer .toBytes ()).join ();
266
+
267
+ assertThat (captureInterceptor .endpointProvider ).isInstanceOf (BucketEndpointProvider .class );
268
+
269
+ List <SdkHttpRequest > requests = mockAsyncHttpClient .getRequests ();
270
+ assertThat (requests ).hasSize (5 );
271
+
272
+ assertThat (requests .stream ().map (req -> req .host ().substring (10 ,req .host ().length () - 14 )).collect (Collectors .toList ()))
273
+ .isEqualTo (Arrays .asList (OVERRIDE_CONFIGURED_REGION .toString (),
274
+ CROSS_REGION .toString (),
275
+ CROSS_REGION .toString (),
276
+ CROSS_REGION .toString (),
277
+ CHANGED_CROSS_REGION .toString ()));
278
+
279
+ assertThat (requests .stream ().map (req -> req .method ()).collect (Collectors .toList ()))
280
+ .isEqualTo (Arrays .asList (SdkHttpMethod .GET ,SdkHttpMethod .GET ,SdkHttpMethod .GET ,SdkHttpMethod .GET ,SdkHttpMethod .GET ));
281
+ }
282
+
283
+ @ Test
284
+ void crossRegionClient_when_redirectsAfterCaching_withFallBackRedirectWithNoRegion () {
285
+ mockAsyncHttpClient .stubResponses (customHttpResponse (301 , null ),
286
+ customHttpResponse (301 , CROSS_REGION ),
287
+ successHttpResponse (),
288
+ successHttpResponse (),
289
+ customHttpResponse (301 , null ),
290
+ customHttpResponse (301 , CHANGED_CROSS_REGION ),
291
+ successHttpResponse ());
292
+ S3AsyncClient crossRegionClient =
293
+ clientBuilder ().endpointOverride (null ).region (OVERRIDE_CONFIGURED_REGION ).serviceConfiguration (c -> c .crossRegionAccessEnabled (true )).build ();
294
+ crossRegionClient .getObject (r -> r .bucket (BUCKET ).key (KEY ), AsyncResponseTransformer .toBytes ()).join ();
295
+ crossRegionClient .getObject (r -> r .bucket (BUCKET ).key (KEY ), AsyncResponseTransformer .toBytes ()).join ();
296
+ crossRegionClient .getObject (r -> r .bucket (BUCKET ).key (KEY ), AsyncResponseTransformer .toBytes ()).join ();
297
+
298
+ assertThat (captureInterceptor .endpointProvider ).isInstanceOf (BucketEndpointProvider .class );
299
+
300
+ List <SdkHttpRequest > requests = mockAsyncHttpClient .getRequests ();
301
+ assertThat (requests ).hasSize (7 );
302
+
303
+ assertThat (requests .stream ().map (req -> req .host ().substring (10 ,req .host ().length () - 14 )).collect (Collectors .toList ()))
304
+ .isEqualTo (Arrays .asList (
305
+ OVERRIDE_CONFIGURED_REGION .toString (), OVERRIDE_CONFIGURED_REGION .toString (), CROSS_REGION .toString (),
306
+ CROSS_REGION .toString (),
307
+ CROSS_REGION .toString (), OVERRIDE_CONFIGURED_REGION .toString (),
308
+ CHANGED_CROSS_REGION .toString ()));
309
+
310
+ assertThat (requests .stream ().map (req -> req .method ()).collect (Collectors .toList ()))
311
+ .isEqualTo (Arrays .asList (SdkHttpMethod .GET , SdkHttpMethod .HEAD , SdkHttpMethod .GET ,
312
+ SdkHttpMethod .GET ,
313
+ SdkHttpMethod .GET , SdkHttpMethod .HEAD , SdkHttpMethod .GET ));
314
+ }
315
+
316
+
251
317
@ Test
252
318
void standardOp_crossRegionClient_containUserAgent () {
253
319
mockAsyncHttpClient .stubResponses (successHttpResponse ());
0 commit comments