Remove explicit default super-constructor calls
[controller.git] / opendaylight / md-sal / sal-akka-raft / src / test / java / org / opendaylight / controller / cluster / raft / behaviors / CandidateTest.java
index 40080a8c72ba7978d365057fcd875897307048b4..6dd5336716c93419ee39ae5caa5d7ef76f3cbcd7 100644 (file)
@@ -10,8 +10,9 @@ package org.opendaylight.controller.cluster.raft.behaviors;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+
 import akka.actor.ActorRef;
-import akka.actor.Props;
+import akka.dispatch.Dispatchers;
 import akka.testkit.TestActorRef;
 import com.google.common.base.Stopwatch;
 import java.util.ArrayList;
@@ -39,6 +40,7 @@ import org.opendaylight.controller.cluster.raft.messages.AppendEntriesReply;
 import org.opendaylight.controller.cluster.raft.messages.RaftRPC;
 import org.opendaylight.controller.cluster.raft.messages.RequestVote;
 import org.opendaylight.controller.cluster.raft.messages.RequestVoteReply;
+import org.opendaylight.controller.cluster.raft.persisted.SimpleReplicatedLogEntry;
 import org.opendaylight.controller.cluster.raft.utils.MessageCollectorActor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -47,9 +49,10 @@ public class CandidateTest extends AbstractRaftActorBehaviorTest<Candidate> {
     static final Logger LOG = LoggerFactory.getLogger(CandidateTest.class);
 
     private final TestActorRef<MessageCollectorActor> candidateActor = actorFactory.createTestActor(
-            Props.create(MessageCollectorActor.class), actorFactory.generateActorId("candidate"));
+            MessageCollectorActor.props().withDispatcher(Dispatchers.DefaultDispatcherId()),
+            actorFactory.generateActorId("candidate"));
 
-    private TestActorRef<MessageCollectorActor>[] peerActors;
+    private ActorRef[] peerActors;
 
     private RaftActorBehavior candidate;
 
@@ -59,8 +62,8 @@ public class CandidateTest extends AbstractRaftActorBehaviorTest<Candidate> {
 
     @Override
     @After
-    public void tearDown() throws Exception {
-        if(candidate != null) {
+    public void tearDown() {
+        if (candidate != null) {
             candidate.close();
         }
 
@@ -68,27 +71,27 @@ public class CandidateTest extends AbstractRaftActorBehaviorTest<Candidate> {
     }
 
     @Test
-    public void testWhenACandidateIsCreatedItIncrementsTheCurrentTermAndVotesForItself(){
+    public void testWhenACandidateIsCreatedItIncrementsTheCurrentTermAndVotesForItself() {
         RaftActorContext raftActorContext = createActorContext();
         long expectedTerm = raftActorContext.getTermInformation().getCurrentTerm();
 
         candidate = new Candidate(raftActorContext);
 
-        assertEquals("getCurrentTerm", expectedTerm+1, raftActorContext.getTermInformation().getCurrentTerm());
+        assertEquals("getCurrentTerm", expectedTerm + 1, raftActorContext.getTermInformation().getCurrentTerm());
         assertEquals("getVotedFor", raftActorContext.getId(), raftActorContext.getTermInformation().getVotedFor());
     }
 
     @Test
-    public void testThatAnElectionTimeoutIsTriggered(){
-         MockRaftActorContext actorContext = createActorContext();
-         candidate = new Candidate(actorContext);
+    public void testThatAnElectionTimeoutIsTriggered() {
+        MockRaftActorContext actorContext = createActorContext();
+        candidate = new Candidate(actorContext);
 
-         MessageCollectorActor.expectFirstMatching(candidateActor, ElectionTimeout.class,
-                 actorContext.getConfigParams().getElectionTimeOutInterval().$times(6).toMillis());
+        MessageCollectorActor.expectFirstMatching(candidateActor, ElectionTimeout.class,
+                actorContext.getConfigParams().getElectionTimeOutInterval().$times(6).toMillis());
     }
 
     @Test
-    public void testHandleElectionTimeoutWhenThereAreZeroPeers(){
+    public void testHandleElectionTimeoutWhenThereAreZeroPeers() {
         RaftActorContext raftActorContext = createActorContext();
         candidate = new Candidate(raftActorContext);
 
@@ -99,7 +102,7 @@ public class CandidateTest extends AbstractRaftActorBehaviorTest<Candidate> {
     }
 
     @Test
-    public void testHandleElectionTimeoutWhenThereAreTwoNodeCluster(){
+    public void testHandleElectionTimeoutWhenThereAreTwoNodeCluster() {
         MockRaftActorContext raftActorContext = createActorContext();
         raftActorContext.setPeerAddresses(setupPeers(1));
         candidate = new Candidate(raftActorContext);
@@ -110,8 +113,9 @@ public class CandidateTest extends AbstractRaftActorBehaviorTest<Candidate> {
     }
 
     @Test
-    public void testBecomeLeaderOnReceivingMajorityVotesInThreeNodeCluster(){
+    public void testBecomeLeaderOnReceivingMajorityVotesInThreeNodeCluster() {
         MockRaftActorContext raftActorContext = createActorContext();
+        raftActorContext.setLastApplied(raftActorContext.getReplicatedLog().lastIndex());
         raftActorContext.setPeerAddresses(setupPeers(2));
         candidate = new Candidate(raftActorContext);
 
@@ -121,11 +125,26 @@ public class CandidateTest extends AbstractRaftActorBehaviorTest<Candidate> {
     }
 
     @Test
-    public void testBecomeLeaderOnReceivingMajorityVotesInFiveNodeCluster(){
+    public void testBecomePreLeaderOnReceivingMajorityVotesInThreeNodeCluster() {
+        MockRaftActorContext raftActorContext = createActorContext();
+        raftActorContext.setLastApplied(-1);
+        raftActorContext.setPeerAddresses(setupPeers(2));
+        candidate = new Candidate(raftActorContext);
+
+        candidate = candidate.handleMessage(peerActors[0], new RequestVoteReply(1, true));
+
+        // LastApplied is -1 and behind the last index.
+        assertEquals("Behavior", RaftState.PreLeader, candidate.state());
+    }
+
+    @Test
+    public void testBecomeLeaderOnReceivingMajorityVotesInFiveNodeCluster() {
         MockRaftActorContext raftActorContext = createActorContext();
         raftActorContext.getTermInformation().update(2L, "other");
-        raftActorContext.setReplicatedLog(new MockRaftActorContext.MockReplicatedLogBuilder().
-                createEntries(0, 5, 1).build());
+        raftActorContext.setReplicatedLog(new MockRaftActorContext.MockReplicatedLogBuilder()
+                .createEntries(0, 5, 1).build());
+        raftActorContext.setCommitIndex(raftActorContext.getReplicatedLog().lastIndex());
+        raftActorContext.setLastApplied(raftActorContext.getReplicatedLog().lastIndex());
         raftActorContext.setPeerAddresses(setupPeers(4));
         candidate = new Candidate(raftActorContext);
 
@@ -154,12 +173,12 @@ public class CandidateTest extends AbstractRaftActorBehaviorTest<Candidate> {
     }
 
     @Test
-    public void testBecomeLeaderOnReceivingMajorityVotesWithNonVotingPeers(){
+    public void testBecomeLeaderOnReceivingMajorityVotesWithNonVotingPeers() {
         ElectionTerm mockElectionTerm = Mockito.mock(ElectionTerm.class);
         Mockito.doReturn(1L).when(mockElectionTerm).getCurrentTerm();
         RaftActorContext raftActorContext = new RaftActorContextImpl(candidateActor, candidateActor.actorContext(),
                 "candidate", mockElectionTerm, -1, -1, setupPeers(4), new DefaultConfigParamsImpl(),
-                new NonPersistentDataProvider(), LOG);
+                new NonPersistentDataProvider(Runnable::run), applyState -> { }, LOG);
         raftActorContext.setReplicatedLog(new MockRaftActorContext.MockReplicatedLogBuilder().build());
         raftActorContext.getPeerInfo("peer1").setVotingState(VotingState.NON_VOTING);
         raftActorContext.getPeerInfo("peer4").setVotingState(VotingState.NON_VOTING);
@@ -273,7 +292,7 @@ public class CandidateTest extends AbstractRaftActorBehaviorTest<Candidate> {
     }
 
     @Test
-    public void testCandidateSchedulesElectionTimeoutImmediatelyWhenItHasNoPeers(){
+    public void testCandidateSchedulesElectionTimeoutImmediatelyWhenItHasNoPeers() {
         MockRaftActorContext context = createActorContext();
 
         Stopwatch stopwatch = Stopwatch.createStarted();
@@ -289,7 +308,7 @@ public class CandidateTest extends AbstractRaftActorBehaviorTest<Candidate> {
 
     @Test
     @Override
-    public void testHandleAppendEntriesAddSameEntryToLog() throws Exception {
+    public void testHandleAppendEntriesAddSameEntryToLog() {
         MockRaftActorContext context = createActorContext();
 
         context.getTermInformation().update(2, "test");
@@ -299,9 +318,9 @@ public class CandidateTest extends AbstractRaftActorBehaviorTest<Candidate> {
         setLastLogEntry(context, 2, 0, payload);
 
         List<ReplicatedLogEntry> entries = new ArrayList<>();
-        entries.add(new MockRaftActorContext.MockReplicatedLogEntry(2, 0, payload));
+        entries.add(new SimpleReplicatedLogEntry(0, 2, payload));
 
-        AppendEntries appendEntries = new AppendEntries(2, "leader-1", -1, -1, entries, 2, -1, (short)0);
+        final AppendEntries appendEntries = new AppendEntries(2, "leader-1", -1, -1, entries, 2, -1, (short)0);
 
         behavior = createBehavior(context);
 
@@ -329,18 +348,18 @@ public class CandidateTest extends AbstractRaftActorBehaviorTest<Candidate> {
         return new Candidate(actorContext);
     }
 
-    @Override protected MockRaftActorContext createActorContext() {
+    @Override
+    protected MockRaftActorContext createActorContext() {
         return new MockRaftActorContext("candidate", getSystem(), candidateActor);
     }
 
-    @SuppressWarnings("unchecked")
     private Map<String, String> setupPeers(final int count) {
         Map<String, String> peerMap = new HashMap<>();
-        peerActors = new TestActorRef[count];
-        for(int i = 0; i < count; i++) {
-            peerActors[i] = actorFactory.createTestActor(Props.create(MessageCollectorActor.class),
+        peerActors = new ActorRef[count];
+        for (int i = 0; i < count; i++) {
+            peerActors[i] = actorFactory.createActor(MessageCollectorActor.props(),
                     actorFactory.generateActorId("peer"));
-            peerMap.put("peer" + (i+1), peerActors[i].path().toString());
+            peerMap.put("peer" + (i + 1), peerActors[i].path().toString());
         }
 
         return peerMap;
@@ -348,10 +367,11 @@ public class CandidateTest extends AbstractRaftActorBehaviorTest<Candidate> {
 
     @Override
     protected void assertStateChangesToFollowerWhenRaftRPCHasNewerTerm(final MockRaftActorContext actorContext,
-            final ActorRef actorRef, final RaftRPC rpc) throws Exception {
+            final ActorRef actorRef, final RaftRPC rpc) {
         super.assertStateChangesToFollowerWhenRaftRPCHasNewerTerm(actorContext, actorRef, rpc);
-        if(rpc instanceof RequestVote) {
-            assertEquals("New votedFor", ((RequestVote)rpc).getCandidateId(), actorContext.getTermInformation().getVotedFor());
+        if (rpc instanceof RequestVote) {
+            assertEquals("New votedFor", ((RequestVote)rpc).getCandidateId(),
+                    actorContext.getTermInformation().getVotedFor());
         } else {
             assertEquals("New votedFor", null, actorContext.getTermInformation().getVotedFor());
         }