Files
sharpcompress/tests/SharpCompress.Test/GZip/GZipArchiveAsyncTests.cs

244 lines
8.5 KiB
C#
Raw Permalink Normal View History

2026-01-18 14:57:01 +00:00
using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using SharpCompress.Archives;
using SharpCompress.Archives.GZip;
using SharpCompress.Archives.Tar;
using SharpCompress.Common;
2026-05-13 11:33:21 +01:00
using SharpCompress.Compressors.Deflate;
using SharpCompress.Readers;
2026-01-13 14:06:14 +00:00
using SharpCompress.Test.Mocks;
using SharpCompress.Writers.GZip;
using Xunit;
namespace SharpCompress.Test.GZip;
public class GZipArchiveAsyncTests : ArchiveTests
{
public GZipArchiveAsyncTests() => UseExtensionInsteadOfNameToVerify = true;
[Fact]
2026-01-08 12:35:12 +00:00
public async ValueTask GZip_Archive_Generic_Async()
{
2026-01-08 16:52:23 +00:00
#if NETFRAMEWORK
using (Stream stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar.gz")))
2026-01-08 16:52:23 +00:00
#else
await using (Stream stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar.gz")))
#endif
await using (var archive = await GZipArchive.OpenAsyncArchive(new AsyncOnlyStream(stream)))
{
2026-01-18 14:57:01 +00:00
var entry = await archive.EntriesAsync.FirstAsync();
await entry.WriteToFileAsync(Path.Combine(SCRATCH_FILES_PATH, entry.Key.NotNull()));
var size = entry.Size;
var scratch = new FileInfo(Path.Combine(SCRATCH_FILES_PATH, "Tar.tar"));
var test = new FileInfo(Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar"));
Assert.Equal(size, scratch.Length);
Assert.Equal(size, test.Length);
}
CompareArchivesByPath(
Path.Combine(SCRATCH_FILES_PATH, "Tar.tar"),
Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar")
);
}
[Fact]
2026-01-08 12:35:12 +00:00
public async ValueTask GZip_Archive_Async()
{
2026-01-08 16:52:23 +00:00
#if NETFRAMEWORK
using (Stream stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar.gz")))
2026-01-08 16:52:23 +00:00
#else
await using (Stream stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar.gz")))
#endif
{
await using (
var archive = await GZipArchive.OpenAsyncArchive(new AsyncOnlyStream(stream))
)
{
var entry = await archive.EntriesAsync.FirstAsync();
await entry.WriteToFileAsync(Path.Combine(SCRATCH_FILES_PATH, entry.Key.NotNull()));
var size = entry.Size;
var scratch = new FileInfo(Path.Combine(SCRATCH_FILES_PATH, "Tar.tar"));
var test = new FileInfo(Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar"));
Assert.Equal(size, scratch.Length);
Assert.Equal(size, test.Length);
}
}
CompareArchivesByPath(
Path.Combine(SCRATCH_FILES_PATH, "Tar.tar"),
Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar")
);
}
[Fact]
2026-01-08 12:35:12 +00:00
public async ValueTask GZip_Archive_NoAdd_Async()
{
var jpg = Path.Combine(ORIGINAL_FILES_PATH, "jpg", "test.jpg");
2026-01-08 16:52:23 +00:00
#if NETFRAMEWORK
using Stream stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar.gz"));
2026-01-08 16:52:23 +00:00
#else
await using Stream stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar.gz"));
#endif
await using (var archive = await GZipArchive.OpenAsyncArchive(new AsyncOnlyStream(stream)))
{
2026-01-18 14:57:01 +00:00
await Assert.ThrowsAsync<NotSupportedException>(async () =>
await archive.AddEntryAsync("jpg\\test.jpg", File.OpenRead(jpg), closeStream: true)
);
await archive.SaveToAsync(
Path.Combine(SCRATCH_FILES_PATH, "Tar.tar.gz"),
new GZipWriterOptions()
);
}
}
[Fact]
2026-01-08 12:35:12 +00:00
public async ValueTask GZip_Archive_Multiple_Reads_Async()
{
var inputStream = new MemoryStream();
2026-01-08 16:52:23 +00:00
#if NETFRAMEWORK
using (Stream stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar.gz")))
#else
await using (Stream stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar.gz")))
#endif
{
2026-01-08 16:52:23 +00:00
await stream.CopyToAsync(inputStream);
inputStream.Position = 0;
}
2026-01-08 16:52:23 +00:00
await using var archive = await GZipArchive.OpenAsyncArchive(
new AsyncOnlyStream(inputStream)
);
2026-01-18 14:57:01 +00:00
var archiveEntry = await archive.EntriesAsync.FirstAsync();
MemoryStream tarStream;
2026-01-08 16:52:23 +00:00
#if NETFRAMEWORK
2026-01-08 16:24:11 +00:00
using (var entryStream = await archiveEntry.OpenEntryStreamAsync())
2026-01-08 16:52:23 +00:00
#else
await using (var entryStream = await archiveEntry.OpenEntryStreamAsync())
#endif
{
tarStream = new MemoryStream();
await entryStream.CopyToAsync(tarStream);
}
var size = tarStream.Length;
2026-01-08 16:52:23 +00:00
#if NETFRAMEWORK
2026-01-08 16:24:11 +00:00
using (var entryStream = await archiveEntry.OpenEntryStreamAsync())
2026-01-08 16:52:23 +00:00
#else
await using (var entryStream = await archiveEntry.OpenEntryStreamAsync())
#endif
{
tarStream = new MemoryStream();
await entryStream.CopyToAsync(tarStream);
}
Assert.Equal(size, tarStream.Length);
2026-01-08 16:52:23 +00:00
#if NETFRAMEWORK
2026-01-08 16:24:11 +00:00
using (var entryStream = await archiveEntry.OpenEntryStreamAsync())
2026-01-08 16:52:23 +00:00
#else
await using (var entryStream = await archiveEntry.OpenEntryStreamAsync())
#endif
{
2026-02-01 09:38:46 +00:00
var result = await TarArchive.IsTarFileAsync(entryStream);
Assert.True(result);
}
Assert.Equal(size, tarStream.Length);
2026-01-08 16:52:23 +00:00
#if NETFRAMEWORK
2026-01-08 16:24:11 +00:00
using (var entryStream = await archiveEntry.OpenEntryStreamAsync())
2026-01-08 16:52:23 +00:00
#else
await using (var entryStream = await archiveEntry.OpenEntryStreamAsync())
#endif
{
tarStream = new MemoryStream();
await entryStream.CopyToAsync(tarStream);
}
Assert.Equal(size, tarStream.Length);
}
[Fact]
2026-01-13 14:24:36 +00:00
public async Task TestGzCrcWithMostSignificantBitNotNegative_Async()
{
2026-01-19 16:08:20 +00:00
#if NETFRAMEWORK
using var stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar.gz"));
#else
2026-01-18 14:57:01 +00:00
await using var stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar.gz"));
2026-01-19 16:08:20 +00:00
#endif
await using var archive = await GZipArchive.OpenAsyncArchive(new AsyncOnlyStream(stream));
2026-01-13 14:24:36 +00:00
await foreach (var entry in archive.EntriesAsync.Where(entry => !entry.IsDirectory))
{
Assert.InRange(entry.Crc, 0L, 0xFFFFFFFFL);
}
}
[Fact]
2026-01-13 14:29:10 +00:00
public async Task TestGzArchiveTypeGzip_Async()
{
2026-01-19 16:08:20 +00:00
#if NETFRAMEWORK
using var stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar.gz"));
2026-05-14 08:48:18 +01:00
#else
2026-01-18 14:57:01 +00:00
await using var stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar.gz"));
2026-01-19 16:08:20 +00:00
#endif
await using var archive = await GZipArchive.OpenAsyncArchive(new AsyncOnlyStream(stream));
Assert.Equal(archive.Type, ArchiveType.GZip);
}
2026-05-13 11:33:21 +01:00
[Fact]
public async ValueTask GZip_Create_New_Async()
{
var scratchPath = Path.Combine(SCRATCH_FILES_PATH, Guid.NewGuid().ToString());
var filePath = Path.Combine(scratchPath, "test.gz");
if (!Directory.Exists(scratchPath))
{
Directory.CreateDirectory(scratchPath);
}
await using (var archive = (GZipArchive)await GZipArchive.CreateAsyncArchive())
{
await archive.AddEntryAsync("Tar.tar", Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar"));
await archive.SaveToAsync(filePath, new GZipWriterOptions(CompressionLevel.BestSpeed));
}
var scratchPath2 = Path.Combine(SCRATCH_FILES_PATH, Guid.NewGuid().ToString());
if (!Directory.Exists(scratchPath2))
{
Directory.CreateDirectory(scratchPath2);
}
2026-05-14 08:46:06 +01:00
#if NETFRAMEWORK
using var fileStream = File.OpenRead(filePath);
#else
await using var fileStream = File.OpenRead(filePath);
2026-05-14 08:46:06 +01:00
#endif
2026-05-13 11:33:21 +01:00
await using var archive2 = await GZipArchive.OpenAsyncArchive(
new AsyncOnlyStream(fileStream)
2026-05-13 11:33:21 +01:00
);
await foreach (var entry in archive2.EntriesAsync)
{
await entry.WriteToDirectoryAsync(scratchPath2);
}
CompareFilesByPath(
Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar"),
Path.Combine(scratchPath2, "Tar.tar")
);
}
[Fact]
public async ValueTask GZip_Async_Dispose_Closes_New_Entry_Stream()
{
var entryStream = new TestStream(new MemoryStream(new byte[] { 1, 2, 3 }));
await using (var archive = await GZipArchive.CreateAsyncArchive())
{
await archive.AddEntryAsync(
"test.bin",
entryStream,
closeStream: true,
size: entryStream.Length
);
await archive.SaveToAsync(new MemoryStream(), new GZipWriterOptions());
}
Assert.True(entryStream.IsDisposed);
}
}