Files
UnrealEngine/Engine/Source/Programs/UnrealCloudDDC/Jupiter/Tests/UnitTests/CompactBinaryTests.cs
2025-05-18 13:04:45 +08:00

134 lines
4.8 KiB
C#

// Copyright Epic Games, Inc. All Rights Reserved.
using System.Collections.Generic;
using System.IO;
using System.Linq;
using EpicGames.Core;
using EpicGames.Serialization;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Jupiter.Tests.Unit
{
[TestClass]
public class CompactBinaryTests
{
[TestMethod]
public void BuildObject()
{
byte[] bytes = File.ReadAllBytes("CompactBinaryObjects/build");
CbObject o = new CbObject(bytes);
Assert.AreEqual(new Utf8String("BuildAction"), o.AsField().Name);
List<CbField> buildActionFields = o.ToList();
Assert.AreEqual(3, buildActionFields.Count);
Assert.AreEqual(new Utf8String("Function"), buildActionFields[0].Name);
Assert.AreEqual(new Utf8String("Constants"), buildActionFields[1].Name);
Assert.AreEqual(new Utf8String("Inputs"), buildActionFields[2].Name);
List<CbField> constantsFields = buildActionFields[1].ToList();
Assert.AreEqual(3, constantsFields.Count);
Assert.AreEqual(new Utf8String("TextureBuildSettings"), constantsFields[0].Name);
Assert.AreEqual(new Utf8String("TextureOutputSettings"), constantsFields[1].Name);
Assert.AreEqual(new Utf8String("TextureSource"), constantsFields[2].Name);
List<CbField> inputsFields = buildActionFields[2].ToList();
Assert.AreEqual(1, inputsFields.Count);
Assert.AreEqual(new Utf8String("7587B323422942733DDD048A91709FDE"), inputsFields[0].Name);
Assert.IsTrue(inputsFields[0].IsBinaryAttachment());
Assert.IsTrue(inputsFields[0].IsAttachment());
Assert.IsFalse(inputsFields[0].IsObjectAttachment());
Assert.AreEqual(IoHash.Parse("f855382171a0b1e5a1c653aa6c5121a05cbf4ba0"), inputsFields[0].AsHash());
}
[TestMethod]
public void ReferenceOutput()
{
byte[] bytes = File.ReadAllBytes("CompactBinaryObjects/ReferenceOutput");
CbObject o = new CbObject(bytes);
Assert.AreEqual(new Utf8String("BuildOutput"), o.AsField().Name);
List<CbField> buildActionFields = o.ToList();
Assert.AreEqual(1, buildActionFields.Count);
CbField payloads = buildActionFields[0];
List<CbField> payloadFields = payloads.ToList();
Assert.AreEqual(3, payloadFields.Count);
Assert.AreEqual(IoHash.Parse("5d8a6dc277c968f0d027c98f879c955c1905c293"), payloadFields[0]["RawHash"]!.AsHash());
Assert.AreEqual(IoHash.Parse("313f0d0d334100d83aeb1ee2c42794fd087cb0ae"), payloadFields[1]["RawHash"]!.AsHash());
Assert.AreEqual(IoHash.Parse("c7a03f83c08cdca882110ecf2b5654ee3b09b11e"), payloadFields[2]["RawHash"]!.AsHash());
}
[TestMethod]
public void CompactBinary()
{
byte[] bytes = File.ReadAllBytes("CompactBinaryObjects/compact_binary");
CbObject o = new CbObject(bytes);
Assert.AreEqual(new Utf8String(""), o.AsField().Name);
List<CbField> buildActionFields = o.ToList();
Assert.AreEqual(3, buildActionFields.Count);
CbField payloads = buildActionFields[0];
List<CbField> payloadFields = payloads.ToList();
Assert.AreEqual(2, payloadFields.Count);
Assert.AreEqual("{\"Key\":{\"Bucket\":\"EditorDomainPackage\",\"Hash\":\"37dbaa409ef30ba67f18c8fc2faaf606636cb915\"},\"Meta\":{\"FileSize\":24789},\"Attachments\":[{\"Id\":\"000000000000000000000001\",\"RawHash\":\"da6fc57e4b9f91377c9509ea0ad567bacb3796c5\",\"RawSize\":24789}]}", o.ToJson());
}
[TestMethod]
public void WriteArray()
{
IoHash hash1 = IoHash.Parse("5d8a6dc277c968f0d027c98f879c955c1905c293");
IoHash hash2 = IoHash.Parse("313f0d0d334100d83aeb1ee2c42794fd087cb0ae");
CbWriter writer = new CbWriter();
writer.BeginObject();
writer.BeginUniformArray("needs", CbFieldType.Hash);
writer.WriteHashValue(hash1);
writer.WriteHashValue(hash2);
writer.EndUniformArray();
writer.EndObject();
byte[] objectData = writer.ToByteArray();
CbObject o = new CbObject(objectData);
// the top object has no name
Assert.AreEqual(new Utf8String(""), o.AsField().Name);
List<CbField> fields = o.ToList();
Assert.AreEqual(1, fields.Count);
CbField? needs = o["needs"];
List<CbField> blobList = needs!.AsArray().ToList();
IoHash[] blobs = blobList.Select(field => field!.AsHash()).ToArray();
CollectionAssert.AreEqual(new IoHash[] { hash1, hash2 }, blobs);
}
[TestMethod]
public void WriteObject()
{
IoHash hash1 = IoHash.Parse("5d8a6dc277c968f0d027c98f879c955c1905c293");
CbWriter writer = new CbWriter();
writer.BeginObject();
writer.WriteString("string", "test");
writer.WriteBinaryAttachment("hash", hash1);
writer.EndObject();
byte[] objectData = writer.ToByteArray();
CbObject o = new CbObject(objectData);
// the object has no name and 2 fields
Assert.AreEqual(new Utf8String(""), o.AsField().Name);
List<CbField> fields = o.ToList();
Assert.AreEqual(2, fields.Count);
CbField? stringField = o["string"];
Assert.AreEqual("test", stringField!.AsString());
CbField? hashField = o["hash"];
Assert.AreEqual(hash1, hashField!.AsAttachment());
}
}
}