sharpemu/tests/SharpEmu.Libs.Tests/Gpu/Pipelines/PipelineCacheSignatureTests.cs

72 lines
2.3 KiB
C#

// Copyright (C) 2026 SharpEmu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
using System.Text;
using SharpEmu.Libs.Gpu.Pipelines;
using Xunit;
namespace SharpEmu.Libs.Tests.Gpu.Pipelines;
// A saved driver cache loads only when its signature line and payload hash match.
public sealed class PipelineCacheSignatureTests
{
private static readonly byte[] Uuid = Enumerable.Range(0, PipelineCacheSignature.UuidSize).Select(index => (byte)(index * 17)).ToArray();
private static string Signature(uint driverVersion = 0x00401000) => PipelineCacheSignature.Build(0x1002, 0x73BF, driverVersion, Uuid);
[Fact]
public void Build_NamesTheBuildAndTheDevice()
{
var signature = Signature();
Assert.StartsWith($"SharpEmuPC1:{PipelineCacheSignature.BuildVersion}:00001002:000073bf:00401000:", signature);
Assert.EndsWith("\n", signature);
Assert.Contains(Convert.ToHexString(Uuid).ToLowerInvariant(), signature);
}
[Fact]
public void ValidFile_Loads()
{
var payload = Encoding.ASCII.GetBytes("driver cache bytes");
var file = PipelineCacheSignature.Wrap(Signature(), payload);
Assert.True(PipelineCacheSignature.TryUnwrap(Signature(), file, out var loaded));
Assert.Equal(payload, loaded);
}
[Fact]
public void SignatureMismatch_Invalidates()
{
var file = PipelineCacheSignature.Wrap(Signature(), [1, 2, 3, 4]);
Assert.False(PipelineCacheSignature.TryUnwrap(Signature(driverVersion: 0x00402000), file, out var loaded));
Assert.Empty(loaded);
}
[Fact]
public void HashMismatch_Invalidates()
{
var file = PipelineCacheSignature.Wrap(Signature(), [1, 2, 3, 4]);
file[^1] ^= 0xFF;
Assert.False(PipelineCacheSignature.TryUnwrap(Signature(), file, out _));
}
[Fact]
public void ShortOrEmptyFile_Invalidates()
{
Assert.False(PipelineCacheSignature.TryUnwrap(Signature(), [], out _));
Assert.False(PipelineCacheSignature.TryUnwrap(Signature(), Encoding.ASCII.GetBytes(Signature()), out _));
}
[Fact]
public void EmptyPayload_RoundTrips()
{
var file = PipelineCacheSignature.Wrap(Signature(), []);
Assert.True(PipelineCacheSignature.TryUnwrap(Signature(), file, out var loaded));
Assert.Empty(loaded);
}
}