Skip to content

Commit f99d959

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

File tree

2 files changed

+133
-7
lines changed

2 files changed

+133
-7
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: 66 additions & 6 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 ->
@@ -95,7 +93,7 @@ private static Stream<Arguments> stubOverriddenEndpointProviderResponses() {
9593

9694
return Stream.of(
9795
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)
9997
);
10098
}
10199

@@ -155,6 +153,7 @@ void standardOp_crossRegionClient_takesCustomEndpointProviderInRequest(Consumer<
155153
stubConsumer.accept(mockSyncHttpClient);
156154
S3Client crossRegionClient = clientBuilder().serviceConfiguration(c -> c.crossRegionAccessEnabled(true))
157155
.endpointProvider(new TestEndpointProvider())
156+
.region(OVERRIDE_CONFIGURED_REGION)
158157
.build();
159158
GetObjectRequest request = GetObjectRequest.builder()
160159
.bucket(BUCKET)
@@ -177,6 +176,7 @@ void standardOp_crossRegionClient_takesCustomEndpointProviderInClient(Consumer<M
177176
stubConsumer.accept(mockSyncHttpClient);
178177
S3Client crossRegionClient = clientBuilder().serviceConfiguration(c -> c.crossRegionAccessEnabled(true))
179178
.endpointProvider(new TestEndpointProvider())
179+
.region(OVERRIDE_CONFIGURED_REGION)
180180
.build();
181181
GetObjectRequest request = GetObjectRequest.builder()
182182
.bucket(BUCKET)
@@ -229,6 +229,66 @@ void crossRegionClient_CallsHeadObject_when_regionNameNotPresentInFallBackCall()
229229

230230
}
231231

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+
232292
@Test
233293
void crossRegionClient_CallsHeadObjectErrors_shouldTerminateTheAPI() {
234294
mockSyncHttpClient.stubResponses(customHttpResponse(301, null ),

0 commit comments

Comments
 (0)