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.
105 lines
3.6 KiB
C#
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");
|
|
}
|
|
}
|