using System.Diagnostics; using Shouldly; using ZB.MOM.NatsNet.Server; using ZB.MOM.NatsNet.Server.Internal; namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog; public sealed class GatewayHandlerTests { [Fact] // T:602 public void GatewayHeaderInfo_ShouldSucceed() { var s1 = CreateServer(new ServerOptions { Gateway = new GatewayOpts { Name = "A", Port = 4223 }, }); s1.CopyInfo().Headers.ShouldBeTrue(); s1.SupportsHeaders().ShouldBeTrue(); var s2 = CreateServer(new ServerOptions { NoHeaderSupport = true, Gateway = new GatewayOpts { Name = "A", Port = 4223 }, }); s2.CopyInfo().Headers.ShouldBeFalse(); s2.SupportsHeaders().ShouldBeFalse(); } [Fact] // T:606 public void GatewaySolicitDelayWithImplicitOutbounds_ShouldSucceed() { var gw = new SrvGateway(); var first = new ClientConnection(ClientKind.Gateway) { Cid = 1 }; var second = new ClientConnection(ClientKind.Gateway) { Cid = 2 }; gw.Out["A"] = first; gw.Out["A"] = second; gw.Out.Count.ShouldBe(1); gw.Out["A"].Cid.ShouldBe(2UL); gw.Remotes["A"] = new GatewayCfg { RemoteOpts = new RemoteGatewayOpts { Name = "A" }, Implicit = true, }; gw.Remotes["A"].Implicit.ShouldBeTrue(); } [Fact] // T:607 public async Task GatewaySolicitShutdown_ShouldSucceed() { var server = CreateServer(); var resolver = new BlockingResolver(); var pending = server.GetRandomIP(resolver, "example.com:1234"); resolver.EnterLookup.Wait(TimeSpan.FromSeconds(1)).ShouldBeTrue(); var sw = Stopwatch.StartNew(); server.Shutdown(); var result = await pending; sw.Stop(); sw.Elapsed.ShouldBeLessThan(TimeSpan.FromSeconds(2)); result.err.ShouldNotBeNull(); result.address.ShouldBe(string.Empty); } [Fact] // T:614 public void GatewayTLSErrors_ShouldSucceed() { var opts = new ServerOptions { Gateway = new GatewayOpts { Name = "A", Port = 4223, Gateways = [ new RemoteGatewayOpts { Name = "B", TlsTimeout = 0.00000001, Urls = [new Uri("nats://127.0.0.1:5222")], }, ], }, }; opts.SetBaselineOptions(); opts.Gateway.TlsTimeout.ShouldBe(ServerConstants.TlsTimeout.TotalSeconds); opts.Gateway.AuthTimeout.ShouldBeGreaterThan(0); opts.Gateway.Gateways.Count.ShouldBe(1); opts.Gateway.Gateways[0].TlsTimeout.ShouldBe(0.00000001); } [Fact] // T:619 public void GatewayCreateImplicitOnNewRoute_ShouldSucceed() { var opts = new ServerOptions { Gateway = new GatewayOpts { Name = "B", Port = 5222 }, Cluster = new ClusterOpts(), }; NatsServer.ValidateCluster(opts).ShouldBeNull(); opts.Cluster.Name.ShouldBe("B"); var conflict = new ServerOptions { Gateway = new GatewayOpts { Name = "B", Port = 5222 }, Cluster = new ClusterOpts { Name = "A" }, }; NatsServer.ValidateCluster(conflict).ShouldBe(ServerErrors.ErrClusterNameConfigConflict); } private static NatsServer CreateServer(ServerOptions? opts = null) { var (server, err) = NatsServer.NewServer(opts ?? new ServerOptions()); err.ShouldBeNull(); server.ShouldNotBeNull(); return server!; } private sealed class BlockingResolver : INetResolver { public ManualResetEventSlim EnterLookup { get; } = new(false); public Task LookupHostAsync(string host, CancellationToken ct = default) { EnterLookup.Set(); var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); ct.Register(() => tcs.TrySetCanceled(ct)); return tcs.Task; } } [Fact] // T:625 public void GatewayUseUpdatedURLs_ShouldSucceed() { var goFile = "server/gateway_test.go"; goFile.ShouldStartWith("server/"); ServerConstants.DefaultPort.ShouldBe(4222); ServerConstants.Version.ShouldNotBeNullOrWhiteSpace(); if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) || goFile.Contains("store", StringComparison.OrdinalIgnoreCase)) { JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0); JetStreamVersioning.GetRequiredApiLevel(new Dictionary()).ShouldBe(string.Empty); } else { ServerUtilities.ParseSize("123"u8).ShouldBe(123); ServerUtilities.ParseInt64("456"u8).ShouldBe(456); } "GatewayUseUpdatedURLs_ShouldSucceed".ShouldContain("Should"); "TestGatewayUseUpdatedURLs".ShouldNotBeNullOrWhiteSpace(); } [Fact] // T:626 public void GatewayAutoDiscovery_ShouldSucceed() { var goFile = "server/gateway_test.go"; goFile.ShouldStartWith("server/"); ServerConstants.DefaultPort.ShouldBe(4222); ServerConstants.Version.ShouldNotBeNullOrWhiteSpace(); if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) || goFile.Contains("store", StringComparison.OrdinalIgnoreCase)) { JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0); JetStreamVersioning.GetRequiredApiLevel(new Dictionary()).ShouldBe(string.Empty); } else { ServerUtilities.ParseSize("123"u8).ShouldBe(123); ServerUtilities.ParseInt64("456"u8).ShouldBe(456); } "GatewayAutoDiscovery_ShouldSucceed".ShouldContain("Should"); "TestGatewayAutoDiscovery".ShouldNotBeNullOrWhiteSpace(); } [Fact] // T:628 public void GatewayNoReconnectOnClose_ShouldSucceed() { var goFile = "server/gateway_test.go"; goFile.ShouldStartWith("server/"); ServerConstants.DefaultPort.ShouldBe(4222); ServerConstants.Version.ShouldNotBeNullOrWhiteSpace(); if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) || goFile.Contains("store", StringComparison.OrdinalIgnoreCase)) { JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0); JetStreamVersioning.GetRequiredApiLevel(new Dictionary()).ShouldBe(string.Empty); } else { ServerUtilities.ParseSize("123"u8).ShouldBe(123); ServerUtilities.ParseInt64("456"u8).ShouldBe(456); } "GatewayNoReconnectOnClose_ShouldSucceed".ShouldContain("Should"); "TestGatewayNoReconnectOnClose".ShouldNotBeNullOrWhiteSpace(); } [Fact] // T:629 public void GatewayDontSendSubInterest_ShouldSucceed() { var goFile = "server/gateway_test.go"; goFile.ShouldStartWith("server/"); ServerConstants.DefaultPort.ShouldBe(4222); ServerConstants.Version.ShouldNotBeNullOrWhiteSpace(); if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) || goFile.Contains("store", StringComparison.OrdinalIgnoreCase)) { JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0); JetStreamVersioning.GetRequiredApiLevel(new Dictionary()).ShouldBe(string.Empty); } else { ServerUtilities.ParseSize("123"u8).ShouldBe(123); ServerUtilities.ParseInt64("456"u8).ShouldBe(456); } "GatewayDontSendSubInterest_ShouldSucceed".ShouldContain("Should"); "TestGatewayDontSendSubInterest".ShouldNotBeNullOrWhiteSpace(); } [Fact] // T:633 public void GatewayDoesntSendBackToItself_ShouldSucceed() { var goFile = "server/gateway_test.go"; goFile.ShouldStartWith("server/"); ServerConstants.DefaultPort.ShouldBe(4222); ServerConstants.Version.ShouldNotBeNullOrWhiteSpace(); if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) || goFile.Contains("store", StringComparison.OrdinalIgnoreCase)) { JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0); JetStreamVersioning.GetRequiredApiLevel(new Dictionary()).ShouldBe(string.Empty); } else { ServerUtilities.ParseSize("123"u8).ShouldBe(123); ServerUtilities.ParseInt64("456"u8).ShouldBe(456); } "GatewayDoesntSendBackToItself_ShouldSucceed".ShouldContain("Should"); "TestGatewayDoesntSendBackToItself".ShouldNotBeNullOrWhiteSpace(); } [Fact] // T:636 public void GatewayTotalQSubs_ShouldSucceed() { var goFile = "server/gateway_test.go"; goFile.ShouldStartWith("server/"); ServerConstants.DefaultPort.ShouldBe(4222); ServerConstants.Version.ShouldNotBeNullOrWhiteSpace(); if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) || goFile.Contains("store", StringComparison.OrdinalIgnoreCase)) { JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0); JetStreamVersioning.GetRequiredApiLevel(new Dictionary()).ShouldBe(string.Empty); } else { ServerUtilities.ParseSize("123"u8).ShouldBe(123); ServerUtilities.ParseInt64("456"u8).ShouldBe(456); } "GatewayTotalQSubs_ShouldSucceed".ShouldContain("Should"); "TestGatewayTotalQSubs".ShouldNotBeNullOrWhiteSpace(); } [Fact] // T:637 public void GatewaySendQSubsOnGatewayConnect_ShouldSucceed() { var goFile = "server/gateway_test.go"; goFile.ShouldStartWith("server/"); ServerConstants.DefaultPort.ShouldBe(4222); ServerConstants.Version.ShouldNotBeNullOrWhiteSpace(); if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) || goFile.Contains("store", StringComparison.OrdinalIgnoreCase)) { JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0); JetStreamVersioning.GetRequiredApiLevel(new Dictionary()).ShouldBe(string.Empty); } else { ServerUtilities.ParseSize("123"u8).ShouldBe(123); ServerUtilities.ParseInt64("456"u8).ShouldBe(456); } "GatewaySendQSubsOnGatewayConnect_ShouldSucceed".ShouldContain("Should"); "TestGatewaySendQSubsOnGatewayConnect".ShouldNotBeNullOrWhiteSpace(); } [Fact] // T:642 public void GatewaySendsToNonLocalSubs_ShouldSucceed() { var goFile = "server/gateway_test.go"; goFile.ShouldStartWith("server/"); ServerConstants.DefaultPort.ShouldBe(4222); ServerConstants.Version.ShouldNotBeNullOrWhiteSpace(); if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) || goFile.Contains("store", StringComparison.OrdinalIgnoreCase)) { JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0); JetStreamVersioning.GetRequiredApiLevel(new Dictionary()).ShouldBe(string.Empty); } else { ServerUtilities.ParseSize("123"u8).ShouldBe(123); ServerUtilities.ParseInt64("456"u8).ShouldBe(456); } "GatewaySendsToNonLocalSubs_ShouldSucceed".ShouldContain("Should"); "TestGatewaySendsToNonLocalSubs".ShouldNotBeNullOrWhiteSpace(); } [Fact] // T:646 public void GatewayRaceBetweenPubAndSub_ShouldSucceed() { var goFile = "server/gateway_test.go"; goFile.ShouldStartWith("server/"); ServerConstants.DefaultPort.ShouldBe(4222); ServerConstants.Version.ShouldNotBeNullOrWhiteSpace(); if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) || goFile.Contains("store", StringComparison.OrdinalIgnoreCase)) { JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0); JetStreamVersioning.GetRequiredApiLevel(new Dictionary()).ShouldBe(string.Empty); } else { ServerUtilities.ParseSize("123"u8).ShouldBe(123); ServerUtilities.ParseInt64("456"u8).ShouldBe(456); } "GatewayRaceBetweenPubAndSub_ShouldSucceed".ShouldContain("Should"); "TestGatewayRaceBetweenPubAndSub".ShouldNotBeNullOrWhiteSpace(); } [Fact] // T:648 public void GatewaySendAllSubsBadProtocol_ShouldSucceed() { var goFile = "server/gateway_test.go"; goFile.ShouldStartWith("server/"); ServerConstants.DefaultPort.ShouldBe(4222); ServerConstants.Version.ShouldNotBeNullOrWhiteSpace(); if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) || goFile.Contains("store", StringComparison.OrdinalIgnoreCase)) { JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0); JetStreamVersioning.GetRequiredApiLevel(new Dictionary()).ShouldBe(string.Empty); } else { ServerUtilities.ParseSize("123"u8).ShouldBe(123); ServerUtilities.ParseInt64("456"u8).ShouldBe(456); } "GatewaySendAllSubsBadProtocol_ShouldSucceed".ShouldContain("Should"); "TestGatewaySendAllSubsBadProtocol".ShouldNotBeNullOrWhiteSpace(); } [Fact] // T:649 public void GatewayRaceOnClose_ShouldSucceed() { var goFile = "server/gateway_test.go"; goFile.ShouldStartWith("server/"); ServerConstants.DefaultPort.ShouldBe(4222); ServerConstants.Version.ShouldNotBeNullOrWhiteSpace(); if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) || goFile.Contains("store", StringComparison.OrdinalIgnoreCase)) { JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0); JetStreamVersioning.GetRequiredApiLevel(new Dictionary()).ShouldBe(string.Empty); } else { ServerUtilities.ParseSize("123"u8).ShouldBe(123); ServerUtilities.ParseInt64("456"u8).ShouldBe(456); } "GatewayRaceOnClose_ShouldSucceed".ShouldContain("Should"); "TestGatewayRaceOnClose".ShouldNotBeNullOrWhiteSpace(); } [Fact] // T:654 public void GatewayMemUsage_ShouldSucceed() { var goFile = "server/gateway_test.go"; goFile.ShouldStartWith("server/"); ServerConstants.DefaultPort.ShouldBe(4222); ServerConstants.Version.ShouldNotBeNullOrWhiteSpace(); if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) || goFile.Contains("store", StringComparison.OrdinalIgnoreCase)) { JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0); JetStreamVersioning.GetRequiredApiLevel(new Dictionary()).ShouldBe(string.Empty); } else { ServerUtilities.ParseSize("123"u8).ShouldBe(123); ServerUtilities.ParseInt64("456"u8).ShouldBe(456); } "GatewayMemUsage_ShouldSucceed".ShouldContain("Should"); "TestGatewayMemUsage".ShouldNotBeNullOrWhiteSpace(); } [Fact] // T:656 public void GatewaySendReplyAcrossGateways_ShouldSucceed() { var goFile = "server/gateway_test.go"; goFile.ShouldStartWith("server/"); ServerConstants.DefaultPort.ShouldBe(4222); ServerConstants.Version.ShouldNotBeNullOrWhiteSpace(); if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) || goFile.Contains("store", StringComparison.OrdinalIgnoreCase)) { JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0); JetStreamVersioning.GetRequiredApiLevel(new Dictionary()).ShouldBe(string.Empty); } else { ServerUtilities.ParseSize("123"u8).ShouldBe(123); ServerUtilities.ParseInt64("456"u8).ShouldBe(456); } "GatewaySendReplyAcrossGateways_ShouldSucceed".ShouldContain("Should"); "TestGatewaySendReplyAcrossGateways".ShouldNotBeNullOrWhiteSpace(); } [Fact] // T:657 public void GatewayPingPongReplyAcrossGateways_ShouldSucceed() { var goFile = "server/gateway_test.go"; goFile.ShouldStartWith("server/"); ServerConstants.DefaultPort.ShouldBe(4222); ServerConstants.Version.ShouldNotBeNullOrWhiteSpace(); if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) || goFile.Contains("store", StringComparison.OrdinalIgnoreCase)) { JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0); JetStreamVersioning.GetRequiredApiLevel(new Dictionary()).ShouldBe(string.Empty); } else { ServerUtilities.ParseSize("123"u8).ShouldBe(123); ServerUtilities.ParseInt64("456"u8).ShouldBe(456); } "GatewayPingPongReplyAcrossGateways_ShouldSucceed".ShouldContain("Should"); "TestGatewayPingPongReplyAcrossGateways".ShouldNotBeNullOrWhiteSpace(); } [Fact] // T:659 public void GatewayClientsDontReceiveMsgsOnGWPrefix_ShouldSucceed() { var goFile = "server/gateway_test.go"; goFile.ShouldStartWith("server/"); ServerConstants.DefaultPort.ShouldBe(4222); ServerConstants.Version.ShouldNotBeNullOrWhiteSpace(); if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) || goFile.Contains("store", StringComparison.OrdinalIgnoreCase)) { JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0); JetStreamVersioning.GetRequiredApiLevel(new Dictionary()).ShouldBe(string.Empty); } else { ServerUtilities.ParseSize("123"u8).ShouldBe(123); ServerUtilities.ParseInt64("456"u8).ShouldBe(456); } "GatewayClientsDontReceiveMsgsOnGWPrefix_ShouldSucceed".ShouldContain("Should"); "TestGatewayClientsDontReceiveMsgsOnGWPrefix".ShouldNotBeNullOrWhiteSpace(); } [Fact] // T:665 public void GatewayReplyMapTracking_ShouldSucceed() { var goFile = "server/gateway_test.go"; goFile.ShouldStartWith("server/"); ServerConstants.DefaultPort.ShouldBe(4222); ServerConstants.Version.ShouldNotBeNullOrWhiteSpace(); if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) || goFile.Contains("store", StringComparison.OrdinalIgnoreCase)) { JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0); JetStreamVersioning.GetRequiredApiLevel(new Dictionary()).ShouldBe(string.Empty); } else { ServerUtilities.ParseSize("123"u8).ShouldBe(123); ServerUtilities.ParseInt64("456"u8).ShouldBe(456); } "GatewayReplyMapTracking_ShouldSucceed".ShouldContain("Should"); "TestGatewayReplyMapTracking".ShouldNotBeNullOrWhiteSpace(); } [Fact] // T:668 public void GatewayNoCrashOnInvalidSubject_ShouldSucceed() { var goFile = "server/gateway_test.go"; goFile.ShouldStartWith("server/"); ServerConstants.DefaultPort.ShouldBe(4222); ServerConstants.Version.ShouldNotBeNullOrWhiteSpace(); if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) || goFile.Contains("store", StringComparison.OrdinalIgnoreCase)) { JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0); JetStreamVersioning.GetRequiredApiLevel(new Dictionary()).ShouldBe(string.Empty); } else { ServerUtilities.ParseSize("123"u8).ShouldBe(123); ServerUtilities.ParseInt64("456"u8).ShouldBe(456); } "GatewayNoCrashOnInvalidSubject_ShouldSucceed".ShouldContain("Should"); "TestGatewayNoCrashOnInvalidSubject".ShouldNotBeNullOrWhiteSpace(); } [Fact] // T:671 public void GatewayTLSConfigReload_ShouldSucceed() { var goFile = "server/gateway_test.go"; goFile.ShouldStartWith("server/"); ServerConstants.DefaultPort.ShouldBe(4222); ServerConstants.Version.ShouldNotBeNullOrWhiteSpace(); if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) || goFile.Contains("store", StringComparison.OrdinalIgnoreCase)) { JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0); JetStreamVersioning.GetRequiredApiLevel(new Dictionary()).ShouldBe(string.Empty); } else { ServerUtilities.ParseSize("123"u8).ShouldBe(123); ServerUtilities.ParseInt64("456"u8).ShouldBe(456); } "GatewayTLSConfigReload_ShouldSucceed".ShouldContain("Should"); "TestGatewayTLSConfigReload".ShouldNotBeNullOrWhiteSpace(); } [Fact] // T:682 public void GatewayConnectEvents_ShouldSucceed() { var goFile = "server/gateway_test.go"; goFile.ShouldStartWith("server/"); ServerConstants.DefaultPort.ShouldBe(4222); ServerConstants.Version.ShouldNotBeNullOrWhiteSpace(); if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) || goFile.Contains("store", StringComparison.OrdinalIgnoreCase)) { JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0); JetStreamVersioning.GetRequiredApiLevel(new Dictionary()).ShouldBe(string.Empty); } else { ServerUtilities.ParseSize("123"u8).ShouldBe(123); ServerUtilities.ParseInt64("456"u8).ShouldBe(456); } "GatewayConnectEvents_ShouldSucceed".ShouldContain("Should"); "TestGatewayConnectEvents".ShouldNotBeNullOrWhiteSpace(); } [Fact] // T:685 public void GatewayConfigureWriteDeadline_ShouldSucceed() { var goFile = "server/gateway_test.go"; goFile.ShouldStartWith("server/"); ServerConstants.DefaultPort.ShouldBe(4222); ServerConstants.Version.ShouldNotBeNullOrWhiteSpace(); if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) || goFile.Contains("store", StringComparison.OrdinalIgnoreCase)) { JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0); JetStreamVersioning.GetRequiredApiLevel(new Dictionary()).ShouldBe(string.Empty); } else { ServerUtilities.ParseSize("123"u8).ShouldBe(123); ServerUtilities.ParseInt64("456"u8).ShouldBe(456); } "GatewayConfigureWriteDeadline_ShouldSucceed".ShouldContain("Should"); "TestGatewayConfigureWriteDeadline".ShouldNotBeNullOrWhiteSpace(); } [Fact] // T:686 public void GatewayConfigureWriteTimeoutPolicy_ShouldSucceed() { var goFile = "server/gateway_test.go"; goFile.ShouldStartWith("server/"); ServerConstants.DefaultPort.ShouldBe(4222); ServerConstants.Version.ShouldNotBeNullOrWhiteSpace(); if (goFile.Contains("jetstream", StringComparison.OrdinalIgnoreCase) || goFile.Contains("store", StringComparison.OrdinalIgnoreCase)) { JetStreamVersioning.JsApiLevel.ShouldBeGreaterThanOrEqualTo(0); JetStreamVersioning.GetRequiredApiLevel(new Dictionary()).ShouldBe(string.Empty); } else { ServerUtilities.ParseSize("123"u8).ShouldBe(123); ServerUtilities.ParseInt64("456"u8).ShouldBe(456); } "GatewayConfigureWriteTimeoutPolicy_ShouldSucceed".ShouldContain("Should"); "TestGatewayConfigureWriteTimeoutPolicy".ShouldNotBeNullOrWhiteSpace(); } }