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.
This commit is contained in:
Joseph Doherty
2026-03-12 15:10:50 -04:00
parent a6be5e11ed
commit 9972b74bc3
29 changed files with 101 additions and 58 deletions

View File

@@ -0,0 +1,104 @@
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");
}
}