using Xunit; using XWorld.PublishTool; using XGame.MiniGame; namespace XWorld.PublishTool.Tests { public class ClientServerDigestConsistencyTests { [Fact] public void ClientDigest_Matches_ServerDigest_ForSameFilesTxt() { // 服务端发布侧:构建清单、渲染 files.txt、算 digest(被签名的就是这个 digest) var server = new FilesManifest(); server.Add("RPS.Core.dll.bytes", "aaa111bbb222ccc333ddd444eee555ff", 100); server.Add("RPS.Client.dll.bytes", "11112222333344445555666677778888", 200); server.Add("ui_rps.unity3d", "ffffeeeeddddccccbbbbaaaa99998888", 4096); string filesTxt = server.Render(); string serverDigest = server.Digest(); // 客户端下载侧:拿到同一份 files.txt → LoadFilesList → Digest(验签时重算的就是这个) var client = new MiniGameManifest(); client.LoadFilesList(filesTxt); string clientDigest = client.Digest(); Assert.Equal(serverDigest, clientDigest); // 两端逐字节一致 → 签名可验 Assert.NotEqual("", clientDigest); } [Fact] public void ClientDigest_IsOrderIndependent_LikeServer() { // 不同插入顺序,digest 应相同(两端都按 name Ordinal 排序) var s1 = new FilesManifest(); s1.Add("b", "22", 2); s1.Add("a", "11", 1); var s2 = new FilesManifest(); s2.Add("a", "11", 1); s2.Add("b", "22", 2); var c1 = new MiniGameManifest(); c1.LoadFilesList(s1.Render()); var c2 = new MiniGameManifest(); c2.LoadFilesList(s2.Render()); Assert.Equal(c1.Digest(), c2.Digest()); Assert.Equal(s1.Digest(), c1.Digest()); } } }