public void AppendEntriesReturnsFalseIfPrevEntryTermDoesNotMatch() { // Arrange var message = new AppendEntriesRequest { PreviousLogIndex = 0, PreviousLogTerm = 1 }; var raftNode = Substitute.For <INode>(); raftNode.CurrentState.Returns(NodeState.Follower); var timer = Substitute.For <INodeTimer>(); var appendEntriesPublisher = Substitute.For <IPublishToBuffer <AppendEntriesRequested> >(); var nodePublisher = Substitute.For <IPublishToBuffer <NodeCommandScheduled, NodeCommandResult> >(); var service = new RaftService(appendEntriesPublisher, nodePublisher, timer, raftNode); var raftLog = new NodeLog(); raftLog.SetLogEntry(1, 2L); raftNode.Data.Returns(new NodeData { Log = raftLog }); // Act var response = service.AppendEntries(message); // Assert response.Success.Should().BeFalse( "because node cannot apply log if the term " + "for the leaders previous log index does not match."); }
public void ThrowsErrorIfCommitIndexIsLessThanOne() { // Arrange var raftLog = new NodeLog(); // Act, Assert Assert.Throws <IndexOutOfRangeException>(() => raftLog.SetLogEntry(0, 10)); }
public void CanTruncateLogFromGivenIndex() { // Arrange const int initialCount = 10; const int truncateFromIndex = 5; var nodeLog = new NodeLog(); for (var i = 0; i < initialCount; i++) { nodeLog.SetLogEntry(i + 1, 1); } // Act nodeLog.TruncateLog(truncateFromIndex); // Assert nodeLog[truncateFromIndex].Should().Be(1); for (var i = truncateFromIndex; i < initialCount; i++) { nodeLog[i + 1].Should().NotHaveValue(); } }