1 package org.opendaylight.controller.cluster.raft.behaviors;
3 import akka.actor.ActorRef;
4 import akka.actor.Props;
5 import akka.testkit.JavaTestKit;
6 import junit.framework.Assert;
8 import org.opendaylight.controller.cluster.raft.MockRaftActorContext;
9 import org.opendaylight.controller.cluster.raft.RaftActorContext;
10 import org.opendaylight.controller.cluster.raft.RaftState;
11 import org.opendaylight.controller.cluster.raft.internal.messages.ElectionTimeout;
12 import org.opendaylight.controller.cluster.raft.messages.RequestVote;
13 import org.opendaylight.controller.cluster.raft.messages.RequestVoteReply;
14 import org.opendaylight.controller.cluster.raft.utils.DoNothingActor;
16 import static org.junit.Assert.assertEquals;
18 public class FollowerTest extends AbstractRaftActorBehaviorTest {
20 private final ActorRef followerActor = getSystem().actorOf(Props.create(
21 DoNothingActor.class));
24 @Override protected RaftActorBehavior createBehavior(RaftActorContext actorContext) {
25 return new Follower(actorContext);
28 @Override protected RaftActorContext createActorContext() {
29 return new MockRaftActorContext("test", getSystem(), followerActor);
33 public void testThatAnElectionTimeoutIsTriggered(){
34 new JavaTestKit(getSystem()) {{
36 new Within(duration("1 seconds")) {
37 protected void run() {
39 Follower follower = new Follower(createActorContext(getTestActor()));
41 final Boolean out = new ExpectMsg<Boolean>(duration("1 seconds"), "ElectionTimeout") {
42 // do not put code outside this method, will run afterwards
43 protected Boolean match(Object in) {
44 if (in instanceof ElectionTimeout) {
52 assertEquals(true, out);
59 public void testHandleElectionTimeout(){
60 RaftActorContext raftActorContext = createActorContext();
62 new Follower(raftActorContext);
65 follower.handleMessage(followerActor, new ElectionTimeout());
67 Assert.assertEquals(RaftState.Candidate, raftState);
71 public void testHandleRequestVoteWhenSenderTermEqualToCurrentTermAndVotedForIsNull(){
72 new JavaTestKit(getSystem()) {{
74 new Within(duration("1 seconds")) {
75 protected void run() {
77 RaftActorContext context = createActorContext(getTestActor());
79 context.getTermInformation().update(1000, null);
81 RaftActorBehavior follower = createBehavior(context);
83 follower.handleMessage(getTestActor(), new RequestVote(1000, "test", 10000, 999));
85 final Boolean out = new ExpectMsg<Boolean>(duration("1 seconds"), "RequestVoteReply") {
86 // do not put code outside this method, will run afterwards
87 protected Boolean match(Object in) {
88 if (in instanceof RequestVoteReply) {
89 RequestVoteReply reply = (RequestVoteReply) in;
90 return reply.isVoteGranted();
97 assertEquals(true, out);
104 public void testHandleRequestVoteWhenSenderTermEqualToCurrentTermAndVotedForIsNotTheSameAsCandidateId(){
105 new JavaTestKit(getSystem()) {{
107 new Within(duration("1 seconds")) {
108 protected void run() {
110 RaftActorContext context = createActorContext(getTestActor());
112 context.getTermInformation().update(1000, "test");
114 RaftActorBehavior follower = createBehavior(context);
116 follower.handleMessage(getTestActor(), new RequestVote(1000, "candidate", 10000, 999));
118 final Boolean out = new ExpectMsg<Boolean>(duration("1 seconds"), "RequestVoteReply") {
119 // do not put code outside this method, will run afterwards
120 protected Boolean match(Object in) {
121 if (in instanceof RequestVoteReply) {
122 RequestVoteReply reply = (RequestVoteReply) in;
123 return reply.isVoteGranted();
130 assertEquals(false, out);