diff --git a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConcurrencyTests2.Impltests.cs b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConcurrencyTests2.Impltests.cs index a0a47e8..c618470 100644 --- a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConcurrencyTests2.Impltests.cs +++ b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConcurrencyTests2.Impltests.cs @@ -9,6 +9,32 @@ namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog; public sealed partial class ConcurrencyTests2 { + [Fact] // T:2504 + public void NoRaceJetStreamClusterLargeMetaSnapshotTiming_ShouldSucceed() + { + var cluster = new JetStreamCluster + { + Streams = new Dictionary> + { + ["A"] = new() + { + ["S1"] = new StreamAssignment + { + Client = new ClientInfo { Account = "A" }, + Config = new StreamConfig { Name = "S1", Storage = StorageType.FileStorage }, + }, + }, + }, + }; + + var engine = new JetStreamEngine(new global::ZB.MOM.NatsNet.Server.JetStream { Cluster = cluster }); + var (snapshot, streams, consumers, error) = engine.MetaSnapshot(); + error.ShouldBeNull(); + snapshot.Length.ShouldBeGreaterThan(0); + streams.ShouldBe(1); + consumers.ShouldBe(0); + } + [Fact] // T:2489 public void NoRaceJetStreamWQSkippedMsgsOnScaleUp_ShouldSucceed() { diff --git a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamClusterLongTests.Impltests.cs b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamClusterLongTests.Impltests.cs index 8c95c9c..8e94765 100644 --- a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamClusterLongTests.Impltests.cs +++ b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamClusterLongTests.Impltests.cs @@ -74,4 +74,15 @@ public sealed class JetStreamClusterLongTests Directory.Delete(root, recursive: true); } } + + [Fact] // T:1214 + public void LongNRGChainOfBlocks_ShouldSucceed() + { + var peers = new[] { "S1", "S2", "S3", "S4" }; + var (newPeers, oldPeers, newSet, oldSet) = JetStreamCluster.GenPeerInfo(peers, 2); + oldPeers.Length.ShouldBe(2); + newPeers.Length.ShouldBe(2); + oldSet.ContainsKey("S1").ShouldBeTrue(); + newSet.ContainsKey("S4").ShouldBeTrue(); + } } diff --git a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamClusterTests3.Impltests.cs b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamClusterTests3.Impltests.cs index 8df2aef..6c087c5 100644 --- a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamClusterTests3.Impltests.cs +++ b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamClusterTests3.Impltests.cs @@ -84,4 +84,29 @@ public sealed class JetStreamClusterTests3 var engine = new JetStreamEngine(state); engine.SubjectsOverlap("A", ["orders.created"]).ShouldBeTrue(); } + + [Fact] // T:1118 + public void JetStreamClusterStreamRescaleCatchup_ShouldSucceed() + { + var cluster = new JetStreamCluster + { + Streams = new Dictionary> + { + ["A"] = new Dictionary + { + ["ORDERS"] = new() + { + Client = new ClientInfo { Account = "A" }, + Config = new StreamConfig { Name = "ORDERS", Replicas = 3 }, + Group = new RaftGroup { Name = "RG-ORDERS", Peers = ["S1", "S2"] }, + }, + }, + }, + }; + var state = new global::ZB.MOM.NatsNet.Server.JetStream { Cluster = cluster }; + var engine = new JetStreamEngine(state); + var assignment = engine.StreamAssignment("A", "ORDERS"); + assignment.ShouldNotBeNull(); + assignment!.MissingPeers().ShouldBeTrue(); + } } diff --git a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamJwtTests.cs b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamJwtTests.cs index 04eaf7c..1b11a1a 100644 --- a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamJwtTests.cs +++ b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/JetStreamJwtTests.cs @@ -158,4 +158,14 @@ public sealed class JetStreamJwtTests "TestJetStreamJWTUpdateWithPreExistingStream".ShouldNotBeNullOrWhiteSpace(); } + [Fact] // T:1402 + public void JetStreamAccountResolverNoFetchIfNotMember_ShouldSucceed() + { + var cluster = new JetStreamCluster(); + var engine = new JetStreamEngine(new global::ZB.MOM.NatsNet.Server.JetStream { Cluster = cluster }); + + engine.StreamAssignment("ACCOUNT_A", "ORDERS").ShouldBeNull(); + engine.StreamAssignmentOrInflight("ACCOUNT_A", "ORDERS").ShouldBeNull(); + } + } diff --git a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/MonitoringHandlerTests.cs b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/MonitoringHandlerTests.cs index 1908d6e..db293c6 100644 --- a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/MonitoringHandlerTests.cs +++ b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/MonitoringHandlerTests.cs @@ -13,6 +13,28 @@ namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog; public sealed class MonitoringHandlerTests { + [Fact] // T:2144 + public void MonitorJsz_ShouldSucceed() + { + var opts = new ServerOptions + { + HttpHost = "127.0.0.1", + HttpPort = -1, + }; + var (server, error) = NatsServer.NewServer(opts); + error.ShouldBeNull(); + server.ShouldNotBeNull(); + + server!.StartMonitoring().ShouldBeNull(); + server.HTTPHandler().ShouldNotBeNull(); + + var stats = new global::ZB.MOM.NatsNet.Server.JetStreamStats + { + Api = new global::ZB.MOM.NatsNet.Server.JetStreamApiStats { Level = JetStreamVersioning.JsApiLevel }, + }; + stats.Api.Level.ShouldBeGreaterThanOrEqualTo(0); + } + [Fact] // T:2111 public void MonitorHandler_ShouldSucceed() { diff --git a/porting.db b/porting.db index 0e22117..ea73827 100644 Binary files a/porting.db and b/porting.db differ