1 package org.opendaylight.controller.cluster.raft.behaviors;
3 import akka.actor.ActorRef;
4 import akka.testkit.JavaTestKit;
6 import org.opendaylight.controller.cluster.raft.AbstractActorTest;
7 import org.opendaylight.controller.cluster.raft.MockRaftActorContext;
8 import org.opendaylight.controller.cluster.raft.RaftActorContext;
9 import org.opendaylight.controller.cluster.raft.RaftState;
10 import org.opendaylight.controller.cluster.raft.messages.AppendEntries;
11 import org.opendaylight.controller.cluster.raft.messages.AppendEntriesReply;
12 import org.opendaylight.controller.cluster.raft.messages.RaftRPC;
13 import org.opendaylight.controller.cluster.raft.messages.RequestVote;
14 import org.opendaylight.controller.cluster.raft.messages.RequestVoteReply;
16 import java.util.concurrent.atomic.AtomicLong;
18 import static org.junit.Assert.assertEquals;
20 public abstract class AbstractRaftActorBehaviorTest extends AbstractActorTest{
22 public void testHandlingOfRaftRPCWithNewerTerm() throws Exception {
23 new JavaTestKit(getSystem()) {{
25 assertStateChangesToFollowerWhenRaftRPCHasNewerTerm(getTestActor(),
26 createAppendEntriesWithNewerTerm());
28 assertStateChangesToFollowerWhenRaftRPCHasNewerTerm(getTestActor(),
29 createAppendEntriesReplyWithNewerTerm());
31 assertStateChangesToFollowerWhenRaftRPCHasNewerTerm(getTestActor(),
32 createRequestVoteWithNewerTerm());
34 assertStateChangesToFollowerWhenRaftRPCHasNewerTerm(getTestActor(),
35 createRequestVoteReplyWithNewerTerm());
42 public void testHandlingOfAppendEntriesWithNewerCommitIndex() throws Exception{
43 new JavaTestKit(getSystem()) {{
45 RaftActorContext context =
48 ((MockRaftActorContext) context).setLastApplied(new AtomicLong(100));
50 AppendEntries appendEntries =
51 new AppendEntries(100, "leader-1", 0, 0, null, 101);
54 createBehavior(context).handleMessage(getRef(), appendEntries);
56 assertEquals(new AtomicLong(101).get(), context.getLastApplied().get());
61 protected void assertStateChangesToFollowerWhenRaftRPCHasNewerTerm(
62 ActorRef actorRef, RaftRPC rpc){
63 RaftState raftState = createBehavior()
64 .handleMessage(actorRef, rpc);
66 assertEquals(RaftState.Follower, raftState);
69 protected abstract RaftActorBehavior createBehavior(RaftActorContext actorContext);
71 protected RaftActorBehavior createBehavior(){
72 return createBehavior(createActorContext());
75 protected RaftActorContext createActorContext(){
76 return new MockRaftActorContext();
79 protected AppendEntries createAppendEntriesWithNewerTerm(){
80 return new AppendEntries(100, "leader-1", 0, 0, null, 1);
83 protected AppendEntriesReply createAppendEntriesReplyWithNewerTerm(){
84 return new AppendEntriesReply(100, false);
87 protected RequestVote createRequestVoteWithNewerTerm(){
88 return new RequestVote(100, "candidate-1", 10, 100);
91 protected RequestVoteReply createRequestVoteReplyWithNewerTerm(){
92 return new RequestVoteReply(100, false);