From 19ed4d16db66fbedea888318f398ab42416a708d Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Tue, 10 Feb 2026 16:15:31 +0000 Subject: [PATCH] add fixes and benchmarks for system providers --- .../Benchmarks/TarBenchmarks.cs | 38 +++++++++++++++++++ .../Benchmarks/ZipBenchmarks.cs | 38 +++++++++++++++++++ .../CompressionProviderTests.cs | 1 + tests/SharpCompress.Test/ReaderTests.cs | 36 ++++++++---------- .../Tar/TarReaderAsyncTests.cs | 2 +- tests/SharpCompress.Test/WriterTests.cs | 3 +- 6 files changed, 96 insertions(+), 22 deletions(-) diff --git a/tests/SharpCompress.Performance/Benchmarks/TarBenchmarks.cs b/tests/SharpCompress.Performance/Benchmarks/TarBenchmarks.cs index 39d1d97d..c08b90eb 100644 --- a/tests/SharpCompress.Performance/Benchmarks/TarBenchmarks.cs +++ b/tests/SharpCompress.Performance/Benchmarks/TarBenchmarks.cs @@ -4,6 +4,8 @@ using System.Linq; using BenchmarkDotNet.Attributes; using SharpCompress.Archives.Tar; using SharpCompress.Common; +using SharpCompress.Compressors; +using SharpCompress.Compressors.Providers; using SharpCompress.Readers; using SharpCompress.Writers; @@ -48,6 +50,42 @@ public class TarBenchmarks : ArchiveBenchmarkBase } } + [Benchmark(Description = "Tar: Extract all entries (Archive API) - SystemGzip")] + public void SystemTarExtractArchiveApi() + { + using var stream = new MemoryStream(_tarBytes); + using var archive = TarArchive.OpenArchive( + stream, + new ReaderOptions().WithProviders( + CompressionProviderRegistry.Default.With(new SystemGZipCompressionProvider()) + ) + ); + foreach (var entry in archive.Entries.Where(e => !e.IsDirectory)) + { + using var entryStream = entry.OpenEntryStream(); + entryStream.CopyTo(Stream.Null); + } + } + + [Benchmark(Description = "Tar: Extract all entries (Reader API) - SystemGzip")] + public void SystemTarExtractReaderApi() + { + using var stream = new MemoryStream(_tarBytes); + using var reader = ReaderFactory.OpenReader( + stream, + new ReaderOptions().WithProviders( + CompressionProviderRegistry.Default.With(new SystemGZipCompressionProvider()) + ) + ); + while (reader.MoveToNextEntry()) + { + if (!reader.Entry.IsDirectory) + { + reader.WriteEntryTo(Stream.Null); + } + } + } + [Benchmark(Description = "Tar.GZip: Extract all entries")] public void TarGzipExtract() { diff --git a/tests/SharpCompress.Performance/Benchmarks/ZipBenchmarks.cs b/tests/SharpCompress.Performance/Benchmarks/ZipBenchmarks.cs index 00e58a0e..9bdb81ca 100644 --- a/tests/SharpCompress.Performance/Benchmarks/ZipBenchmarks.cs +++ b/tests/SharpCompress.Performance/Benchmarks/ZipBenchmarks.cs @@ -4,6 +4,8 @@ using System.Linq; using BenchmarkDotNet.Attributes; using SharpCompress.Archives.Zip; using SharpCompress.Common; +using SharpCompress.Compressors; +using SharpCompress.Compressors.Providers; using SharpCompress.Readers; using SharpCompress.Writers; @@ -22,6 +24,23 @@ public class ZipBenchmarks : ArchiveBenchmarkBase _archiveBytes = File.ReadAllBytes(_archivePath); } + [Benchmark(Description = "System Zip: Extract all entries (Archive API)")] + public void SystemZipExtractArchiveApi() + { + using var stream = new MemoryStream(_archiveBytes); + using var archive = ZipArchive.OpenArchive( + stream, + new ReaderOptions().WithProviders( + CompressionProviderRegistry.Default.With(new SystemDeflateCompressionProvider()) + ) + ); + foreach (var entry in archive.Entries.Where(e => !e.IsDirectory)) + { + using var entryStream = entry.OpenEntryStream(); + entryStream.CopyTo(Stream.Null); + } + } + [Benchmark(Description = "Zip: Extract all entries (Archive API)")] public void ZipExtractArchiveApi() { @@ -34,6 +53,25 @@ public class ZipBenchmarks : ArchiveBenchmarkBase } } + [Benchmark(Description = "System Zip: Extract all entries (Reader API)")] + public void SystemZipExtractReaderApi() + { + using var stream = new MemoryStream(_archiveBytes); + using var reader = ReaderFactory.OpenReader( + stream, + new ReaderOptions().WithProviders( + CompressionProviderRegistry.Default.With(new SystemDeflateCompressionProvider()) + ) + ); + while (reader.MoveToNextEntry()) + { + if (!reader.Entry.IsDirectory) + { + reader.WriteEntryTo(Stream.Null); + } + } + } + [Benchmark(Description = "Zip: Extract all entries (Reader API)")] public void ZipExtractReaderApi() { diff --git a/tests/SharpCompress.Test/CompressionProviderTests.cs b/tests/SharpCompress.Test/CompressionProviderTests.cs index 71b1e47b..8ffd0c40 100644 --- a/tests/SharpCompress.Test/CompressionProviderTests.cs +++ b/tests/SharpCompress.Test/CompressionProviderTests.cs @@ -50,6 +50,7 @@ public class CompressionProviderTests // Original should still have the default provider var originalProvider = original.GetProvider(CompressionType.Deflate); + originalProvider.Should().NotBeSameAs(modified); originalProvider.Should().NotBeSameAs(customProvider); } diff --git a/tests/SharpCompress.Test/ReaderTests.cs b/tests/SharpCompress.Test/ReaderTests.cs index 2cc7d86c..56ae3c31 100644 --- a/tests/SharpCompress.Test/ReaderTests.cs +++ b/tests/SharpCompress.Test/ReaderTests.cs @@ -5,12 +5,10 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using AwesomeAssertions; -using SharpCompress.Archives; using SharpCompress.Common; using SharpCompress.Factories; using SharpCompress.IO; using SharpCompress.Readers; -using SharpCompress.Readers.GZip; using SharpCompress.Test.Mocks; using Xunit; @@ -18,19 +16,14 @@ namespace SharpCompress.Test; public abstract class ReaderTests : TestBase { - protected void Read(string testArchive, ReaderOptions? options = null) - { + protected void Read(string testArchive, ReaderOptions? options = null) => ReadCore(testArchive, options, ReadImpl); - } protected void Read( string testArchive, CompressionType expectedCompression, ReaderOptions? options = null - ) - { - ReadCore(testArchive, options, (path, opts) => ReadImpl(path, expectedCompression, opts)); - } + ) => ReadCore(testArchive, options, (path, opts) => ReadImpl(path, expectedCompression, opts)); private void ReadCore( string testArchive, @@ -50,19 +43,14 @@ public abstract class ReaderTests : TestBase VerifyFiles(); } - private void ReadImpl(string testArchive, ReaderOptions options) - { + private void ReadImpl(string testArchive, ReaderOptions options) => ReadImplCore(testArchive, options, UseReader); - } private void ReadImpl( string testArchive, CompressionType expectedCompression, ReaderOptions options - ) - { - ReadImplCore(testArchive, options, r => UseReader(r, expectedCompression)); - } + ) => ReadImplCore(testArchive, options, r => UseReader(r, expectedCompression)); private void ReadImplCore(string testArchive, ReaderOptions options, Action useReader) { @@ -105,15 +93,22 @@ public abstract class ReaderTests : TestBase } } - protected async Task AssertArchiveAsync( + protected async Task AssertArchiveAsync( string testArchive, CancellationToken cancellationToken = default ) - where T : IFactory { testArchive = Path.Combine(TEST_ARCHIVES_PATH, testArchive); var factory = new TarFactory(); - factory.IsArchive(new FileInfo(testArchive).OpenRead()).Should().BeTrue(); + ( + await factory.IsArchiveAsync( + new FileInfo(testArchive).OpenRead(), + null, + cancellationToken + ) + ) + .Should() + .BeTrue(); ( await factory.IsArchiveAsync( new FileInfo(testArchive).OpenRead(), @@ -178,7 +173,8 @@ public abstract class ReaderTests : TestBase await using ( var reader = await ReaderFactory.OpenAsyncReader( new AsyncOnlyStream(testStream), - options + options, + cancellationToken ) ) { diff --git a/tests/SharpCompress.Test/Tar/TarReaderAsyncTests.cs b/tests/SharpCompress.Test/Tar/TarReaderAsyncTests.cs index 87196754..f36edc6b 100644 --- a/tests/SharpCompress.Test/Tar/TarReaderAsyncTests.cs +++ b/tests/SharpCompress.Test/Tar/TarReaderAsyncTests.cs @@ -44,7 +44,7 @@ public class TarReaderAsyncTests : ReaderTests await ReadAsync("Tar.tar.Z", CompressionType.Lzw); [Fact] - public async ValueTask Tar_Async_Assert() => await AssertArchiveAsync("Tar.tar"); + public async ValueTask Tar_Async_Assert() => await AssertArchiveAsync("Tar.tar"); [Fact] public async ValueTask Tar_BZip2_Reader_Async() => diff --git a/tests/SharpCompress.Test/WriterTests.cs b/tests/SharpCompress.Test/WriterTests.cs index 786cc41d..4b66c0d9 100644 --- a/tests/SharpCompress.Test/WriterTests.cs +++ b/tests/SharpCompress.Test/WriterTests.cs @@ -91,7 +91,8 @@ public class WriterTests : TestBase await using var reader = await ReaderFactory.OpenAsyncReader( new AsyncOnlyStream(SharpCompressStream.CreateNonDisposing(stream)), - readerOptions + readerOptions, + cancellationToken ); await reader.WriteAllToDirectoryAsync(SCRATCH_FILES_PATH, cancellationToken); }