diff --git a/src/cs-S3Zip.Tests/S3ZipTests.cs b/src/cs-S3Zip.Tests/S3ZipTests.cs index 09f4c7958c662362b07daac5ac93a662517c49b9..966c81a271912a222a12b7a92abd5243bacf8202 100644 --- a/src/cs-S3Zip.Tests/S3ZipTests.cs +++ b/src/cs-S3Zip.Tests/S3ZipTests.cs @@ -1,22 +1,27 @@ using Amazon.S3; -using coscine.cs_S3Zip; +using Amazon.S3.Model; using NUnit.Framework; using System; +using System.IO; +using System.Linq; +using System.Security.Cryptography; -namespace cs_S3Zip.Tests +namespace coscine.cs_S3Zip.Tests { [TestFixture] public class S3ZipTests { - private readonly S3MultipartStreamConfiguration _s3MultipartStreamConfiguration; + private readonly int ONE_MB; + public S3ZipTests() { - var accessKey = Environment.GetEnvironmentVariable("AccessKey", EnvironmentVariableTarget.User); - var secretKey = Environment.GetEnvironmentVariable("SecretKey", EnvironmentVariableTarget.User); + var accessKey = Environment.GetEnvironmentVariable("S3_ACCESS_KEY", EnvironmentVariableTarget.User); + var secretKey = Environment.GetEnvironmentVariable("S3_SECRET_KEY", EnvironmentVariableTarget.User); + ONE_MB = (int)Math.Pow(2, 20); _s3MultipartStreamConfiguration = new S3MultipartStreamConfiguration { @@ -31,18 +36,73 @@ namespace cs_S3Zip.Tests }; } - [Test] + /*[Test] public void ZipAndUpload() { - //var s3 = new S3Zip(_s3MultipartStreamConfiguration); - //s3.ZipAndUploadFolder(@"c:\temp\test", "zipTest4.zip"); + var s3 = new S3Zip(_s3MultipartStreamConfiguration); + s3.ZipAndUploadFolder(@"c:\temp\test", "zipTest4.zip"); Assert.IsTrue(true); - } + }*/ - [Test] - public void S3StreamTest() + [TestCase(110, 50)] + [TestCase(110, 5)] + [TestCase(30, 50)] + [TestCase(30, 5)] + public void S3StreamTest(int length, int chunkSize) { - Assert.IsTrue(true); + var key = "S3StreamTest.txt"; + var chars = "$%#@!*abcdefghijklmnopqrstuvwxyz1234567890?;:ABCDEFGHIJKLMNOPQRSTUVWXYZ^&".ToCharArray(); + var random = new Random(); + var randomArray = new byte[length * ONE_MB]; + + var oldChunkSize = _s3MultipartStreamConfiguration.ChunckSize; + _s3MultipartStreamConfiguration.ChunckSize = chunkSize * ONE_MB; + + // fill array with random data + for (int i = 0; i < randomArray.Length; i++) + { + randomArray[i] = (byte)chars[random.Next(chars.Length)]; + } + + using (var s3Stream = new S3MultipartStream(key, _s3MultipartStreamConfiguration)) + { + for (int i = 0; i < length; i++) + { + s3Stream.Write(randomArray, i * ONE_MB, ONE_MB); + } + } + + var request = new GetObjectRequest + { + BucketName = _s3MultipartStreamConfiguration.BucketName, + Key = key + }; + + using (var client = new AmazonS3Client(_s3MultipartStreamConfiguration.AccessKey, _s3MultipartStreamConfiguration.SecretKey, _s3MultipartStreamConfiguration.AmazonS3Config)) + { + var buffer = new byte[ONE_MB]; + using (var response = client.GetObject(request)) + { + // Was request successfull? + Assert.IsTrue(response.HttpStatusCode == System.Net.HttpStatusCode.OK); + // Has the correct length? + Assert.IsTrue(response.ContentLength == length * ONE_MB); + + using (var responseStream = response.ResponseStream) + { + int alreadyRead = 0; + for (int i = 0; i < length; i++) + { + int read = responseStream.Read(buffer, 0, buffer.Length); + // check if the data is equal to the previously generated one. + Assert.IsTrue(Enumerable.SequenceEqual(randomArray.Skip(alreadyRead).Take(read), buffer.Take(read))); + alreadyRead += read; + } + } + } + } + + _s3MultipartStreamConfiguration.ChunckSize = oldChunkSize; } } } diff --git a/src/cs-S3Zip.Tests/cs-S3Zip.Tests.csproj b/src/cs-S3Zip.Tests/cs-S3Zip.Tests.csproj index 19cc3c0d7c39ee2c1f5a3965ea1d98bafba67df5..2cfe828b83a8aae8cc8c24ac945b09aa16437566 100644 --- a/src/cs-S3Zip.Tests/cs-S3Zip.Tests.csproj +++ b/src/cs-S3Zip.Tests/cs-S3Zip.Tests.csproj @@ -9,7 +9,7 @@ <ProjectGuid>{6B58EB5E-D857-464B-8174-C17375BAE1CF}</ProjectGuid> <OutputType>Library</OutputType> <AppDesignerFolder>Properties</AppDesignerFolder> - <RootNamespace>cs_S3Zip.Tests</RootNamespace> + <RootNamespace>coscine.cs_S3Zip.Tests</RootNamespace> <AssemblyName>cs-S3Zip.Tests</AssemblyName> <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion> <FileAlignment>512</FileAlignment> diff --git a/src/cs-S3Zip/S3MultipartStream.cs b/src/cs-S3Zip/S3MultipartStream.cs index cfa88b60703cb1b4723390b14770ace8700eb86d..028be4a4c5e397f47628bca03cfb7fda31cfbd03 100644 --- a/src/cs-S3Zip/S3MultipartStream.cs +++ b/src/cs-S3Zip/S3MultipartStream.cs @@ -8,18 +8,18 @@ namespace coscine.cs_S3Zip { public class S3MultipartStream : Stream { - private MemoryStream _internalStream; + private readonly Stream _internalStream; private readonly InitiateMultipartUploadResponse _initiateMultipartUploadResponse; private readonly List<UploadPartResponse> _uploadPartResponses; private int _part; private int _length; private int _position; - public S3MultipartStream(string key, S3MultipartStreamConfiguration s3MultipartStreamConfiguration) + public S3MultipartStream(string key, S3MultipartStreamConfiguration s3MultipartStreamConfiguration, Stream internalStream) { S3MultipartStreamConfiguration = s3MultipartStreamConfiguration; - _internalStream = new MemoryStream(S3MultipartStreamConfiguration.ChunckSize); + _internalStream = internalStream; _uploadPartResponses = new List<UploadPartResponse>(); _part = 0; _length = 0; @@ -39,6 +39,11 @@ namespace coscine.cs_S3Zip } } + public S3MultipartStream(string key, S3MultipartStreamConfiguration s3MultipartStreamConfiguration) : this(key, s3MultipartStreamConfiguration, new MemoryStream(s3MultipartStreamConfiguration.ChunckSize)) + { + + } + public string Key { get; } public S3MultipartStreamConfiguration S3MultipartStreamConfiguration { get; set; } @@ -115,8 +120,8 @@ namespace coscine.cs_S3Zip InputStream = _internalStream }; - _part++; _uploadPartResponses.Add(client.UploadPart(uploadPartRequest)); + _part++; } }