diff --git a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamEngineTests.cs b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamEngineTests.cs index b804991..26f073f 100644 --- a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamEngineTests.cs +++ b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamEngineTests.cs @@ -6,6 +6,71 @@ namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog; public sealed class JetStreamEngineTests { + [Fact] // T:1716 + public void IsJSONObjectOrArray_ShouldSucceed() + { + var tests = new (string Name, byte[] Data, bool Valid)[] + { + ("empty", [], false), + ("empty_object", "{}"u8.ToArray(), true), + ("empty object, not trimmed", "\t\n\r{ }"u8.ToArray(), true), + ("empty_array", "[]"u8.ToArray(), true), + ("empty array, not trimmed", "\t\n\r[ ]"u8.ToArray(), true), + ("empty_string", "\"\""u8.ToArray(), false), + ("whitespace_only", " "u8.ToArray(), false), + ("object_with_whitespace", "{ }"u8.ToArray(), true), + ("array_with_whitespace", "[ ]"u8.ToArray(), true), + ("string_with_whitespace", " \"text\""u8.ToArray(), false), + ("number", "123"u8.ToArray(), false), + ("boolean_true", "true"u8.ToArray(), false), + ("boolean_false", "false"u8.ToArray(), false), + ("null_value", "null"u8.ToArray(), false), + ("invalid_json", "invalid"u8.ToArray(), false), + }; + + foreach (var test in tests) + { + JetStreamApi.IsJSONObjectOrArray(test.Data).ShouldBe(test.Valid, test.Name); + } + } + + [Fact] // T:1719 + public void JetStreamDelayedAPIResponses_ShouldSucceed() + { + var account = new Account { Name = "ACC" }; + DelayedApiResponse? head = null; + DelayedApiResponse? tail = null; + var now = DateTime.UtcNow; + + var responses = new[] + { + NewDelayed(account, "request2", "response2", now.AddMilliseconds(500)), + NewDelayed(account, "request1", "response1", now.AddMilliseconds(200)), + NewDelayed(account, "request4", "response4", now.AddMilliseconds(800)), + NewDelayed(account, "request3", "response3", now.AddMilliseconds(650)), + }; + + foreach (var response in responses) + JetStreamApi.AddDelayedResponse(ref head, ref tail, response); + + var orderedRequests = new List(); + for (var current = head; current is not null; current = current.Next) + orderedRequests.Add(current.Request); + + orderedRequests.ShouldBe(["request1", "request2", "request3", "request4"]); + } + + private static DelayedApiResponse NewDelayed(Account account, string request, string response, DateTime deadlineUtc) => + new() + { + Account = account, + Subject = "SUB", + Reply = string.Empty, + Request = request, + Response = response, + DeadlineUtc = deadlineUtc, + }; + [Fact] // T:1477 public void JetStreamMaxConsumers_ShouldSucceed() { diff --git a/porting.db b/porting.db index 1e4d39e..7ec2d0e 100644 Binary files a/porting.db and b/porting.db differ