54 lines
2.0 KiB
C#
54 lines
2.0 KiB
C#
using System.IO.Compression;
|
|
using Ludarium.Infrastructure;
|
|
|
|
namespace Ludarium.IntegrationTests;
|
|
|
|
public sealed class N64ZipRomTests
|
|
{
|
|
[Theory]
|
|
[InlineData("game.z64", "80371240")]
|
|
[InlineData("game.v64", "37804012")]
|
|
[InlineData("game.n64", "40123780")]
|
|
public async Task SingleBoundedRomWithVerifiedMagicStreamsWithoutExtraction(string name, string magic)
|
|
{
|
|
await using var archive = Zip((name, Convert.FromHexString(magic + "01020304")));
|
|
|
|
Assert.True(await N64ZipRom.ValidateAsync(archive, CancellationToken.None));
|
|
archive.Position = 0;
|
|
var opened = await N64ZipRom.OpenAsync(archive, CancellationToken.None);
|
|
await using var content = opened.Content;
|
|
var bytes = new byte[8];
|
|
await content.ReadExactlyAsync(bytes);
|
|
|
|
Assert.Equal(name, opened.FileName);
|
|
Assert.Equal(8, opened.Length);
|
|
Assert.Equal(Convert.FromHexString(magic), bytes[..4]);
|
|
Assert.False(content.CanSeek);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task MultipleRomEntriesAndInvalidMagicFailClosed()
|
|
{
|
|
await using var multiple = Zip(("one.z64", Convert.FromHexString("8037124001")),
|
|
("two.v64", Convert.FromHexString("3780401202")));
|
|
await using var invalid = Zip(("game.z64", Convert.FromHexString("0000000001")));
|
|
|
|
Assert.False(await N64ZipRom.ValidateAsync(multiple, CancellationToken.None));
|
|
Assert.False(await N64ZipRom.ValidateAsync(invalid, CancellationToken.None));
|
|
}
|
|
|
|
private static MemoryStream Zip(params (string Name, byte[] Content)[] entries)
|
|
{
|
|
var stream = new MemoryStream();
|
|
using (var archive = new ZipArchive(stream, ZipArchiveMode.Create, leaveOpen: true))
|
|
foreach (var item in entries)
|
|
{
|
|
var entry = archive.CreateEntry(item.Name, CompressionLevel.SmallestSize);
|
|
using var content = entry.Open();
|
|
content.Write(item.Content);
|
|
}
|
|
stream.Position = 0;
|
|
return stream;
|
|
}
|
|
}
|