20
20
import static org .mockito .Mockito .verify ;
21
21
import static software .amazon .awssdk .services .s3 .internal .crossregion .S3CrossRegionAsyncClientTest .customHttpResponse ;
22
22
import static software .amazon .awssdk .services .s3 .internal .crossregion .S3CrossRegionAsyncClientTest .successHttpResponse ;
23
+ import static software .amazon .awssdk .services .s3 .internal .crossregion .S3DecoratorRedirectTestBase .CHANGED_CROSS_REGION ;
23
24
import static software .amazon .awssdk .services .s3 .internal .crossregion .S3DecoratorRedirectTestBase .CROSS_REGION ;
24
25
import static software .amazon .awssdk .services .s3 .internal .crossregion .S3DecoratorRedirectTestBase .OVERRIDE_CONFIGURED_REGION ;
25
26
@@ -58,20 +59,17 @@ class S3CrossRegionSyncClientTest {
58
59
private static final String KEY = "key" ;
59
60
private static final String TOKEN = "token" ;
60
61
61
- private final MockSyncHttpClient mockSyncHttpClient = new MockSyncHttpClient () ;
62
+ private MockSyncHttpClient mockSyncHttpClient ;
62
63
private CaptureInterceptor captureInterceptor ;
63
64
private S3Client defaultS3Client ;
64
65
65
66
@ BeforeEach
66
67
void before () {
68
+ mockSyncHttpClient = new MockSyncHttpClient ();
67
69
captureInterceptor = new CaptureInterceptor ();
68
70
defaultS3Client = clientBuilder ().build ();
69
71
}
70
72
71
- @ AfterEach
72
- void clear (){
73
- mockSyncHttpClient .reset ();
74
- }
75
73
76
74
private static Stream <Arguments > stubResponses () {
77
75
Consumer <MockSyncHttpClient > redirectStubConsumer = mockSyncHttpClient ->
@@ -95,7 +93,7 @@ private static Stream<Arguments> stubOverriddenEndpointProviderResponses() {
95
93
96
94
return Stream .of (
97
95
Arguments .of (redirectStubConsumer , BucketEndpointProvider .class , CROSS_REGION ),
98
- Arguments .of (successStubConsumer , TestEndpointProvider .class , Region . US_EAST_1 . toString () )
96
+ Arguments .of (successStubConsumer , TestEndpointProvider .class , OVERRIDE_CONFIGURED_REGION )
99
97
);
100
98
}
101
99
@@ -155,6 +153,7 @@ void standardOp_crossRegionClient_takesCustomEndpointProviderInRequest(Consumer<
155
153
stubConsumer .accept (mockSyncHttpClient );
156
154
S3Client crossRegionClient = clientBuilder ().serviceConfiguration (c -> c .crossRegionAccessEnabled (true ))
157
155
.endpointProvider (new TestEndpointProvider ())
156
+ .region (OVERRIDE_CONFIGURED_REGION )
158
157
.build ();
159
158
GetObjectRequest request = GetObjectRequest .builder ()
160
159
.bucket (BUCKET )
@@ -177,6 +176,7 @@ void standardOp_crossRegionClient_takesCustomEndpointProviderInClient(Consumer<M
177
176
stubConsumer .accept (mockSyncHttpClient );
178
177
S3Client crossRegionClient = clientBuilder ().serviceConfiguration (c -> c .crossRegionAccessEnabled (true ))
179
178
.endpointProvider (new TestEndpointProvider ())
179
+ .region (OVERRIDE_CONFIGURED_REGION )
180
180
.build ();
181
181
GetObjectRequest request = GetObjectRequest .builder ()
182
182
.bucket (BUCKET )
@@ -229,6 +229,66 @@ void crossRegionClient_CallsHeadObject_when_regionNameNotPresentInFallBackCall()
229
229
230
230
}
231
231
232
+ @ Test
233
+ void crossRegionClient_when_redirectsAfterCaching () {
234
+ mockSyncHttpClient .stubResponses (customHttpResponse (301 , CROSS_REGION ),
235
+ successHttpResponse (),
236
+ successHttpResponse (),
237
+ customHttpResponse (301 , CHANGED_CROSS_REGION ),
238
+ successHttpResponse ());
239
+ S3Client crossRegionClient =
240
+ clientBuilder ().endpointOverride (null ).region (OVERRIDE_CONFIGURED_REGION ).serviceConfiguration (c -> c .crossRegionAccessEnabled (true )).build ();
241
+ crossRegionClient .getObject (r -> r .bucket (BUCKET ).key (KEY ));
242
+ crossRegionClient .getObject (r -> r .bucket (BUCKET ).key (KEY ));
243
+ crossRegionClient .getObject (r -> r .bucket (BUCKET ).key (KEY ));
244
+ assertThat (captureInterceptor .endpointProvider ).isInstanceOf (BucketEndpointProvider .class );
245
+
246
+ List <SdkHttpRequest > requests = mockSyncHttpClient .getRequests ();
247
+ assertThat (requests ).hasSize (5 );
248
+
249
+ assertThat (requests .stream ().map (req -> req .host ().substring (10 ,req .host ().length () - 14 )).collect (Collectors .toList ()))
250
+ .isEqualTo (Arrays .asList (OVERRIDE_CONFIGURED_REGION .toString (),
251
+ CROSS_REGION .toString (),
252
+ CROSS_REGION .toString (),
253
+ CROSS_REGION .toString (),
254
+ CHANGED_CROSS_REGION .toString ()));
255
+
256
+ assertThat (requests .stream ().map (req -> req .method ()).collect (Collectors .toList ()))
257
+ .isEqualTo (Arrays .asList (SdkHttpMethod .GET ,SdkHttpMethod .GET ,SdkHttpMethod .GET ,SdkHttpMethod .GET ,SdkHttpMethod .GET ));
258
+ }
259
+
260
+ @ Test
261
+ void crossRegionClient_when_redirectsAfterCaching_withFallBackRedirectWithNoRegion () {
262
+ mockSyncHttpClient .stubResponses (customHttpResponse (301 , null ),
263
+ customHttpResponse (301 , CROSS_REGION ),
264
+ successHttpResponse (),
265
+ successHttpResponse (),
266
+ customHttpResponse (301 , null ),
267
+ customHttpResponse (301 , CHANGED_CROSS_REGION ),
268
+ successHttpResponse ());
269
+ S3Client crossRegionClient =
270
+ clientBuilder ().endpointOverride (null ).region (OVERRIDE_CONFIGURED_REGION ).serviceConfiguration (c -> c .crossRegionAccessEnabled (true )).build ();
271
+ crossRegionClient .getObject (r -> r .bucket (BUCKET ).key (KEY ));
272
+ crossRegionClient .getObject (r -> r .bucket (BUCKET ).key (KEY ));
273
+ crossRegionClient .getObject (r -> r .bucket (BUCKET ).key (KEY ));
274
+ assertThat (captureInterceptor .endpointProvider ).isInstanceOf (BucketEndpointProvider .class );
275
+
276
+ List <SdkHttpRequest > requests = mockSyncHttpClient .getRequests ();
277
+ assertThat (requests ).hasSize (7 );
278
+
279
+ assertThat (requests .stream ().map (req -> req .host ().substring (10 ,req .host ().length () - 14 )).collect (Collectors .toList ()))
280
+ .isEqualTo (Arrays .asList (
281
+ OVERRIDE_CONFIGURED_REGION .toString (), OVERRIDE_CONFIGURED_REGION .toString (), CROSS_REGION .toString (),
282
+ CROSS_REGION .toString (),
283
+ CROSS_REGION .toString (), OVERRIDE_CONFIGURED_REGION .toString (),
284
+ CHANGED_CROSS_REGION .toString ()));
285
+
286
+ assertThat (requests .stream ().map (req -> req .method ()).collect (Collectors .toList ()))
287
+ .isEqualTo (Arrays .asList (SdkHttpMethod .GET , SdkHttpMethod .HEAD , SdkHttpMethod .GET ,
288
+ SdkHttpMethod .GET ,
289
+ SdkHttpMethod .GET , SdkHttpMethod .HEAD , SdkHttpMethod .GET ));
290
+ }
291
+
232
292
@ Test
233
293
void crossRegionClient_CallsHeadObjectErrors_shouldTerminateTheAPI () {
234
294
mockSyncHttpClient .stubResponses (customHttpResponse (301 , null ),
0 commit comments