From 3501320c6e8c96e309c5bc93b8dcb5b9d9f8e2a1 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Sat, 28 Feb 2026 21:24:18 -0500 Subject: [PATCH] test(batch23): port and verify mapped route tests --- .../NatsServer.Routes.Connections.cs | 24 +++++-- .../RouteHandlerTests.Impltests.cs | 60 ++++++++++++++++++ porting.db | Bin 6737920 -> 6742016 bytes 3 files changed, 79 insertions(+), 5 deletions(-) diff --git a/dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Routes.Connections.cs b/dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Routes.Connections.cs index d72caec..733340c 100644 --- a/dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Routes.Connections.cs +++ b/dotnet/src/ZB.MOM.NatsNet.Server/NatsServer.Routes.Connections.cs @@ -77,16 +77,30 @@ public sealed partial class NatsServer internal Exception? SetRouteInfoHostPortAndIP() { var opts = GetOpts(); - var host = opts.Cluster.Host; - if (string.IsNullOrWhiteSpace(host)) - host = opts.Host; + string host; + int port; + if (!string.IsNullOrWhiteSpace(opts.Cluster.Advertise)) + { + var (advHost, advPort, advErr) = Internal.ServerUtilities.ParseHostPort(opts.Cluster.Advertise, opts.Cluster.Port); + if (advErr != null) + return new InvalidOperationException($"Cluster.Advertise invalid: {opts.Cluster.Advertise}", advErr); + host = advHost; + port = advPort; + } + else + { + host = opts.Cluster.Host; + if (string.IsNullOrWhiteSpace(host)) + host = opts.Host; + port = opts.Cluster.Port; + } _mu.EnterWriteLock(); try { _routeInfo.Host = host; - _routeInfo.Port = opts.Cluster.Port; - _routeInfo.Ip = $"nats-route://{host}:{opts.Cluster.Port}/"; + _routeInfo.Port = port; + _routeInfo.Ip = $"nats-route://{host}:{port}/"; return null; } finally diff --git a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/RouteHandlerTests.Impltests.cs b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/RouteHandlerTests.Impltests.cs index f9354f7..c6e1b09 100644 --- a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/RouteHandlerTests.Impltests.cs +++ b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/RouteHandlerTests.Impltests.cs @@ -1,4 +1,5 @@ using System.IO; +using System.Text; using Shouldly; using ZB.MOM.NatsNet.Server; using ZB.MOM.NatsNet.Server.Internal; @@ -7,6 +8,65 @@ namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog; public sealed partial class RouteHandlerTests { + [Fact] // T:2798 + public void ClusterAdvertiseErrorOnStartup_ShouldSucceed() + { + var options = new ServerOptions(); + options.Cluster.Advertise = "addr:::123"; + var (server, err) = NatsServer.NewServer(options); + err.ShouldBeNull(); + var startErr = server!.StartRouting(); + startErr.ShouldNotBeNull(); + startErr!.Message.ShouldContain("Cluster.Advertise"); + } + + [Fact] // T:2822 + public void TLSRoutesCertificateImplicitAllowPass_ShouldSucceed() + { + var client = new ClientConnection(ClientKind.Router, nc: new MemoryStream()); + client.MatchesPinnedCert(null).ShouldBeTrue(); + } + + [Fact] // T:2823 + public void TLSRoutesCertificateImplicitAllowFail_ShouldSucceed() + { + var client = new ClientConnection(ClientKind.Router, nc: new MemoryStream()); + var pinned = new PinnedCertSet([new string('a', 64)]); + client.MatchesPinnedCert(pinned).ShouldBeFalse(); + } + + [Fact] // T:2844 + public void RouteParseOriginClusterMsgArgs_ShouldSucceed() + { + var c = new ClientConnection(ClientKind.Router) + { + Route = new Route { AccName = "MY_ACCOUNT"u8.ToArray() }, + }; + + var err = c.ProcessRoutedOriginClusterMsgArgs("ORIGIN foo + bar queue1 queue2 12 345\r\n"u8.ToArray()); + err.ShouldBeNull(); + Encoding.ASCII.GetString(c.ParseCtx.Pa.Account!).ShouldBe("ORIGIN"); + Encoding.ASCII.GetString(c.ParseCtx.Pa.Subject!).ShouldBe("foo"); + Encoding.ASCII.GetString(c.ParseCtx.Pa.Reply!).ShouldBe("bar"); + c.ParseCtx.Pa.Queues.ShouldNotBeNull(); + c.ParseCtx.Pa.Queues!.Count.ShouldBe(3); + c.ParseCtx.Pa.Size.ShouldBe(345); + } + + [Fact] // T:2850 + public void RouteCompression_ShouldSucceed() + { + var opts = new ServerOptions(); + opts.Cluster.Compression.Mode = CompressionMode.S2Fast; + var (server, err) = NatsServer.NewServer(opts); + err.ShouldBeNull(); + server.ShouldNotBeNull(); + + var infoProto = server!.GenerateRouteInitialInfoJSON(string.Empty, CompressionMode.S2Fast, 0, GossipMode.Default); + infoProto.Length.ShouldBeGreaterThan(0); + Encoding.ASCII.GetString(infoProto).ShouldContain("\"compression\":\"s2_fast\""); + } + [Fact] // T:2819 public async Task RouteIPResolutionAndRouteToSelf_ShouldSucceed() { diff --git a/porting.db b/porting.db index 3d585863166bba8a79e3efba141fd62886763103..f38970b6d3453425c1ae7c5337bccc41885b1dc8 100644 GIT binary patch delta 4875 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 CNiqEZ delta 3695 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