diff --git a/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/JetStream/RaftNodeTests.cs b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/JetStream/RaftNodeTests.cs new file mode 100644 index 0000000..d1e7798 --- /dev/null +++ b/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/JetStream/RaftNodeTests.cs @@ -0,0 +1,62 @@ +using Shouldly; + +namespace ZB.MOM.NatsNet.Server.Tests.JetStream; + +public sealed class RaftNodeTests +{ + [Fact] + public void NRGMultipleStopsDontPanic_ShouldSucceed() + { + var raft = InitSingleMemRaftNode(); + + Should.NotThrow(() => + { + for (var i = 0; i < 10; i++) + raft.Stop(); + }); + + raft.State().ShouldBe(RaftState.Closed); + } + + [Fact] + public void NRGKeepRunningOnServerShutdown_ShouldSucceed() + { + var raft = InitSingleMemRaftNode(); + + raft.Run(); + raft.State().ShouldBe(RaftState.Follower); + + raft.Stop(); + raft.WaitForStop(); + + raft.State().ShouldBe(RaftState.Closed); + } + + [Fact] + public void NRGInitSingleMemRaftNodeDefaults_ShouldSucceed() + { + var raft = InitSingleMemRaftNode(); + + raft.ID().ShouldBe("esFhDys3"); + raft.Peers().Count.ShouldBe(1); + raft.Peers()[0].Id.ShouldBe("esFhDys3"); + raft.ClusterSize().ShouldBe(1); + raft.Quorum().ShouldBeTrue(); + } + + private static Raft InitSingleMemRaftNode() + { + return new Raft + { + Id = "esFhDys3", + GroupName = "RG", + Csz = 1, + Qn = 1, + Peers_ = new Dictionary + { + ["esFhDys3"] = new() { Kp = true, Ts = DateTime.UtcNow }, + }, + Quit = System.Threading.Channels.Channel.CreateUnbounded(), + }; + } +} diff --git a/porting.db b/porting.db index fb85e7d..f22041b 100644 Binary files a/porting.db and b/porting.db differ