X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-akka-raft%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fraft%2FRaftActorTest.java;h=9b099c2abac8223529b750c6ea906925105ec487;hp=12123db12995061901a39a264c79f0237d78d00a;hb=4c975594eb74127ca4c0018984d569ae52be77e5;hpb=7225f60c394a26143f8421b0f99f2585699fa306 diff --git a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/RaftActorTest.java b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/RaftActorTest.java index 12123db129..9b099c2aba 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/RaftActorTest.java +++ b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/RaftActorTest.java @@ -2,18 +2,24 @@ package org.opendaylight.controller.cluster.raft; import akka.actor.ActorRef; import akka.actor.ActorSystem; +import akka.actor.PoisonPill; import akka.actor.Props; import akka.event.Logging; import akka.japi.Creator; import akka.testkit.JavaTestKit; +import akka.testkit.TestActorRef; import com.google.protobuf.ByteString; import org.junit.Test; import org.opendaylight.controller.cluster.raft.client.messages.FindLeader; import org.opendaylight.controller.cluster.raft.client.messages.FindLeaderReply; +import org.opendaylight.controller.cluster.raft.utils.MockSnapshotStore; +import java.util.ArrayList; import java.util.Collections; +import java.util.List; import java.util.Map; +import static junit.framework.Assert.assertTrue; import static junit.framework.TestCase.assertEquals; public class RaftActorTest extends AbstractActorTest { @@ -21,11 +27,21 @@ public class RaftActorTest extends AbstractActorTest { public static class MockRaftActor extends RaftActor { + boolean applySnapshotCalled = false; + public MockRaftActor(String id, Map peerAddresses) { super(id, peerAddresses); } + public RaftActorContext getRaftActorContext() { + return context; + } + + public boolean isApplySnapshotCalled() { + return applySnapshotCalled; + } + public static Props props(final String id, final Map peerAddresses){ return Props.create(new Creator(){ @@ -45,7 +61,7 @@ public class RaftActorTest extends AbstractActorTest { } @Override protected void applySnapshot(ByteString snapshot) { - throw new UnsupportedOperationException("applySnapshot"); + applySnapshotCalled = true; } @Override protected void onStateChanged() { @@ -134,5 +150,56 @@ public class RaftActorTest extends AbstractActorTest { kit.findLeader(kit.getRaftActor().path().toString()); } + @Test + public void testActorRecovery() { + new JavaTestKit(getSystem()) {{ + new Within(duration("1 seconds")) { + protected void run() { + + String persistenceId = "follower10"; + + ActorRef followerActor = getSystem().actorOf( + MockRaftActor.props(persistenceId, Collections.EMPTY_MAP), persistenceId); + + + List entries = new ArrayList<>(); + ReplicatedLogEntry entry1 = new MockRaftActorContext.MockReplicatedLogEntry(1, 4, new MockRaftActorContext.MockPayload("E")); + ReplicatedLogEntry entry2 = new MockRaftActorContext.MockReplicatedLogEntry(1, 5, new MockRaftActorContext.MockPayload("F")); + entries.add(entry1); + entries.add(entry2); + + int lastApplied = 3; + int lastIndex = 5; + Snapshot snapshot = Snapshot.create("A B C D".getBytes(), entries, lastIndex, 1 , lastApplied, 1); + MockSnapshotStore.setMockSnapshot(snapshot); + MockSnapshotStore.setPersistenceId(persistenceId); + + followerActor.tell(PoisonPill.getInstance(), null); + try { + // give some time for actor to die + Thread.sleep(200); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + TestActorRef ref = TestActorRef.create(getSystem(), MockRaftActor.props(persistenceId, Collections.EMPTY_MAP)); + try { + //give some time for snapshot offer to get called. + Thread.sleep(200); + } catch (InterruptedException e) { + e.printStackTrace(); + } + RaftActorContext context = ref.underlyingActor().getRaftActorContext(); + assertEquals(entries.size(), context.getReplicatedLog().size()); + assertEquals(lastApplied, context.getLastApplied()); + assertEquals(lastApplied, context.getCommitIndex()); + assertTrue(ref.underlyingActor().isApplySnapshotCalled()); + } + + }; + }}; + + } + }