Files
natsdotnet/tests/NATS.Server.Gateways.Tests/Gateways/GatewayReplyAndConfigParityBatch1Tests.cs
Joseph Doherty 9972b74bc3 refactor: extract NATS.Server.Gateways.Tests project
Move 25 gateway-related test files from NATS.Server.Tests into a
dedicated NATS.Server.Gateways.Tests project. Update namespaces,
replace private ReadUntilAsync with SocketTestHelper from TestUtilities,
inline TestServerFactory usage, add InternalsVisibleTo, and register
the project in the solution file. All 261 tests pass.
2026-03-12 15:10:50 -04:00

105 lines
3.6 KiB
C#

using NATS.Server.Configuration;
using NATS.Server.Gateways;
namespace NATS.Server.Gateways.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");
}
}