using System; using System.Collections.Generic; using System.IO; using System.IO.Compression; using System.Linq; using System.Net; using System.Text; using System.Threading; using Microsoft.VisualStudio.TestTools.UnitTesting; using Amazon; using Amazon.S3; using Amazon.S3.Model; using Amazon.S3.Util; using Amazon.Runtime; using Amazon.Runtime.Internal.Util; using AWSSDK_DotNet.IntegrationTests.Utils; using System.Diagnostics; using Amazon.Util; namespace AWSSDK_DotNet.IntegrationTests.Tests.S3 { /// /// Summary description for PutObjectTest /// [TestClass] public class AccelerateTests : TestBase { private static RegionEndpoint TestRegionEndpoint = RegionEndpoint.USEast1; private static string AuthRegion = "us-east-1"; private static string bucketName; private static string testContent = "This is the content body!"; private static IAmazonS3 s3Client = null; private static List leftoverBuckets = new List(); private Random random = new Random(); [ClassInitialize()] public static void Initialize(TestContext a) { s3Client = new AmazonS3Client(TestRegionEndpoint); bucketName = S3TestUtils.CreateBucketWithWait(s3Client, true); BucketAccelerateStatus bucketStatus = null; s3Client.PutBucketAccelerateConfiguration(new PutBucketAccelerateConfigurationRequest { BucketName = bucketName, AccelerateConfiguration = new AccelerateConfiguration { Status = BucketAccelerateStatus.Enabled } }); var response = S3TestUtils.WaitForConsistency(() => { var res = s3Client.GetBucketAccelerateConfiguration(bucketName); return res.Status == BucketAccelerateStatus.Enabled ? res : null; }); bucketStatus = response.Status; Assert.AreEqual(BucketAccelerateStatus.Enabled, bucketStatus); } [ClassCleanup] public static void ClassCleanup() { if (leftoverBuckets.Any()) { foreach (var bucket in leftoverBuckets) { AmazonS3Util.DeleteS3BucketWithObjects(s3Client, bucket); } } AmazonS3Util.DeleteS3BucketWithObjects(s3Client, bucketName); s3Client.Dispose(); BaseClean(); } [TestMethod] [TestCategory("S3")] public void TestAccelerateEnabledClient() { using (var client = new AmazonS3Client( new AmazonS3Config { UseAccelerateEndpoint = true, RegionEndpoint = TestRegionEndpoint })) { TestAccelerateUnsupportedOperations(client); TestControlPlaneOperations(client); TestDataPlaneOperations(client); // Test error scenarios var exception1 = AssertExtensions.ExpectException( () => client.ListObjects("accelerate.incompatible.bucket")); } var exception2 = AssertExtensions.ExpectException( () => new AmazonS3Client( new AmazonS3Config { ForcePathStyle = true, UseAccelerateEndpoint = true, RegionEndpoint = TestRegionEndpoint })); using (var sigV4Client = new AmazonS3Client( new AmazonS3Config { UseAccelerateEndpoint = true, SignatureVersion = "4", RegionEndpoint = TestRegionEndpoint })) { TestAccelerateUnsupportedOperations(sigV4Client); TestControlPlaneOperations(sigV4Client); TestDataPlaneOperations(sigV4Client); } } [TestMethod] [TestCategory("S3")] public void TestClientWithExplicitRegionEndpointAndAccelerateEnabled() { using (var explicitAccelerateEndpointClient = new AmazonS3Client( new AmazonS3Config { RegionEndpoint = TestRegionEndpoint, UseAccelerateEndpoint = true })) { TestAccelerateUnsupportedOperations(explicitAccelerateEndpointClient); TestControlPlaneOperations(explicitAccelerateEndpointClient); TestDataPlaneOperations(explicitAccelerateEndpointClient); } using (var dualstackAccelerateEndpointClient = new AmazonS3Client( new AmazonS3Config { RegionEndpoint = TestRegionEndpoint, UseAccelerateEndpoint = true, UseDualstackEndpoint = true })) { TestAccelerateUnsupportedOperations(dualstackAccelerateEndpointClient); TestControlPlaneOperations(dualstackAccelerateEndpointClient); TestDataPlaneOperations(dualstackAccelerateEndpointClient); } } [TestMethod] [TestCategory("S3")] public void TestClientWithExplicitAccelerateEndpoint() { AssertExtensions.ExpectException( () => new AmazonS3Client( new AmazonS3Config { ServiceURL = "https://s3-accelerate.amazonaws.com" })); AssertExtensions.ExpectException( () => new AmazonS3Client( new AmazonS3Config { ServiceURL = "https://s3-accelerate.dualstack.amazonaws.com" })); using (var explicitAccelerateEndpointAndAuthRegionClient = new AmazonS3Client( new AmazonS3Config { ServiceURL = "https://s3-accelerate.amazonaws.com", AuthenticationRegion = AuthRegion })) { TestAccelerateUnsupportedOperations(explicitAccelerateEndpointAndAuthRegionClient); TestControlPlaneOperations(explicitAccelerateEndpointAndAuthRegionClient); TestDataPlaneOperations(explicitAccelerateEndpointAndAuthRegionClient); } using (var explicitAccelerateEndpointAndAuthRegionClient = new AmazonS3Client( new AmazonS3Config { ServiceURL = "https://s3-accelerate.dualstack.amazonaws.com", AuthenticationRegion = AuthRegion })) { TestAccelerateUnsupportedOperations(explicitAccelerateEndpointAndAuthRegionClient); TestControlPlaneOperations(explicitAccelerateEndpointAndAuthRegionClient); TestDataPlaneOperations(explicitAccelerateEndpointAndAuthRegionClient); } using (var explicitAccelerateEndpointAndRegionEndpoint = new AmazonS3Client( new AmazonS3Config { ServiceURL = "https://s3-accelerate.amazonaws.com", RegionEndpoint = TestRegionEndpoint })) { TestAccelerateUnsupportedOperations(explicitAccelerateEndpointAndRegionEndpoint); TestControlPlaneOperations(explicitAccelerateEndpointAndRegionEndpoint); TestDataPlaneOperations(explicitAccelerateEndpointAndRegionEndpoint); } } void TestDataPlaneOperations(IAmazonS3 client) { var key = "contentBodyPut" + random.Next(); PutObjectRequest putRequest = new PutObjectRequest { BucketName = bucketName, Key = key, ContentBody = testContent, CannedACL = S3CannedACL.AuthenticatedRead }; client.PutObject(putRequest); var getRequest = new GetObjectRequest { BucketName = bucketName, Key = key }; using (var response = client.GetObject(getRequest)) using (StreamReader reader = new StreamReader(response.ResponseStream)) { var responseData = reader.ReadToEnd(); Assert.AreEqual(testContent, responseData); } } void TestControlPlaneOperations(IAmazonS3 client) { // All other operations should hit accelerate endpoint var objects = client.ListObjects(bucketName).S3Objects; Assert.IsNotNull(objects); } void TestAccelerateUnsupportedOperations(IAmazonS3 client) { // List, Put and Delete bucket should hit regional endpoint var buckets = client.ListBuckets().Buckets; Assert.IsNotNull(buckets); var newBucket = UtilityMethods.GenerateName(); client.PutBucket(newBucket); S3TestUtils.WaitForConsistency(() => { var result = client.ListBuckets().Buckets.Any(b => b.BucketName.Equals(newBucket, StringComparison.Ordinal)); return result ? (bool?)true : null; }); try { client.DeleteBucket(newBucket); } catch (Exception ex) { Console.WriteLine($"Failed to clean up new bucket {newBucket}: {ex.Message}."); leftoverBuckets.Add(newBucket); } } } }