public void Write()
        {
            var source = new MemoryStream();
            var stream = new HashingWriteStream(null, source, new SHA256CryptoServiceProvider());

            stream.Write(textBytes, 0, textBytes.Length);
            
            Assert.That(Encoding.UTF8.GetString(source.ToArray()), Is.EqualTo(text));
        }
        public async Task CopyToAsync_Writes()
        {
            var source = new MemoryStream(textBytes);
            var dest = new MemoryStream();
            var stream = new HashingWriteStream(null, dest, new SHA256CryptoServiceProvider());

            await source.CopyToAsync(stream);

            Assert.That(dest.ToArray(), Is.EqualTo(textBytes));
        }
        public void ComputesHash()
        {
            var stream = new HashingWriteStream(null, new MemoryStream(), new SHA256CryptoServiceProvider());

            stream.Write(textBytes, 0, textBytes.Length);
            stream.Close();

            var expectedHash = new SHA256CryptoServiceProvider().ComputeHash(textBytes);

            Assert.That(stream.Hash, Is.EqualTo(expectedHash));
        }
        public async Task CopyToAsync_ComputesHash()
        {
            var source = new MemoryStream(textBytes);
            var dest = new MemoryStream();
            var stream = new HashingWriteStream(null, dest, new SHA256CryptoServiceProvider());

            await source.CopyToAsync(stream);
            stream.Close();

            var expectedHash = new SHA256CryptoServiceProvider().ComputeHash(textBytes);
            Assert.That(stream.Hash, Is.EqualTo(expectedHash));
        }
        public void StreamsContentToRepository()
        {
            var stream = new HashingWriteStream("**no-file**", new MemoryStream(), HashAlgorithm.Create("SHA256"));
            repositoryMock.Setup(r => r.CreateStreamForStagingPackage()).Returns(stream);

            var provider = formatter.CreateStreamProvider();
            var content = new StringContent("content");
            content.Headers.Add("Content-Disposition", @"form-data; name=""package""; filename=""package""");

            var result = provider.GetStream(content, content.Headers);

            Assert.That(result, Is.SameAs(stream));
        }
        public async Task LoadsPackageFromStream()
        {
            const string ContentDisposition = "example";

            var stream = new HashingWriteStream("**no-file**", new MemoryStream(), HashAlgorithm.Create("SHA256"));
            var package = new TestPackage();
            repositoryMock.Setup(r => r.LoadStagedPackage(stream)).Returns(package);

            var provider = formatter.CreateStreamProvider();
            provider.AddStream(ContentDisposition, stream);

            var result = await formatter.ReadFormDataFromStreamAsync(provider);

            Assert.That(result, Is.SameAs(package));
        }
        public async Task DiscardsStreamOnFailure()
        {
            const string ContentDisposition = "example";

            var stream = new HashingWriteStream("**no-file**", new MemoryStream(), HashAlgorithm.Create("SHA256"));
            var exception = new Exception("invalid package");
            repositoryMock.Setup(r => r.LoadStagedPackage(stream)).Throws(exception);

            var provider = formatter.CreateStreamProvider();
            provider.AddStream(ContentDisposition, stream);

            try
            {
                await formatter.ReadFormDataFromStreamAsync(provider);
                Assert.Fail("Expected mock exception to be thrown.");
            }
            catch (Exception ex)
            {
                Assert.That(ex, Is.SameAs(exception));
            }

            repositoryMock.Verify(r => r.DiscardStagedPackage(stream), Times.Once);
        }
        public virtual IFastZipPackage LoadStagedPackage(HashingWriteStream packageStream)
        {
            packageStream.Dispose();

            return FastZipPackage.Open(packageStream.FileLocation, packageStream.Hash);
        }
 public void DiscardStagedPackage(HashingWriteStream packageStream)
 {
     packageStream.Dispose();
     FileSystem.DeleteFile(packageStream.FileLocation);
 }
 public override IFastZipPackage LoadStagedPackage(HashingWriteStream packageStream)
 {
     packageStream.Close();
     return new FastZipPackage
     {
         Id = "Sample",
         Version = new SemanticVersion("1.0"),
         FileLocation = packageStream.FileLocation,
         Hash = packageStream.Hash
     };
 }