def test_answer_pre_vote(loop): m = Machine("node1") m.add_peer("node2") m.add_peer("node3") m.term = 1 # Vote rejected because in same term and obedient m.step(Msg("node2", "node1", Message.PreVote, 1, index=1)) assert m.outbox[-1].type == Message.PreVoteReply assert m.outbox[-1].reject is True # Becomes a PRE_CANDIDATE - no longer obedient m.tick = 0 m.step(Msg("node1", "node1", Message.Tick, 0)) assert m.obedient is False assert m.state == NodeState.PRE_CANDIDATE assert m.term == 1 # In a later term and not obedient m.tick = 0 m.step(Msg("node2", "node1", Message.PreVote, 2, index=1)) assert m.outbox[-1].type == Message.PreVoteReply assert m.outbox[-1].reject is False # Hasn't actually voted so this shouldn't be set assert m.voted_for is None
def test_append_entries_revoke_previous_log_entry(loop): m = Machine("node1") m.add_peer("node2") m.add_peer("node3") m.term = 2 # Recovered from saved log m.log.append((1, {"type": "consensus"})) # Committed when became leader m.log.append((2, {})) m.step( Msg( "node2", "node1", Message.AppendEntries, term=3, prev_index=2, prev_term=3, entries=[], leader_commit=0, )) assert m.log[2] == (2, {}) assert m.outbox[-1].type == Message.AppendEntriesReply assert m.outbox[-1].reject is True m.step( Msg( "node2", "node1", Message.AppendEntries, term=3, prev_index=1, prev_term=1, entries=[(3, {})], leader_commit=0, )) assert m.log[2] == (3, {}) assert m.outbox[-1].type == Message.AppendEntriesReply assert m.outbox[-1].reject is False assert m.outbox[-1].log_index == 2
def test_answer_vote(loop): m = Machine("node1") m.add_peer("node2") m.add_peer("node3") m.term = 1 # Vote rejected because in same term m.step(Msg("node2", "node1", Message.Vote, 1, index=1)) assert m.outbox[-1].type == Message.VoteReply assert m.outbox[-1].reject is True # Vote in new term, but it is still obedient to current leader m.step(Msg("node2", "node1", Message.Vote, 2, index=1)) assert m.outbox[-1].type == Message.VoteReply assert m.outbox[-1].reject is True # Becomes a PRE_CANDIDATE - nog longer obedient m.tick = 0 m.step(Msg("node1", "node1", Message.Tick, 0)) assert m.obedient is False assert m.state == NodeState.PRE_CANDIDATE assert m.term == 1 # Vote in new term, but it is still obedient to current leader m.tick = 0 m.step(Msg("node2", "node1", Message.Vote, 2, index=1)) assert m.term == 2 assert m.outbox[-1].type == Message.VoteReply assert m.outbox[-1].reject is False # Election timer reset after vote assert m.tick > 0 # Pin to node until next reset assert m.voted_for == "node2" # Term should have increased assert m.term == 2