mirror of
https://github.com/adamhathcock/sharpcompress.git
synced 2026-07-09 02:26:47 +00:00
add fixes and benchmarks for system providers
This commit is contained in:
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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<IReader> useReader)
|
||||
{
|
||||
@@ -105,15 +93,22 @@ public abstract class ReaderTests : TestBase
|
||||
}
|
||||
}
|
||||
|
||||
protected async Task AssertArchiveAsync<T>(
|
||||
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
|
||||
)
|
||||
)
|
||||
{
|
||||
|
||||
@@ -44,7 +44,7 @@ public class TarReaderAsyncTests : ReaderTests
|
||||
await ReadAsync("Tar.tar.Z", CompressionType.Lzw);
|
||||
|
||||
[Fact]
|
||||
public async ValueTask Tar_Async_Assert() => await AssertArchiveAsync<TarFactory>("Tar.tar");
|
||||
public async ValueTask Tar_Async_Assert() => await AssertArchiveAsync("Tar.tar");
|
||||
|
||||
[Fact]
|
||||
public async ValueTask Tar_BZip2_Reader_Async() =>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user