From f0b41384593bdce06ff3a7e03cebec40d329ae4e Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Thu, 26 Feb 2026 19:00:18 -0500 Subject: [PATCH] =?UTF-8?q?feat(p7-02):=20fill=20opts=5Ftest.go=20stubs=20?= =?UTF-8?q?=E2=80=94=20ServerOptionsTests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Write 3 unit tests portable without a running server: - ListenMonitoringDefault (T:2524): SetBaselineOptions propagates Host → HttpHost - GetStorageSize (T:2576): StorageSizeJsonConverter.Parse K/M/G/T suffixes - ClusterNameAndGatewayNameConflict (T:2571): ValidateOptions returns ErrClusterNameConfigConflict Mark 74 opts_test.go stubs deferred: tests require either the NATS conf-format parser (not yet ported), a running server (RunServer/NewServer), or CLI flag-parsing infrastructure (ConfigureOptions). Fix StorageSizeJsonConverter.Parse to return 0 for empty input, matching Go getStorageSize("") == (0, nil). Total unit tests: 638 passing. --- .../Config/NatsJsonConverters.cs | 2 + .../ServerOptionsTests.cs | 51 ++++++++++++++++++ porting.db | Bin 3395584 -> 3395584 bytes reports/current.md | 9 ++-- reports/report_8b63a6f.md | 40 ++++++++++++++ 5 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 reports/report_8b63a6f.md diff --git a/dotnet/src/ZB.MOM.NatsNet.Server/Config/NatsJsonConverters.cs b/dotnet/src/ZB.MOM.NatsNet.Server/Config/NatsJsonConverters.cs index 5bc453a..ccf4fc3 100644 --- a/dotnet/src/ZB.MOM.NatsNet.Server/Config/NatsJsonConverters.cs +++ b/dotnet/src/ZB.MOM.NatsNet.Server/Config/NatsJsonConverters.cs @@ -152,6 +152,8 @@ public sealed class StorageSizeJsonConverter : JsonConverter public static long Parse(string s) { + // Mirrors Go getStorageSize: empty string returns 0 with no error. + if (string.IsNullOrWhiteSpace(s)) return 0; if (long.TryParse(s, out var n)) return n; var m = Pattern.Match(s.Trim()); if (!m.Success) throw new FormatException($"Invalid storage size: \"{s}\""); diff --git a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ServerOptionsTests.cs b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ServerOptionsTests.cs index 85dd93a..f69c188 100644 --- a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ServerOptionsTests.cs +++ b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ServerOptionsTests.cs @@ -3,6 +3,7 @@ using Shouldly; using ZB.MOM.NatsNet.Server; +using ZB.MOM.NatsNet.Server.Config; namespace ZB.MOM.NatsNet.Server.Tests; @@ -330,4 +331,54 @@ public class ServerOptionsTests var r2 = ServerOptions.MergeOptions(null, flagOpts); r2.Port.ShouldBe(5678); } + + /// + /// Mirrors TestListenMonitoringDefault — when Host is set without HTTPHost, + /// SetBaselineOptions should copy Host to HTTPHost. + /// + [Fact] // T:2524 + public void ListenMonitoringDefault_ShouldSetHttpHostToHost() + { + var opts = new ServerOptions { Host = "10.0.1.22" }; + opts.SetBaselineOptions(); + + opts.Host.ShouldBe("10.0.1.22"); + opts.HttpHost.ShouldBe("10.0.1.22"); + opts.Port.ShouldBe(ServerConstants.DefaultPort); + } + + /// + /// Mirrors TestGetStorageSize — StorageSizeJsonConverter.Parse converts K/M/G/T suffixes + /// and returns 0 for empty input; invalid suffixes throw. + /// + [Fact] // T:2576 + public void GetStorageSize_ShouldParseSuffixes() + { + StorageSizeJsonConverter.Parse("1K").ShouldBe(1024L); + StorageSizeJsonConverter.Parse("1M").ShouldBe(1048576L); + StorageSizeJsonConverter.Parse("1G").ShouldBe(1073741824L); + StorageSizeJsonConverter.Parse("1T").ShouldBe(1099511627776L); + StorageSizeJsonConverter.Parse("").ShouldBe(0L); + + Should.Throw(() => StorageSizeJsonConverter.Parse("1L")); + Should.Throw(() => StorageSizeJsonConverter.Parse("TT")); + } + + /// + /// Mirrors TestClusterNameAndGatewayNameConflict — when Cluster.Name != Gateway.Name, + /// ValidateOptions should return ErrClusterNameConfigConflict. + /// + [Fact] // T:2571 + public void ClusterNameAndGatewayNameConflict_ShouldReturnConflictError() + { + var opts = new ServerOptions + { + Cluster = new ClusterOpts { Name = "A", Port = -1 }, + Gateway = new GatewayOpts { Name = "B", Port = -1 }, + }; + + var err = NatsServer.ValidateOptions(opts); + err.ShouldNotBeNull(); + err.ShouldBe(ServerErrors.ErrClusterNameConfigConflict); + } } diff --git a/porting.db b/porting.db index c6654d19ad7e20674c09250304d2f813584d387d..9d457ab19d8800aa97952395e15dd4044f51a21b 100644 GIT binary patch delta 6214 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 Mptt`YyoFo;3*A95ga7~l delta 1311 zcmc(e>u*#=7{+8&C~ejh3RP(L7X! z9!3+;D3pU@D1=n_C;T1uz^m{AJPnUR4nKl>;ZC>(reHN(0iT5nUQDUh^JJ>2dgr%lUrMZVO0{g0 zD$m-eva{nrx|ajyr@G00h1s*Bo2VdEgs4cPVh|PSRAf+b9~EILB2?T@MU;vd6@#hB zq#}!oAymYvu&BtUV(5Fqb{j;JF!F0d+@EcO-R3wYUi-ZZDJqE&gKPSfk%4)E8+7)SuOCrBbfO8xe zfkIq6zwSx))W%4di|UB?Y%`D8rvbB$+262TCle?6g0Jl=zVO(n%H=h<-YfYU z%me{xJezUO?&Rk#+61uSZT1P?^}XE$_^mek4ajG|7U|aR8Rmw7E(Lu7+rPxO&+IVz z^#QF~x$+#m9=Wg!W&xd91YYHxk61e(yI5@9;8l-Wy8$0jX0<`yT4E^x*RHKs z+2}GW%-Tz=OqT4hG4H)(k3?+sclKd!U$K7xnci3gr3xwF`rCb%%@anq5z<~!29&To z2A8lbktpOh=UOu09gkZ%Di@WO*L~v@>m*`DMb-(vX1e77uWmU