Test that we elect a leader on startup

This commit is contained in:
Smaug123
2022-10-25 22:41:22 +01:00
parent 622280fb01
commit 72be3ebec0
6 changed files with 153 additions and 32 deletions

13
Raft.Test/Logger.fs Normal file
View File

@@ -0,0 +1,13 @@
namespace Raft.Test
[<RequireQualifiedAccess>]
module TestLogger =
let make () : (string -> unit) * (unit -> string list) =
let logs = ResizeArray ()
let logLine (s : string) = lock logs (fun () -> logs.Add s)
let freezeLogs () =
lock logs (fun () -> logs |> Seq.toList)
logLine, freezeLogs

View File

@@ -7,6 +7,7 @@
</PropertyGroup>
<ItemGroup>
<Compile Include="Logger.fs" />
<Compile Include="TestServer.fs" />
<Compile Include="TestInMemoryPersistentState.fs" />
</ItemGroup>

View File

@@ -50,7 +50,7 @@ module TestInMemoryPersistentState =
| Some entry ->
(uut :> IPersistentState<_>).TruncateLog truncate
(uut :> IPersistentState<_>).GetLastLogEntry () = Some entry
(uut :> IPersistentState<_>).GetLastLogEntry () = Some (truncate, entry)
&& isPrefix (uut.GetLog ()) oldLog
&& (uut :> IPersistentState<_>).CurrentLogIndex = truncate

View File

@@ -9,17 +9,10 @@ open FsUnitTyped
module TestServer =
[<Test>]
let foo () =
let ``Startup sequence, first fumbling steps`` () =
let cluster = InMemoryCluster.make<int> true 5
let logger, logs =
let logs = ResizeArray ()
let logLine (s : string) = lock logs (fun () -> logs.Add s)
let freezeLogs () =
lock logs (fun () -> logs |> Seq.toList)
logLine, freezeLogs
let logger, logs = TestLogger.make ()
// Candidate 1 asks server 0 to vote for it.
@@ -62,3 +55,19 @@ module TestServer =
|> cluster.SendMessage 0<ServerId>
calls.Value |> shouldEqual 0
[<Test>]
let ``Startup sequence in prod`` () =
let cluster = InMemoryCluster.make<int> false 5
cluster.Servers.[0].TriggerTimeout ()
cluster.Servers.[0].Sync ()
// We sent a message to every other server; process them.
for i in 1..4 do
cluster.Servers.[i].Sync ()
cluster.Servers.[0].State |> shouldEqual ServerStatus.Leader
for i in 1..4 do
cluster.Servers.[i].State |> shouldEqual ServerStatus.Follower