Files
sharpcompress/tests/SharpCompress.AotSmoke/Program.cs
2026-10-02 08:59:29 +01:00

95 lines
2.6 KiB
C#

using System;
using System.IO;
using System.Text;
using System.Threading;
using SharpCompress;
using SharpCompress.Archives;
using SharpCompress.Common;
using SharpCompress.Readers;
using SharpCompress.Writers;
var original = "SharpCompress AOT smoke test";
var client = new SharpCompressClient();
using var archiveStream = new MemoryStream();
using (
var writer = client.OpenWriter(
archiveStream,
ArchiveType.Zip,
new WriterOptions(CompressionType.Deflate) { LeaveStreamOpen = true }
)
)
{
using var entryStream = new MemoryStream(Encoding.UTF8.GetBytes(original));
writer.Write("payload.txt", entryStream, DateTime.UtcNow);
}
archiveStream.Position = 0;
using (var reader = client.OpenReader(archiveStream, ReaderOptions.ForExternalStream))
{
if (!reader.MoveToNextEntry() || reader.Entry.IsDirectory)
{
throw new InvalidOperationException("Expected a file entry.");
}
using var extracted = new MemoryStream();
client.Extractor.ExtractToStream(reader, extracted);
var actual = Encoding.UTF8.GetString(extracted.ToArray());
if (!string.Equals(original, actual, StringComparison.Ordinal))
{
throw new InvalidOperationException("Client reader round-trip content mismatch.");
}
}
archiveStream.Position = 0;
using (var archive = client.OpenArchive(archiveStream, ReaderOptions.ForExternalStream))
{
var entryCount = 0;
foreach (var entry in archive.Entries)
{
if (!entry.IsDirectory)
{
entryCount++;
}
}
if (entryCount != 1)
{
throw new InvalidOperationException("Client archive did not see the expected entry.");
}
}
archiveStream.Position = 0;
var information = await client.Inspector.InspectArchiveAsync(
archiveStream,
cancellationToken: CancellationToken.None
);
if (information?.EntryCount != 1 || !archiveStream.CanRead || archiveStream.Position != 0)
{
throw new InvalidOperationException("Client inspection did not preserve the source.");
}
await using (
var archive = await client.OpenAsyncArchive(
archiveStream,
cancellationToken: CancellationToken.None
)
)
{
await foreach (var entry in archive.EntriesAsync)
{
using var extracted = new MemoryStream();
await client.Extractor.ExtractToStreamAsync(
entry,
extracted,
cancellationToken: CancellationToken.None
);
if (Encoding.UTF8.GetString(extracted.ToArray()) != original)
{
throw new InvalidOperationException("Async client extraction content mismatch.");
}
}
}
Console.WriteLine("SharpCompress AOT smoke test passed.");