mirror of
https://github.com/adamhathcock/sharpcompress.git
synced 2026-04-23 06:29:40 +00:00
185 lines
6.4 KiB
C#
185 lines
6.4 KiB
C#
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;
|
|
using SharpCompress.Test.Mocks;
|
|
using SharpCompress.Writers.GZip;
|
|
using Xunit;
|
|
|
|
namespace SharpCompress.Test.GZip;
|
|
|
|
public class GZipArchiveAsyncTests : ArchiveTests
|
|
{
|
|
public GZipArchiveAsyncTests() => UseExtensionInsteadOfNameToVerify = true;
|
|
|
|
[Fact]
|
|
public async ValueTask GZip_Archive_Generic_Async()
|
|
{
|
|
#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
|
|
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]
|
|
public async ValueTask GZip_Archive_Async()
|
|
{
|
|
#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
|
|
{
|
|
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]
|
|
public async ValueTask GZip_Archive_NoAdd_Async()
|
|
{
|
|
var jpg = Path.Combine(ORIGINAL_FILES_PATH, "jpg", "test.jpg");
|
|
#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
|
|
await using (var archive = await GZipArchive.OpenAsyncArchive(new AsyncOnlyStream(stream)))
|
|
{
|
|
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]
|
|
public async ValueTask GZip_Archive_Multiple_Reads_Async()
|
|
{
|
|
var inputStream = new MemoryStream();
|
|
#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
|
|
{
|
|
await stream.CopyToAsync(inputStream);
|
|
inputStream.Position = 0;
|
|
}
|
|
|
|
await using var archive = await GZipArchive.OpenAsyncArchive(
|
|
new AsyncOnlyStream(inputStream)
|
|
);
|
|
var archiveEntry = await archive.EntriesAsync.FirstAsync();
|
|
|
|
MemoryStream tarStream;
|
|
#if NETFRAMEWORK
|
|
using (var entryStream = await archiveEntry.OpenEntryStreamAsync())
|
|
#else
|
|
await using (var entryStream = await archiveEntry.OpenEntryStreamAsync())
|
|
#endif
|
|
{
|
|
tarStream = new MemoryStream();
|
|
await entryStream.CopyToAsync(tarStream);
|
|
}
|
|
var size = tarStream.Length;
|
|
#if NETFRAMEWORK
|
|
using (var entryStream = await archiveEntry.OpenEntryStreamAsync())
|
|
#else
|
|
await using (var entryStream = await archiveEntry.OpenEntryStreamAsync())
|
|
#endif
|
|
{
|
|
tarStream = new MemoryStream();
|
|
await entryStream.CopyToAsync(tarStream);
|
|
}
|
|
Assert.Equal(size, tarStream.Length);
|
|
#if NETFRAMEWORK
|
|
using (var entryStream = await archiveEntry.OpenEntryStreamAsync())
|
|
#else
|
|
await using (var entryStream = await archiveEntry.OpenEntryStreamAsync())
|
|
#endif
|
|
{
|
|
var result = await TarArchive.IsTarFileAsync(entryStream);
|
|
Assert.True(result);
|
|
}
|
|
Assert.Equal(size, tarStream.Length);
|
|
#if NETFRAMEWORK
|
|
using (var entryStream = await archiveEntry.OpenEntryStreamAsync())
|
|
#else
|
|
await using (var entryStream = await archiveEntry.OpenEntryStreamAsync())
|
|
#endif
|
|
{
|
|
tarStream = new MemoryStream();
|
|
await entryStream.CopyToAsync(tarStream);
|
|
}
|
|
Assert.Equal(size, tarStream.Length);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task TestGzCrcWithMostSignificantBitNotNegative_Async()
|
|
{
|
|
#if NETFRAMEWORK
|
|
using var stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar.gz"));
|
|
#else
|
|
await using var stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar.gz"));
|
|
#endif
|
|
await using var archive = await GZipArchive.OpenAsyncArchive(new AsyncOnlyStream(stream));
|
|
await foreach (var entry in archive.EntriesAsync.Where(entry => !entry.IsDirectory))
|
|
{
|
|
Assert.InRange(entry.Crc, 0L, 0xFFFFFFFFL);
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public async Task TestGzArchiveTypeGzip_Async()
|
|
{
|
|
#if NETFRAMEWORK
|
|
using var stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar.gz"));
|
|
#else
|
|
await using var stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar.gz"));
|
|
#endif
|
|
await using var archive = await GZipArchive.OpenAsyncArchive(new AsyncOnlyStream(stream));
|
|
Assert.Equal(archive.Type, ArchiveType.GZip);
|
|
}
|
|
}
|