- Fix pull consumer fetch: send original stream subject in HMSG (not inbox) so NATS client distinguishes data messages from control messages - Fix MaxAge expiry: add background timer in StreamManager for periodic pruning - Fix JetStream wire format: Go-compatible anonymous objects with string enums, proper offset-based pagination for stream/consumer list APIs - Add 42 E2E black-box tests (core messaging, auth, TLS, accounts, JetStream) - Add ~1000 parity tests across all subsystems (gaps closure) - Update gap inventory docs to reflect implementation status
105 lines
3.6 KiB
C#
105 lines
3.6 KiB
C#
using NATS.Server.Configuration;
|
|
using NATS.Server.Gateways;
|
|
|
|
namespace NATS.Server.Tests.Gateways;
|
|
|
|
public class GatewayReplyAndConfigParityBatch1Tests
|
|
{
|
|
[Fact]
|
|
public void HasGatewayReplyPrefix_accepts_new_and_old_prefixes()
|
|
{
|
|
ReplyMapper.HasGatewayReplyPrefix("_GR_.clusterA.reply").ShouldBeTrue();
|
|
ReplyMapper.HasGatewayReplyPrefix("$GR.clusterA.reply").ShouldBeTrue();
|
|
ReplyMapper.HasGatewayReplyPrefix("_INBOX.reply").ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void IsGatewayRoutedSubject_reports_old_prefix_flag()
|
|
{
|
|
ReplyMapper.IsGatewayRoutedSubject("_GR_.C1.r", out var newPrefixOldFlag).ShouldBeTrue();
|
|
newPrefixOldFlag.ShouldBeFalse();
|
|
|
|
ReplyMapper.IsGatewayRoutedSubject("$GR.C1.r", out var oldPrefixOldFlag).ShouldBeTrue();
|
|
oldPrefixOldFlag.ShouldBeTrue();
|
|
}
|
|
|
|
[Fact]
|
|
public void TryRestoreGatewayReply_handles_old_prefix_format()
|
|
{
|
|
ReplyMapper.TryRestoreGatewayReply("$GR.clusterA.reply.one", out var restored).ShouldBeTrue();
|
|
restored.ShouldBe("reply.one");
|
|
}
|
|
|
|
[Fact]
|
|
public void GatewayHash_helpers_are_deterministic_and_expected_length()
|
|
{
|
|
var hash1 = ReplyMapper.ComputeGatewayHash("east");
|
|
var hash2 = ReplyMapper.ComputeGatewayHash("east");
|
|
var oldHash1 = ReplyMapper.ComputeOldGatewayHash("east");
|
|
var oldHash2 = ReplyMapper.ComputeOldGatewayHash("east");
|
|
|
|
hash1.ShouldBe(hash2);
|
|
oldHash1.ShouldBe(oldHash2);
|
|
hash1.Length.ShouldBe(ReplyMapper.GatewayHashLen);
|
|
oldHash1.Length.ShouldBe(ReplyMapper.OldGatewayHashLen);
|
|
}
|
|
|
|
[Fact]
|
|
public void Legacy_prefixed_reply_extracts_cluster_and_not_hash()
|
|
{
|
|
ReplyMapper.TryExtractClusterId("$GR.clusterB.inbox.reply", out var cluster).ShouldBeTrue();
|
|
cluster.ShouldBe("clusterB");
|
|
ReplyMapper.TryExtractHash("$GR.clusterB.inbox.reply", out _).ShouldBeFalse();
|
|
}
|
|
|
|
[Fact]
|
|
public void RemoteGatewayOptions_clone_deep_copies_url_list()
|
|
{
|
|
var original = new RemoteGatewayOptions
|
|
{
|
|
Name = "gw-west",
|
|
Urls = ["nats://127.0.0.1:7522", "nats://127.0.0.1:7523"],
|
|
};
|
|
|
|
var clone = original.Clone();
|
|
clone.ShouldNotBeSameAs(original);
|
|
clone.Name.ShouldBe(original.Name);
|
|
clone.Urls.ShouldBe(original.Urls);
|
|
|
|
clone.Urls.Add("nats://127.0.0.1:7524");
|
|
original.Urls.Count.ShouldBe(2);
|
|
}
|
|
|
|
[Fact]
|
|
public void ValidateGatewayOptions_checks_required_fields()
|
|
{
|
|
GatewayManager.ValidateGatewayOptions(new GatewayOptions
|
|
{
|
|
Name = "gw",
|
|
Host = "127.0.0.1",
|
|
Port = 7222,
|
|
Remotes = ["127.0.0.1:8222"],
|
|
}, out var error).ShouldBeTrue();
|
|
error.ShouldBeNull();
|
|
|
|
GatewayManager.ValidateGatewayOptions(new GatewayOptions { Port = 7222 }, out error).ShouldBeFalse();
|
|
error.ShouldNotBeNull();
|
|
error.ShouldContain("name");
|
|
|
|
GatewayManager.ValidateGatewayOptions(new GatewayOptions { Name = "gw", Port = -1 }, out error).ShouldBeFalse();
|
|
error.ShouldNotBeNull();
|
|
error.ShouldContain("0-65535");
|
|
|
|
GatewayManager.ValidateGatewayOptions(new GatewayOptions { Name = "gw", Port = 7222, Remotes = [""] }, out error).ShouldBeFalse();
|
|
error.ShouldNotBeNull();
|
|
error.ShouldContain("cannot be empty");
|
|
}
|
|
|
|
[Fact]
|
|
public void Gateway_tls_warning_constant_is_present()
|
|
{
|
|
GatewayManager.GatewayTlsInsecureWarning.ShouldNotBeNullOrWhiteSpace();
|
|
GatewayManager.GatewayTlsInsecureWarning.ShouldContain("TLS");
|
|
}
|
|
}
|