using System.Text; using Ludarium.Application; using Ludarium.Domain; namespace Ludarium.UnitTests; public sealed class BrowserGameDataPolicyTests { [Fact] public void VerifiedBindingMatchesOnlyTheExactArtifactRevisionAndCore() { var gameId = Guid.NewGuid(); var artifactId = Guid.NewGuid(); var sha256 = new string('a', 64); var artifact = Artifact(artifactId, version: 4, sha256: sha256); var session = Session(gameId, artifactId, "fceumm"); var sourceId = BrowserGameDataPolicy.EncodeBinding(artifactId, artifact.Version, session.Core, sha256); Assert.True(BrowserGameDataPolicy.Matches(BrowserGameDataPolicy.SourceType, sourceId, session, artifact)); Assert.False(BrowserGameDataPolicy.Matches("ManualUpload", sourceId, session, artifact)); Assert.False(BrowserGameDataPolicy.Matches(BrowserGameDataPolicy.SourceType, "not-base64", session, artifact)); Assert.False(BrowserGameDataPolicy.Matches(BrowserGameDataPolicy.SourceType, sourceId, session with { Core = "mgba" }, artifact)); Assert.False(BrowserGameDataPolicy.Matches(BrowserGameDataPolicy.SourceType, sourceId, session, artifact with { Version = artifact.Version + 1 })); Assert.False(BrowserGameDataPolicy.Matches(BrowserGameDataPolicy.SourceType, sourceId, session, artifact with { Sha256 = new string('b', 64) })); } [Fact] public void RestoreScopeIsFixtureVerifiedAndStableAcrossCoreCasing() { var gameId = Guid.NewGuid(); Assert.True(BrowserGameDataPolicy.SupportsAutomaticRestore("FCEUMM")); Assert.True(BrowserGameDataPolicy.SupportsAutomaticRestore("mgba")); Assert.True(BrowserGameDataPolicy.SupportsAutomaticRestore("gambatte")); Assert.True(BrowserGameDataPolicy.SupportsAutomaticRestore("snes9x")); Assert.True(BrowserGameDataPolicy.SupportsAutomaticRestore("melonds")); Assert.True(BrowserGameDataPolicy.SupportsAutomaticRestore("ppsspp")); Assert.True(BrowserGameDataPolicy.SupportsAutomaticRestore("pcsx_rearmed")); Assert.True(BrowserGameDataPolicy.SupportsAutomaticRestore("n64wasm")); Assert.False(BrowserGameDataPolicy.SupportsAutomaticRestore("mupen64plus_next")); Assert.Equal(BrowserGameDataPolicy.StableEntryId(gameId, "fceumm", GameDataKind.Save), BrowserGameDataPolicy.StableEntryId(gameId, "FCEUMM", GameDataKind.Save)); Assert.NotEqual(BrowserGameDataPolicy.StableEntryId(gameId, "fceumm", GameDataKind.Save), BrowserGameDataPolicy.StableEntryId(gameId, "fceumm", GameDataKind.SaveState)); Assert.Throws(() => BrowserGameDataPolicy.EncodeBinding(Guid.NewGuid(), 1, "mupen64plus_next", null)); } private static Artifact Artifact(Guid id, long version, string sha256) => new(id, Guid.NewGuid(), "roms/nes/synthetic.nes", 16, DateTimeOffset.UnixEpoch, ArtifactState.Present, MediaType.Rom, Confidence.High, null, DateTimeOffset.UnixEpoch, DateTimeOffset.UnixEpoch, "ines", "nes", version, sha256); private static BrowserPlaySession Session(Guid gameId, Guid artifactId, string core) => new(Guid.NewGuid(), gameId, artifactId, PlaySessionState.Ready, "nes", "Ludarium EmulatorJS", core, "/player.html", Convert.ToHexString(Encoding.UTF8.GetBytes("token")), DateTimeOffset.UnixEpoch, DateTimeOffset.UnixEpoch.AddHours(1)); }