From efc0d642b1525ac4b5e1162ce2615f111443715d Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Sat, 28 Feb 2026 11:32:36 -0500 Subject: [PATCH] test(batch7): implement t3 cross-cutting mapped tests --- .../ImplBacklog/ConfigReloaderTests.cs | 51 ++++++++++++++++ .../ImplBacklog/JwtProcessorTests.cs | 37 ++++++++++++ .../ImplBacklog/NatsServerTests.cs | 56 ++++++++++++++++++ porting.db | Bin 6504448 -> 6504448 bytes 4 files changed, 144 insertions(+) diff --git a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConfigReloaderTests.cs b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConfigReloaderTests.cs index b30229a..3d44f78 100644 --- a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConfigReloaderTests.cs +++ b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConfigReloaderTests.cs @@ -1,5 +1,9 @@ +using System.Text; using Shouldly; using ZB.MOM.NatsNet.Server; +using ZB.MOM.NatsNet.Server.Auth; +using ZB.MOM.NatsNet.Server.Internal; +using ZB.MOM.NatsNet.Server.Internal.DataStructures; namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog; @@ -148,4 +152,51 @@ public sealed class ConfigReloaderTests ServerOptions.NoErrOnUnknownFields(false); } } + + [Fact] // T:2774 + public void ConfigReloadAuthDoesNotBreakRouteInterest_ShouldSucceed() + { + var (server, createError) = NatsServer.NewServer(new ServerOptions + { + NoLog = true, + NoSigs = true, + Accounts = [new Account { Name = "A" }], + Users = [new User + { + Username = "u", + Password = "p", + Account = new Account { Name = "A" }, + }], + }); + + createError.ShouldBeNull(); + server.ShouldNotBeNull(); + + try + { + var (account, lookupError) = server!.LookupAccount("A"); + lookupError.ShouldBeNull(); + account.ShouldNotBeNull(); + + account!.Sublist = SubscriptionIndex.NewSublistWithCache(); + var insertError = account.Sublist.Insert(new Subscription + { + Subject = Encoding.ASCII.GetBytes("foo"), + Queue = Encoding.ASCII.GetBytes("bar"), + }); + insertError.ShouldBeNull(); + account.TotalSubs().ShouldBe(1); + + server.ReloadAuthorization(); + + var (updatedAccount, updatedLookupError) = server.LookupAccount("A"); + updatedLookupError.ShouldBeNull(); + updatedAccount.ShouldNotBeNull(); + updatedAccount!.TotalSubs().ShouldBe(1); + } + finally + { + server!.Shutdown(); + } + } } diff --git a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JwtProcessorTests.cs b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JwtProcessorTests.cs index 2c01ea5..445ac50 100644 --- a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JwtProcessorTests.cs +++ b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JwtProcessorTests.cs @@ -1121,6 +1121,43 @@ public sealed class JwtProcessorTests "TestJWTAccountNATSResolverWrongCreds".ShouldNotBeNullOrWhiteSpace(); } + [Fact] // T:1893 + public void DefaultSentinelUser_ShouldSucceed() + { + var options = new ServerOptions(); + var errors = new List(); + var warnings = new List(); + + options.ProcessConfigFileLine("default_sentinel", "bearer.default.sentinel", errors, warnings); + errors.ShouldBeEmpty(); + warnings.ShouldBeEmpty(); + options.DefaultSentinel.ShouldBe("bearer.default.sentinel"); + + options.ProcessConfigFileLine("default_sentinel", 123L, errors, warnings); + errors.Count.ShouldBe(1); + errors[0].Message.ShouldContain("default_sentinel must be a string"); + + var (server, createError) = NatsServer.NewServer(new ServerOptions + { + NoLog = true, + NoSigs = true, + }); + createError.ShouldBeNull(); + server.ShouldNotBeNull(); + + try + { + var reloadOption = new DefaultSentinelReloadOption("updated.sentinel"); + + reloadOption.IsAuthChange().ShouldBeFalse(); + Should.NotThrow(() => reloadOption.Apply(server!)); + } + finally + { + server!.Shutdown(); + } + } + [Fact] // T:1895 public void JWTJetStreamClientsExcludedForMaxConnsUpdate_ShouldSucceed() { diff --git a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/NatsServerTests.cs b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/NatsServerTests.cs index 7f12111..be08e08 100644 --- a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/NatsServerTests.cs +++ b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/NatsServerTests.cs @@ -348,6 +348,62 @@ public sealed class NatsServerTests "TestServerConfigLastLineComments".ShouldNotBeNullOrWhiteSpace(); } + [Fact] // T:2904 + public void ServerClusterAndGatewayNameNoSpace_ShouldSucceed() + { + var serverNameErrors = new List(); + var warnings = new List(); + var parseOptions = new ServerOptions(); + + parseOptions.ProcessConfigFileLine("server_name", "my server", serverNameErrors, warnings); + serverNameErrors.ShouldContain(ServerErrors.ErrServerNameHasSpaces); + + var (serverWithSpacedName, serverNameError) = NatsServer.NewServer(new ServerOptions + { + ServerName = "my server", + }); + serverWithSpacedName.ShouldBeNull(); + serverNameError.ShouldNotBeNull(); + serverNameError.Message.ShouldContain("server name cannot contain spaces"); + + var clusterErrors = new List(); + ServerOptions.ParseCluster( + new Dictionary + { + ["port"] = -1L, + ["name"] = "my cluster", + }, + new ServerOptions(), + clusterErrors, + warnings: null); + clusterErrors.Count.ShouldBeGreaterThanOrEqualTo(1); + clusterErrors[^1].Message.ShouldContain(ServerErrors.ErrClusterNameHasSpaces.Message); + + var (clusterServer, clusterError) = NatsServer.NewServer(new ServerOptions + { + Cluster = new ClusterOpts + { + Name = "my cluster", + Port = -1, + }, + }); + clusterServer.ShouldBeNull(); + clusterError.ShouldBeSameAs(ServerErrors.ErrClusterNameHasSpaces); + + var gatewayErrors = new List(); + ServerOptions.ParseGateway( + new Dictionary + { + ["port"] = -1L, + ["name"] = "my gateway", + }, + new ServerOptions(), + gatewayErrors, + warnings: null); + gatewayErrors.Count.ShouldBe(1); + gatewayErrors[0].Message.ShouldContain(ServerErrors.ErrGatewayNameHasSpaces.Message); + } + [Fact] // T:2905 public void ServerClientURL_ShouldSucceed() { diff --git a/porting.db b/porting.db index 7fbe62b4dee0fd55a39c5b5a9758c73ed03da7f4..8e0e52c7b01a7753ea637c69598c017f9440eb83 100644 GIT binary patch delta 1455 zcmZ|Ne@sojq+?C~Egnz+`A5t6UDI8R6bk`Y{@B_?)*4#gdM+$ifAGg=d(OVk z^S(Rpp1pgIhCY}0dqV$fmU+R`#ls3!X$!Fz{6;r9V zq+8-FR^`6(n{o}zA(~9B<#58~DuPj;(E;8E&O``g8;LM>&#CdTXxAYEdwfPcd=ldd zL!HkEK-_(&6Yj*iTA(DFWx<{}S1Y_6&$8juKb;!9k!@(;aWf58MzbiW^th6>$P;(B zb!~6ojt^c3;auYz$o0Ay3?{JnP@~s{qIsj&J;JGajXTEN1FGcA6!PGU33oPRPPw|xCM3jV*Q3{`{(1TyX54-d<7@E^{I5MyQ z?~KWLJv2H02uek1C>=eDGEgSULfOcNa!@YHL;0uxEk`Sm9~Gh^REz>>B`QIss0^(_ z<){KxqSa^(dJH{|oOUvuK*!jG$w$MNs0>aB#@7QNwfhy zg`P&wpgQy{sz)1919}cMqUTW%ZQ`f;HXCm)vw4L(R1*}39F}M0>+ya zhb@+Og&Eo)@XBe^L8vMmGpQGvXUr~YorAhd<}l1&F&*5zZWhUS7TL;=-!$6^vj_jX z#kQ*s6;UcC`dP`xLqD?PvvcQuX63qgnyZtn zP87XVe~Yc-@7`iThq#;0++%C$M6p!EV}G+3jEM7q5P5Oywieqyq=m_}4Jjj;wj!k_ zQzw!=nL7B4!@{vrP&mU?X6+RXEucBo8Ff;Y?`?1E>iC~MWp}~N;8JFiatoSW)y9W5T*h*i;#EPH0h5tt5wm)g&@@pOS!be zYqc7-CZS>Wi1v=Q&0-x*x~#B*UXTvmG3Qg2&&p6zmI>d|V#9jXjdXulyN4=DJ^8U} zTI{!&qMyP)WPh37M5EsVH*fTNKIW3SfIG)LCv-&+M1@XY@$8_;CxINQzw8N7_jjHp zZ#y&_AHL%0QfU0Lrzx@PnuqVYmfHU^9gPN@iJ}c@yl8{B;wL&*F(-${3VdmFtkM^y zqML3<;&!DE{4fUsFc*T54jGWiZ&zlmAEC%yHJuK96}{536Aftc3V7ck%!K~O@BG`#d%GnqjnbD2pUJ~UT{VwWU3;T?Oz9{_-6nB