|
16 | 16 | package software.amazon.awssdk.services.s3.internal.crossregion;
|
17 | 17 |
|
18 | 18 | import static org.assertj.core.api.Assertions.assertThat;
|
| 19 | +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; |
19 | 20 | import static software.amazon.awssdk.services.s3.internal.crossregion.S3DecoratorRedirectBaseTest.CROSS_REGION;
|
20 | 21 | import static software.amazon.awssdk.services.s3.internal.crossregion.S3DecoratorRedirectBaseTest.X_AMZ_BUCKET_REGION;
|
21 | 22 |
|
22 | 23 | import java.net.URI;
|
23 | 24 | import java.util.Arrays;
|
24 | 25 | import java.util.List;
|
25 | 26 | import java.util.concurrent.CompletableFuture;
|
| 27 | +import java.util.concurrent.CompletionException; |
26 | 28 | import java.util.function.Consumer;
|
27 | 29 | import java.util.stream.Collectors;
|
28 | 30 | import java.util.stream.Stream;
|
|
32 | 34 | import org.junit.jupiter.params.provider.Arguments;
|
33 | 35 | import org.junit.jupiter.params.provider.MethodSource;
|
34 | 36 | import software.amazon.awssdk.core.async.AsyncResponseTransformer;
|
| 37 | +import software.amazon.awssdk.core.exception.SdkClientException; |
35 | 38 | import software.amazon.awssdk.core.interceptor.Context;
|
36 | 39 | import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
|
37 | 40 | import software.amazon.awssdk.core.interceptor.ExecutionInterceptor;
|
38 | 41 | import software.amazon.awssdk.core.interceptor.SdkInternalExecutionAttribute;
|
| 42 | +import software.amazon.awssdk.endpoints.Endpoint; |
39 | 43 | import software.amazon.awssdk.endpoints.EndpointProvider;
|
40 | 44 | import software.amazon.awssdk.http.AbortableInputStream;
|
41 | 45 | import software.amazon.awssdk.http.HttpExecuteResponse;
|
|
47 | 51 | import software.amazon.awssdk.services.s3.S3AsyncClient;
|
48 | 52 | import software.amazon.awssdk.services.s3.S3AsyncClientBuilder;
|
49 | 53 | import software.amazon.awssdk.services.s3.S3Client;
|
| 54 | +import software.amazon.awssdk.services.s3.endpoints.S3EndpointParams; |
| 55 | +import software.amazon.awssdk.services.s3.endpoints.S3EndpointProvider; |
50 | 56 | import software.amazon.awssdk.services.s3.endpoints.internal.DefaultS3EndpointProvider;
|
51 | 57 | import software.amazon.awssdk.services.s3.internal.crossregion.endpointprovider.BucketEndpointProvider;
|
52 | 58 | import software.amazon.awssdk.services.s3.model.GetObjectRequest;
|
53 | 59 | import software.amazon.awssdk.services.s3.model.ListObjectsV2Response;
|
| 60 | +import software.amazon.awssdk.services.s3.model.S3Exception; |
54 | 61 | import software.amazon.awssdk.services.s3.paginators.ListObjectsV2Publisher;
|
55 | 62 | import software.amazon.awssdk.testutils.service.http.MockAsyncHttpClient;
|
56 | 63 | import software.amazon.awssdk.utils.StringInputStream;
|
@@ -174,6 +181,57 @@ void crossRegionClient_CallsHeadObject_when_regionNameNotPresentInFallBackCall()
|
174 | 181 |
|
175 | 182 | }
|
176 | 183 |
|
| 184 | + @Test |
| 185 | + void crossRegionClient_CallsHeadObjectErrors_shouldTerminateTheAPI() { |
| 186 | + mockAsyncHttpClient.stubResponses(customHttpResponse(301, null ), |
| 187 | + customHttpResponse(400, null ), |
| 188 | + successHttpResponse(), successHttpResponse()); |
| 189 | + S3AsyncClient crossRegionClient = |
| 190 | + clientBuilder().endpointOverride(null).region(Region.US_WEST_2) |
| 191 | + .serviceConfiguration(c -> c.crossRegionAccessEnabled(true)).build(); |
| 192 | + |
| 193 | + assertThatExceptionOfType(CompletionException.class) |
| 194 | + .isThrownBy(() -> crossRegionClient.getObject(r -> r.bucket(BUCKET).key(KEY), AsyncResponseTransformer.toBytes()).join()) |
| 195 | + .withMessageContaining("Endpoint resolution failed"); |
| 196 | + |
| 197 | + List<SdkHttpRequest> requests = mockAsyncHttpClient.getRequests(); |
| 198 | + assertThat(requests).hasSize(2); |
| 199 | + |
| 200 | + assertThat(requests.stream().map(req -> req.host().substring(10,req.host().length() - 14 )).collect(Collectors.toList())) |
| 201 | + .isEqualTo(Arrays.asList(Region.US_WEST_2.toString(), |
| 202 | + Region.US_WEST_2.toString())); |
| 203 | + |
| 204 | + assertThat(requests.stream().map(req -> req.method()).collect(Collectors.toList())) |
| 205 | + .isEqualTo(Arrays.asList(SdkHttpMethod.GET, |
| 206 | + SdkHttpMethod.HEAD)); |
| 207 | + } |
| 208 | + |
| 209 | + @Test |
| 210 | + void crossRegionClient_CallsHeadObjectWithNoRegion_shouldTerminateHeadBucketAPI() { |
| 211 | + mockAsyncHttpClient.stubResponses(customHttpResponse(301, null ), |
| 212 | + customHttpResponse(301, null ), |
| 213 | + successHttpResponse(), successHttpResponse()); |
| 214 | + S3AsyncClient crossRegionClient = |
| 215 | + clientBuilder().endpointOverride(null).region(Region.US_WEST_2) |
| 216 | + .serviceConfiguration(c -> c.crossRegionAccessEnabled(true)).build(); |
| 217 | + |
| 218 | + assertThatExceptionOfType(CompletionException.class) |
| 219 | + .isThrownBy(() -> crossRegionClient.getObject(r -> r.bucket(BUCKET).key(KEY), AsyncResponseTransformer.toBytes()).join()) |
| 220 | + .withMessageContaining("Endpoint resolution failed") |
| 221 | + .withCauseInstanceOf(SdkClientException.class).withRootCauseExactlyInstanceOf(S3Exception.class); |
| 222 | + |
| 223 | + List<SdkHttpRequest> requests = mockAsyncHttpClient.getRequests(); |
| 224 | + assertThat(requests).hasSize(2); |
| 225 | + |
| 226 | + assertThat(requests.stream().map(req -> req.host().substring(10,req.host().length() - 14 )).collect(Collectors.toList())) |
| 227 | + .isEqualTo(Arrays.asList(Region.US_WEST_2.toString(), |
| 228 | + Region.US_WEST_2.toString())); |
| 229 | + |
| 230 | + assertThat(requests.stream().map(req -> req.method()).collect(Collectors.toList())) |
| 231 | + .isEqualTo(Arrays.asList(SdkHttpMethod.GET, |
| 232 | + SdkHttpMethod.HEAD)); |
| 233 | + } |
| 234 | + |
177 | 235 | private S3AsyncClientBuilder clientBuilder() {
|
178 | 236 | return S3AsyncClient.builder()
|
179 | 237 | .httpClient(mockAsyncHttpClient)
|
|
0 commit comments