blob: ef5feb77f8f2a1f88348020e92450ba6dfe04860 [file] [log] [blame]
/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
package software.amazon.awssdk.services.s3control;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertNotNull;
import static software.amazon.awssdk.testutils.service.S3BucketUtils.temporaryBucketName;
import static software.amazon.awssdk.utils.FunctionalUtils.invokeSafely;
import java.io.IOException;
import java.time.Duration;
import java.util.StringJoiner;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.http.HttpExecuteRequest;
import software.amazon.awssdk.http.HttpExecuteResponse;
import software.amazon.awssdk.http.SdkHttpClient;
import software.amazon.awssdk.http.SdkHttpRequest;
import software.amazon.awssdk.http.apache.ApacheHttpClient;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.sts.StsClient;
import software.amazon.awssdk.utils.IoUtils;
import software.amazon.awssdk.utils.StringInputStream;
public class S3AccessPointsIntegrationTest extends S3ControlIntegrationTestBase {
private static final String BUCKET = temporaryBucketName(S3AccessPointsIntegrationTest.class);
private static final String AP_NAME = "java-sdk-" + System.currentTimeMillis();
private static final String KEY = "some-key";
private static S3ControlClient s3control;
private static StsClient sts;
private static String accountId;
@BeforeClass
public static void setupFixture() {
createBucket(BUCKET);
s3control = S3ControlClient.builder()
.region(Region.US_WEST_2)
.credentialsProvider(CREDENTIALS_PROVIDER_CHAIN)
.build();
sts = StsClient.builder()
.region(Region.US_WEST_2)
.credentialsProvider(CREDENTIALS_PROVIDER_CHAIN)
.build();
accountId = sts.getCallerIdentity().account();
s3control.createAccessPoint(r -> r.accountId(accountId)
.bucket(BUCKET)
.name(AP_NAME));
}
@AfterClass
public static void tearDown() {
s3control.deleteAccessPoint(b -> b.accountId(accountId).name(AP_NAME));
deleteBucketAndAllContents(BUCKET);
}
@Test
public void transfer_Succeeds_UsingAccessPoint() {
StringJoiner apArn = new StringJoiner(":");
apArn.add("arn").add("aws").add("s3").add("us-west-2").add(accountId).add("accesspoint").add(AP_NAME);
s3.putObject(PutObjectRequest.builder()
.bucket(apArn.toString())
.key(KEY)
.build(), RequestBody.fromString("helloworld"));
String objectContent = s3.getObjectAsBytes(GetObjectRequest.builder()
.bucket(apArn.toString())
.key(KEY)
.build()).asUtf8String();
assertThat(objectContent).isEqualTo("helloworld");
}
@Test
public void transfer_Succeeds_UsingAccessPoint_CrossRegion() {
S3Client s3DifferentRegion =
s3ClientBuilder().region(Region.US_EAST_1).serviceConfiguration(c -> c.useArnRegionEnabled(true)).build();
StringJoiner apArn = new StringJoiner(":");
apArn.add("arn").add("aws").add("s3").add("us-west-2").add(accountId).add("accesspoint").add(AP_NAME);
s3DifferentRegion.putObject(PutObjectRequest.builder()
.bucket(apArn.toString())
.key(KEY)
.build(), RequestBody.fromString("helloworld"));
String objectContent = s3DifferentRegion.getObjectAsBytes(GetObjectRequest.builder()
.bucket(apArn.toString())
.key(KEY)
.build()).asUtf8String();
assertThat(objectContent).isEqualTo("helloworld");
}
@Test
public void uploadAndDownloadWithPresignedUrlWorks() throws IOException {
String accessPointArn = new StringJoiner(":").add("arn").add("aws").add("s3").add("us-west-2").add(accountId)
.add("accesspoint").add(AP_NAME).toString();
String key = "foo/a0A!-_.*'()&@:,$=+?; \n\\^`<>{}[]#%\"~|山";
testAccessPointPresigning(accessPointArn, key);
}
private void testAccessPointPresigning(String accessPointArn, String key) throws IOException {
String data = "Hello";
S3Presigner presigner = S3Presigner.builder().region(Region.US_WEST_2).build();
SdkHttpRequest presignedPut = presigner.presignPutObject(r -> r.signatureDuration(Duration.ofDays(7))
.putObjectRequest(por -> por.bucket(accessPointArn)
.key(key)))
.httpRequest();
SdkHttpRequest presignedGet = presigner.presignGetObject(r -> r.signatureDuration(Duration.ofDays(7))
.getObjectRequest(gor -> gor.bucket(accessPointArn)
.key(key)))
.httpRequest();
try (SdkHttpClient client = ApacheHttpClient.create()) {
client.prepareRequest(HttpExecuteRequest.builder()
.request(presignedPut)
.contentStreamProvider(() -> new StringInputStream(data))
.build())
.call();
HttpExecuteResponse getResult = client.prepareRequest(HttpExecuteRequest.builder()
.request(presignedGet)
.build())
.call();
String result = getResult.responseBody()
.map(stream -> invokeSafely(() -> IoUtils.toUtf8String(stream)))
.orElseThrow(AssertionError::new);
assertThat(result).isEqualTo(data);
}
}
@Test
public void accessPointOperation_nonArns() {
assertNotNull(s3control.listAccessPoints(b -> b.bucket(BUCKET).accountId(accountId).maxResults(1)));
assertNotNull(s3control.getAccessPoint(b -> b.name(AP_NAME).accountId(accountId)));
}
}