Пример #1
0
        public async Task WithSelfUsingHttpRangeReader(string path)
        {
            // Arrange
            using (var memoryStream = TestUtility.BufferTestData(path))
                using (var server = TestUtility.GetTestServer(TestUtility.TestDataDirectory))
                    using (var client = server.CreateClient())
                    {
                        var httpZipProvider = new HttpZipProvider(client)
                        {
                            ETagBehavior         = ETagBehavior.Required,
                            FirstBufferSize      = 1,
                            SecondBufferSize     = 1,
                            BufferGrowthExponent = 2,
                        };

                        var requestUri = new Uri(new Uri(server.BaseAddress, TestUtility.TestServerDirectory + "/"), path);
                        using (var bufferedRangeStream = await httpZipProvider.GetStreamAsync(requestUri))
                        {
                            // Act
                            var a = await TestUtility.ReadWithMiniZipAsync(memoryStream);

                            var b = await TestUtility.ReadWithMiniZipAsync(bufferedRangeStream);

                            // Assert
                            TestUtility.VerifyJsonEquals(a.Data, b.Data);
                            Assert.Equal(a.Success, b.Success);
                            Assert.Equal(a.Exception?.Message, b.Exception?.Message);
                            Assert.Equal(a.Exception?.GetType(), b.Exception?.GetType());
                        }
                    }
        }
Пример #2
0
            public async Task UsesETagWhenRequiringAnETag()
            {
                // Arrange
                var fileName = "System.IO.Compression/refzipfiles/normal.zip";

                using (var server = TestUtility.GetTestServer(TestUtility.TestDataDirectory))
                    using (var client = server.CreateClient())
                    {
                        var requestUri = new Uri(new Uri(server.BaseAddress, TestUtility.TestServerDirectory + "/"), fileName);
                        var target     = new HttpZipProvider(client)
                        {
                            ETagBehavior = ETagBehavior.Required
                        };

                        // Act
                        var reader = await target.GetReaderAsync(requestUri);

                        // Assert
                        var actual = await reader.ReadAsync();

                        var expected = await TestUtility.ReadWithMiniZipAsync(TestUtility.BufferTestData(fileName));

                        TestUtility.VerifyJsonEquals(expected.Data, actual);
                    }
            }
Пример #3
0
            public async Task HandlesChangingETagProperly(ETagBehavior etagBehavior, bool success)
            {
                // Arrange
                using (var directory = TestDirectory.Create())
                {
                    var fileName  = "normal.zip";
                    var serverDir = Path.Combine(directory, TestUtility.TestServerDirectory);
                    var filePath  = Path.Combine(serverDir, fileName);
                    Directory.CreateDirectory(Path.GetDirectoryName(filePath));

                    using (var server = TestUtility.GetTestServer(
                               serverDir,
                               etags: true,
                               middleware: async(context, next) =>
                    {
                        await next.Invoke();

                        File.SetLastWriteTimeUtc(filePath, DateTime.UtcNow);
                    }))
                        using (var client = server.CreateClient())
                        {
                            File.Copy(
                                Path.Combine(TestUtility.TestDataDirectory, "System.IO.Compression/refzipfiles/normal.zip"),
                                filePath);
                            var requestUri = new Uri(new Uri(server.BaseAddress, TestUtility.TestServerDirectory + "/"), fileName);
                            var target     = new HttpZipProvider(client)
                            {
                                ETagBehavior = etagBehavior
                            };
                            var reader = await target.GetReaderAsync(requestUri);

                            // Act & Assert
                            if (success)
                            {
                                var actual = await reader.ReadAsync();

                                var expected = await TestUtility.ReadWithMiniZipAsync(TestUtility.BufferTestData(filePath));

                                TestUtility.VerifyJsonEquals(expected.Data, actual);
                            }
                            else
                            {
                                var ex = await Assert.ThrowsAsync <MiniZipHttpException>(() => reader.ReadAsync());

                                Assert.StartsWith(
                                    "The HTTP response did not have the expected status code HTTP 206 Partial Content. The response was 412 Precondition Failed.",
                                    ex.Message);
                                Assert.Equal(HttpStatusCode.PreconditionFailed, ex.StatusCode);
                                Assert.Equal("Precondition Failed", ex.ReasonPhrase);
                                Assert.StartsWith("HTTP/", ex.DebugResponse);
                            }
                        }
                }
            }
Пример #4
0
            public ReadAsync()
            {
                _directory = TestDirectory.Create();
                _fileName  = "test.dat";
                _content   = Enumerable.Range(0, 100).Select(x => (byte)x).ToArray();
                File.WriteAllBytes(Path.Combine(_directory, _fileName), _content);

                _server     = TestUtility.GetTestServer(_directory);
                _client     = _server.CreateClient();
                _requestUri = new Uri(new Uri(_server.BaseAddress, TestUtility.TestServerDirectory + "/"), _fileName);

                _outputBuffer = new byte[_content.Length];

                _target = new HttpRangeReader(_client, _requestUri, _content.Length, etag: null);
            }
Пример #5
0
            public async Task RejectsChangedLength()
            {
                // Arrange
                using (var directory = TestDirectory.Create())
                {
                    var fileName  = "empty.zip";
                    var serverDir = Path.Combine(directory, TestUtility.TestServerDirectory);
                    var filePath  = Path.Combine(serverDir, fileName);
                    Directory.CreateDirectory(Path.GetDirectoryName(filePath));

                    using (var server = TestUtility.GetTestServer(
                               serverDir,
                               etags: true,
                               middleware: async(context, next) =>
                    {
                        await next.Invoke();

                        File.Delete(filePath);
                        File.Copy(
                            Path.Combine(TestUtility.TestDataDirectory, "System.IO.Compression/refzipfiles/normal.zip"),
                            filePath);
                    }))
                        using (var client = server.CreateClient())
                        {
                            File.Copy(
                                Path.Combine(TestUtility.TestDataDirectory, "System.IO.Compression/refzipfiles/empty.zip"),
                                filePath);
                            var requestUri = new Uri(new Uri(server.BaseAddress, TestUtility.TestServerDirectory + "/"), fileName);
                            var target     = new HttpZipProvider(client)
                            {
                                ETagBehavior = ETagBehavior.Ignore
                            };
                            var reader = await target.GetReaderAsync(requestUri);

                            // Act & Assert
                            var ex = await Assert.ThrowsAsync <MiniZipHttpException>(() => reader.ReadAsync());

                            Assert.StartsWith(
                                "The length of the ZIP file fetched over HTTP changed from the expected 2671162 bytes to 22 bytes.",
                                ex.Message);
                            Assert.Equal(HttpStatusCode.PartialContent, ex.StatusCode);
                            Assert.Equal("Partial Content", ex.ReasonPhrase);
                            Assert.StartsWith("HTTP/", ex.DebugResponse);
                        }
                }
            }
Пример #6
0
            public async Task ReturnsHeadersAsProperties()
            {
                // Arrange
                var fileName = "System.IO.Compression/refzipfiles/normal.zip";

                using (var server = TestUtility.GetTestServer(TestUtility.TestDataDirectory))
                    using (var client = server.CreateClient())
                    {
                        var requestUri = new Uri(new Uri(server.BaseAddress, TestUtility.TestServerDirectory + "/"), fileName);
                        var target     = new HttpZipProvider(client);

                        // Act
                        var reader = await target.GetReaderAsync(requestUri);

                        // Assert
                        Assert.Equal("2671162", Assert.Single(reader.Properties["Content-Length"]));
                        Assert.Equal("application/x-zip-compressed", Assert.Single(reader.Properties["Content-Type"]));
                    }
            }
Пример #7
0
            public async Task FailsWhenRequiredETagIsMissing()
            {
                // Arrange
                var fileName = "System.IO.Compression/refzipfiles/normal.zip";

                using (var server = TestUtility.GetTestServer(TestUtility.TestDataDirectory, etags: false))
                    using (var client = server.CreateClient())
                    {
                        var requestUri = new Uri(new Uri(server.BaseAddress, TestUtility.TestServerDirectory + "/"), fileName);
                        var target     = new HttpZipProvider(client)
                        {
                            ETagBehavior = ETagBehavior.Required
                        };

                        // Act & Assert
                        var ex = await Assert.ThrowsAsync <MiniZipException>(() => target.GetReaderAsync(requestUri));

                        Assert.Equal("An ETag header is required when using ETagBehavior.Required.", ex.Message);
                    }
            }
 public ZipDirectoryReadIsFasterThanZipArchive(ITestOutputHelper output)
 {
     _output = output;
     _server = TestUtility.GetTestServer(TestUtility.TestDataDirectory);
     _client = _server.CreateClient();
 }