Skip to content

Commit a54eabc

Browse files
committed
Added test case when Redirected after the Region is cached
1 parent 12b080a commit a54eabc

File tree

2 files changed

+130
-6
lines changed

2 files changed

+130
-6
lines changed

services/s3/src/test/java/software/amazon/awssdk/services/s3/internal/crossregion/S3CrossRegionAsyncClientTest.java

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import static org.assertj.core.api.Assertions.assertThat;
1919
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
20+
import static software.amazon.awssdk.services.s3.internal.crossregion.S3DecoratorRedirectTestBase.CHANGED_CROSS_REGION;
2021
import static software.amazon.awssdk.services.s3.internal.crossregion.S3DecoratorRedirectTestBase.CROSS_REGION;
2122
import static software.amazon.awssdk.services.s3.internal.crossregion.S3DecoratorRedirectTestBase.OVERRIDE_CONFIGURED_REGION;
2223
import static software.amazon.awssdk.services.s3.internal.crossregion.S3DecoratorRedirectTestBase.X_AMZ_BUCKET_REGION;
@@ -52,6 +53,7 @@
5253
import software.amazon.awssdk.regions.Region;
5354
import software.amazon.awssdk.services.s3.S3AsyncClient;
5455
import software.amazon.awssdk.services.s3.S3AsyncClientBuilder;
56+
import software.amazon.awssdk.services.s3.S3Client;
5557
import software.amazon.awssdk.services.s3.endpoints.internal.DefaultS3EndpointProvider;
5658
import software.amazon.awssdk.services.s3.internal.crossregion.endpointprovider.BucketEndpointProvider;
5759
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
@@ -69,12 +71,13 @@ class S3CrossRegionAsyncClientTest {
6971
private static final String BUCKET = "bucket";
7072
private static final String KEY = "key";
7173
private static final String TOKEN = "token";
72-
private final MockAsyncHttpClient mockAsyncHttpClient = new MockAsyncHttpClient();
74+
private MockAsyncHttpClient mockAsyncHttpClient ;
7375
private CaptureInterceptor captureInterceptor;
7476
private S3AsyncClient s3Client;
7577

7678
@BeforeEach
7779
void before() {
80+
mockAsyncHttpClient = new MockAsyncHttpClient();
7881
captureInterceptor = new CaptureInterceptor();
7982
s3Client = clientBuilder().build();
8083
}
@@ -248,6 +251,69 @@ void crossRegionClient_cancelsTheThread_when_futureIsCancelled(){
248251
assertThat(completableFuture.isCancelled()).isTrue();
249252
}
250253

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+
251317
@Test
252318
void standardOp_crossRegionClient_containUserAgent() {
253319
mockAsyncHttpClient.stubResponses(successHttpResponse());

services/s3/src/test/java/software/amazon/awssdk/services/s3/internal/crossregion/S3CrossRegionSyncClientTest.java

Lines changed: 63 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static org.mockito.Mockito.verify;
2121
import static software.amazon.awssdk.services.s3.internal.crossregion.S3CrossRegionAsyncClientTest.customHttpResponse;
2222
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;
2324
import static software.amazon.awssdk.services.s3.internal.crossregion.S3DecoratorRedirectTestBase.CROSS_REGION;
2425
import static software.amazon.awssdk.services.s3.internal.crossregion.S3DecoratorRedirectTestBase.OVERRIDE_CONFIGURED_REGION;
2526

@@ -58,20 +59,17 @@ class S3CrossRegionSyncClientTest {
5859
private static final String KEY = "key";
5960
private static final String TOKEN = "token";
6061

61-
private final MockSyncHttpClient mockSyncHttpClient = new MockSyncHttpClient();
62+
private MockSyncHttpClient mockSyncHttpClient ;
6263
private CaptureInterceptor captureInterceptor;
6364
private S3Client defaultS3Client;
6465

6566
@BeforeEach
6667
void before() {
68+
mockSyncHttpClient = new MockSyncHttpClient();
6769
captureInterceptor = new CaptureInterceptor();
6870
defaultS3Client = clientBuilder().build();
6971
}
7072

71-
@AfterEach
72-
void clear(){
73-
mockSyncHttpClient.reset();
74-
}
7573

7674
private static Stream<Arguments> stubResponses() {
7775
Consumer<MockSyncHttpClient> redirectStubConsumer = mockSyncHttpClient ->
@@ -229,6 +227,66 @@ void crossRegionClient_CallsHeadObject_when_regionNameNotPresentInFallBackCall()
229227

230228
}
231229

230+
@Test
231+
void crossRegionClient_when_redirectsAfterCaching() {
232+
mockSyncHttpClient.stubResponses(customHttpResponse(301, CROSS_REGION ),
233+
successHttpResponse(),
234+
successHttpResponse(),
235+
customHttpResponse(301, CHANGED_CROSS_REGION),
236+
successHttpResponse());
237+
S3Client crossRegionClient =
238+
clientBuilder().endpointOverride(null).region(OVERRIDE_CONFIGURED_REGION).serviceConfiguration(c -> c.crossRegionAccessEnabled(true)).build();
239+
crossRegionClient.getObject(r -> r.bucket(BUCKET).key(KEY));
240+
crossRegionClient.getObject(r -> r.bucket(BUCKET).key(KEY));
241+
crossRegionClient.getObject(r -> r.bucket(BUCKET).key(KEY));
242+
assertThat(captureInterceptor.endpointProvider).isInstanceOf(BucketEndpointProvider.class);
243+
244+
List<SdkHttpRequest> requests = mockSyncHttpClient.getRequests();
245+
assertThat(requests).hasSize(5);
246+
247+
assertThat(requests.stream().map(req -> req.host().substring(10,req.host().length() - 14 )).collect(Collectors.toList()))
248+
.isEqualTo(Arrays.asList(OVERRIDE_CONFIGURED_REGION.toString(),
249+
CROSS_REGION.toString(),
250+
CROSS_REGION.toString(),
251+
CROSS_REGION.toString(),
252+
CHANGED_CROSS_REGION.toString()));
253+
254+
assertThat(requests.stream().map(req -> req.method()).collect(Collectors.toList()))
255+
.isEqualTo(Arrays.asList(SdkHttpMethod.GET,SdkHttpMethod.GET,SdkHttpMethod.GET,SdkHttpMethod.GET,SdkHttpMethod.GET));
256+
}
257+
258+
@Test
259+
void crossRegionClient_when_redirectsAfterCaching_withFallBackRedirectWithNoRegion() {
260+
mockSyncHttpClient.stubResponses(customHttpResponse(301, null ),
261+
customHttpResponse(301, CROSS_REGION ),
262+
successHttpResponse(),
263+
successHttpResponse(),
264+
customHttpResponse(301, null),
265+
customHttpResponse(301, CHANGED_CROSS_REGION),
266+
successHttpResponse());
267+
S3Client crossRegionClient =
268+
clientBuilder().endpointOverride(null).region(OVERRIDE_CONFIGURED_REGION).serviceConfiguration(c -> c.crossRegionAccessEnabled(true)).build();
269+
crossRegionClient.getObject(r -> r.bucket(BUCKET).key(KEY));
270+
crossRegionClient.getObject(r -> r.bucket(BUCKET).key(KEY));
271+
crossRegionClient.getObject(r -> r.bucket(BUCKET).key(KEY));
272+
assertThat(captureInterceptor.endpointProvider).isInstanceOf(BucketEndpointProvider.class);
273+
274+
List<SdkHttpRequest> requests = mockSyncHttpClient.getRequests();
275+
assertThat(requests).hasSize(7);
276+
277+
assertThat(requests.stream().map(req -> req.host().substring(10,req.host().length() - 14 )).collect(Collectors.toList()))
278+
.isEqualTo(Arrays.asList(
279+
OVERRIDE_CONFIGURED_REGION.toString(), OVERRIDE_CONFIGURED_REGION.toString(), CROSS_REGION.toString(),
280+
CROSS_REGION.toString(),
281+
CROSS_REGION.toString(), OVERRIDE_CONFIGURED_REGION.toString(),
282+
CHANGED_CROSS_REGION.toString()));
283+
284+
assertThat(requests.stream().map(req -> req.method()).collect(Collectors.toList()))
285+
.isEqualTo(Arrays.asList(SdkHttpMethod.GET, SdkHttpMethod.HEAD, SdkHttpMethod.GET,
286+
SdkHttpMethod.GET,
287+
SdkHttpMethod.GET, SdkHttpMethod.HEAD, SdkHttpMethod.GET));
288+
}
289+
232290
@Test
233291
void crossRegionClient_CallsHeadObjectErrors_shouldTerminateTheAPI() {
234292
mockSyncHttpClient.stubResponses(customHttpResponse(301, null ),

0 commit comments

Comments
 (0)