feat(batch30): implement raft group-a server integration

This commit is contained in:
Joseph Doherty
2026-02-28 20:06:17 -05:00
parent a5b4dd39b1
commit 492030bd4b
6 changed files with 468 additions and 7 deletions

View File

@@ -17,6 +17,7 @@ public sealed class RaftTypesTests
Id = "N1",
GroupName = "RG",
AccName = "ACC",
Server_ = new object(),
StateValue = (int)RaftState.Leader,
LeaderId = "N1",
Csz = 3,

View File

@@ -0,0 +1,66 @@
// Copyright 2012-2026 The NATS Authors
// Licensed under the Apache License, Version 2.0
using Shouldly;
namespace ZB.MOM.NatsNet.Server.Tests.Server;
public sealed class NatsServerRaftTests
{
[Fact]
public void RaftStateString_WhenKnownState_ReturnsExpectedText()
{
RaftState.Follower.String().ShouldBe("FOLLOWER");
RaftState.Candidate.String().ShouldBe("CANDIDATE");
RaftState.Leader.String().ShouldBe("LEADER");
RaftState.Closed.String().ShouldBe("CLOSED");
}
[Fact]
public void RegisterRaftNode_WhenRegisteredAndUnregistered_TracksLookupAndCount()
{
var (server, error) = NatsServer.NewServer(new ServerOptions());
error.ShouldBeNull();
server.ShouldNotBeNull();
var raftNode = new Raft { GroupName = "G1", Id = "N1" };
server!.RegisterRaftNode("G1", raftNode);
server.NumRaftNodes().ShouldBe(1);
server.LookupRaftNode("G1").ShouldBe(raftNode);
server.UnregisterRaftNode("G1");
server.NumRaftNodes().ShouldBe(0);
server.LookupRaftNode("G1").ShouldBeNull();
}
[Fact]
public void BootstrapRaftNode_WhenStoreMissing_CreatesStoreAndPeerState()
{
var (server, error) = NatsServer.NewServer(new ServerOptions());
error.ShouldBeNull();
server.ShouldNotBeNull();
var storeDir = Path.Combine(Path.GetTempPath(), $"raft-bootstrap-{Guid.NewGuid():N}");
var cfg = new RaftConfig
{
Name = "RG",
Store = storeDir,
};
try
{
var bootstrapError = server!.BootstrapRaftNode(cfg, ["ABCDEF12", "ABCDEF34"], allPeersKnown: true);
bootstrapError.ShouldBeNull();
Directory.Exists(storeDir).ShouldBeTrue();
File.Exists(Path.Combine(storeDir, "peerstate.json")).ShouldBeTrue();
}
finally
{
if (Directory.Exists(storeDir))
{
Directory.Delete(storeDir, recursive: true);
}
}
}
}