feat: bootstrap suitelink tag client codecs

This commit is contained in:
Joseph Doherty
2026-03-16 14:43:31 -04:00
commit 731bfe2237
30 changed files with 3429 additions and 0 deletions

View File

@@ -0,0 +1,73 @@
using SuiteLink.Client.Protocol;
namespace SuiteLink.Client.Tests.Protocol;
public sealed class SuiteLinkSubscriptionCodecTests
{
[Fact]
public void EncodeAdvise_WritesExpectedGoldenVectorWithCallerTagId()
{
var bytes = SuiteLinkSubscriptionCodec.EncodeAdvise(0x11223344, "A");
var frame = SuiteLinkFrameReader.ParseFrame(bytes);
byte[] expected = [0x0A, 0x00, 0x10, 0x80, 0x44, 0x33, 0x22, 0x11, 0x01, 0x41, 0x00, 0xA5];
Assert.Equal(expected, bytes);
Assert.Equal(0x10, bytes[2]);
Assert.Equal(0x80, bytes[3]);
Assert.Equal(SuiteLinkSubscriptionCodec.AdviseMessageType, frame.MessageType);
Assert.Equal(0x11223344u, SuiteLinkEncoding.ReadUInt32LittleEndian(frame.Payload.Span[..4]));
}
[Fact]
public void EncodeAdviseWithoutTagId_UsesExplicitDefaultTagIdOfZero()
{
var bytes = SuiteLinkSubscriptionCodec.EncodeAdvise("Pump001.Run");
var frame = SuiteLinkFrameReader.ParseFrame(bytes);
Assert.Equal(0u, SuiteLinkEncoding.ReadUInt32LittleEndian(frame.Payload.Span[..4]));
}
[Fact]
public void EncodeUnadvise_WritesExpectedGoldenVector()
{
var bytes = SuiteLinkSubscriptionCodec.EncodeUnadvise(0x78563412);
var frame = SuiteLinkFrameReader.ParseFrame(bytes);
byte[] expected = [0x07, 0x00, 0x04, 0x80, 0x12, 0x34, 0x56, 0x78, 0xA5];
Assert.Equal(expected, bytes);
Assert.Equal(0x04, bytes[2]);
Assert.Equal(0x80, bytes[3]);
Assert.Equal(SuiteLinkSubscriptionCodec.UnadviseMessageType, frame.MessageType);
Assert.Equal(4, frame.Payload.Length);
Assert.Equal(0x78563412u, SuiteLinkEncoding.ReadUInt32LittleEndian(frame.Payload.Span));
}
[Fact]
public void DecodeAdviseAck_ParsesTagIdFromFixedVector()
{
// remaining=0x0008, type=0x0003, payload={tag_id=0x78563412, unknown=0x00}, marker=0xA5
byte[] frame = [0x08, 0x00, 0x03, 0x00, 0x12, 0x34, 0x56, 0x78, 0x00, 0xA5];
var ack = SuiteLinkSubscriptionCodec.DecodeAdviseAck(frame);
Assert.Equal(0x78563412u, ack.TagId);
}
[Fact]
public void DecodeAdviseAckMany_ParsesTwoAckItems()
{
// remaining=0x000D, type=0x0003, payload={item1,item2}, marker=0xA5
byte[] frame =
[
0x0D, 0x00, 0x03, 0x00,
0x12, 0x34, 0x56, 0x78, 0x00,
0xAA, 0xBB, 0xCC, 0xDD, 0x01,
0xA5
];
var acks = SuiteLinkSubscriptionCodec.DecodeAdviseAckMany(frame);
Assert.Equal(2, acks.Count);
Assert.Equal(0x78563412u, acks[0].TagId);
Assert.Equal(0xDDCCBBAAu, acks[1].TagId);
}
}