import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import akka.actor.ActorRef;
import akka.actor.Props;
import org.opendaylight.controller.cluster.raft.utils.MessageCollectorActor;
import scala.concurrent.duration.FiniteDuration;
-public class FollowerTest extends AbstractRaftActorBehaviorTest {
+public class FollowerTest extends AbstractRaftActorBehaviorTest<Follower> {
private final TestActorRef<MessageCollectorActor> followerActor = actorFactory.createTestActor(
Props.create(MessageCollectorActor.class), actorFactory.generateActorId("follower"));
private final TestActorRef<MessageCollectorActor> leaderActor = actorFactory.createTestActor(
Props.create(MessageCollectorActor.class), actorFactory.generateActorId("leader"));
- private RaftActorBehavior follower;
+ private Follower follower;
private final short payloadVersion = 5;
}
@Override
- protected RaftActorBehavior createBehavior(RaftActorContext actorContext) {
- return new TestFollower(actorContext);
+ protected Follower createBehavior(RaftActorContext actorContext) {
+ return spy(new Follower(actorContext));
}
@Override
return context;
}
- private static int getElectionTimeoutCount(RaftActorBehavior follower){
- if(follower instanceof TestFollower){
- return ((TestFollower) follower).getElectionTimeoutCount();
- }
- return -1;
- }
-
@Test
public void testThatAnElectionTimeoutIsTriggered(){
MockRaftActorContext actorContext = createActorContext();
public void testHandleRequestVoteWhenSenderTermEqualToCurrentTermAndVotedForIsNull(){
logStart("testHandleRequestVoteWhenSenderTermEqualToCurrentTermAndVotedForIsNull");
- RaftActorContext context = createActorContext();
+ MockRaftActorContext context = createActorContext();
long term = 1000;
context.getTermInformation().update(term, null);
assertEquals("isVoteGranted", true, reply.isVoteGranted());
assertEquals("getTerm", term, reply.getTerm());
- assertEquals("schedule election", 1, getElectionTimeoutCount(follower));
+ verify(follower).scheduleElection(any(FiniteDuration.class));
}
@Test
public void testHandleRequestVoteWhenSenderTermEqualToCurrentTermAndVotedForIsNotTheSameAsCandidateId(){
logStart("testHandleRequestVoteWhenSenderTermEqualToCurrentTermAndVotedForIsNotTheSameAsCandidateId");
- RaftActorContext context = createActorContext();
+ MockRaftActorContext context = createActorContext();
long term = 1000;
context.getTermInformation().update(term, "test");
RequestVoteReply reply = MessageCollectorActor.expectFirstMatching(leaderActor, RequestVoteReply.class);
assertEquals("isVoteGranted", false, reply.isVoteGranted());
- assertEquals("schedule election", 0, getElectionTimeoutCount(follower));
+ verify(follower, never()).scheduleElection(any(FiniteDuration.class));
}
assertEquals("getFollowerId", context.getId(), reply.getFollowerId());
}
- assertNull("Expected null SnapshotTracker", ((Follower) follower).getSnapshotTracker());
+ assertNull("Expected null SnapshotTracker", follower.getSnapshotTracker());
}
int lastIncludedIndex = 1;
// Check that snapshot installation is not in progress
- assertNull(((Follower) follower).getSnapshotTracker());
+ assertNull(follower.getSnapshotTracker());
// Make sure that we have more than 1 chunk to send
assertTrue(totalChunks > 1);
chunkData, 1, totalChunks));
// Check if snapshot installation is in progress now
- assertNotNull(((Follower) follower).getSnapshotTracker());
+ assertNotNull(follower.getSnapshotTracker());
// Send an append entry
AppendEntries appendEntries = mock(AppendEntries.class);
assertEquals("getTerm", 1, reply.getTerm());
assertEquals("getFollowerId", context.getId(), reply.getFollowerId());
- assertNull("Expected null SnapshotTracker", ((Follower) follower).getSnapshotTracker());
+ assertNull("Expected null SnapshotTracker", follower.getSnapshotTracker());
}
@Test
return 100;
}
});
- assertEquals("schedule election", 1, getElectionTimeoutCount(follower));
+ verify(follower).scheduleElection(any(FiniteDuration.class));
}
@Test
MockRaftActorContext context = createActorContext();
follower = createBehavior(context);
follower.handleMessage(leaderActor, "non-raft-rpc");
- assertEquals("schedule election", 0, getElectionTimeoutCount(follower));
+ verify(follower, never()).scheduleElection(any(FiniteDuration.class));
}
public byte[] getNextChunk (ByteString bs, int offset, int chunkSize){
}
@Override
- protected void assertStateChangesToFollowerWhenRaftRPCHasNewerTerm(RaftActorContext actorContext,
+ protected void assertStateChangesToFollowerWhenRaftRPCHasNewerTerm(MockRaftActorContext actorContext,
ActorRef actorRef, RaftRPC rpc) throws Exception {
super.assertStateChangesToFollowerWhenRaftRPCHasNewerTerm(actorContext, actorRef, rpc);
- String expVotedFor = RequestVote.class.isInstance(rpc) ? ((RequestVote)rpc).getCandidateId() : null;
+ String expVotedFor = rpc instanceof RequestVote ? ((RequestVote)rpc).getCandidateId() : null;
assertEquals("New votedFor", expVotedFor, actorContext.getTermInformation().getVotedFor());
}
@Override
- protected void handleAppendEntriesAddSameEntryToLogReply(TestActorRef<MessageCollectorActor> replyActor)
+ protected void handleAppendEntriesAddSameEntryToLogReply(final TestActorRef<MessageCollectorActor> replyActor)
throws Exception {
AppendEntriesReply reply = MessageCollectorActor.expectFirstMatching(replyActor, AppendEntriesReply.class);
assertEquals("isSuccess", true, reply.isSuccess());
}
-
- private static class TestFollower extends Follower {
-
- int electionTimeoutCount = 0;
-
- public TestFollower(RaftActorContext context) {
- super(context);
- }
-
- @Override
- protected void scheduleElection(FiniteDuration interval) {
- electionTimeoutCount++;
- super.scheduleElection(interval);
- }
-
- public int getElectionTimeoutCount() {
- return electionTimeoutCount;
- }
- }
}