Migrate sal-akka-raft tests
[controller.git] / opendaylight / md-sal / sal-akka-raft / src / test / java / org / opendaylight / controller / cluster / raft / RecoveryIntegrationSingleNodeTest.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.cluster.raft;
9
10 import static org.junit.Assert.assertEquals;
11
12 import akka.actor.ActorRef;
13 import akka.persistence.SaveSnapshotSuccess;
14 import akka.testkit.TestActorRef;
15 import com.google.common.collect.ImmutableMap;
16 import com.google.common.collect.Lists;
17 import java.util.List;
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.opendaylight.controller.cluster.raft.persisted.ApplyJournalEntries;
21 import org.opendaylight.controller.cluster.raft.persisted.Snapshot;
22 import org.opendaylight.controller.cluster.raft.utils.InMemoryJournal;
23 import org.opendaylight.controller.cluster.raft.utils.InMemorySnapshotStore;
24 import org.opendaylight.controller.cluster.raft.utils.MessageCollectorActor;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
27
28 /**
29  * Recovery Integration Test for single node.
30  */
31 public class RecoveryIntegrationSingleNodeTest extends AbstractRaftActorIntegrationTest {
32
33     static final Logger LOG = LoggerFactory.getLogger(RecoveryIntegrationSingleNodeTest.class);
34
35     @Before
36     public void setup() {
37         leaderConfigParams = newLeaderConfigParams();
38     }
39
40
41     @Test
42     public void testJournalReplayAfterSnapshotWithSingleNode() {
43
44         String persistenceId = factory.generateActorId("singleNode");
45         TestActorRef<AbstractRaftActorIntegrationTest.TestRaftActor> singleNodeActorRef =
46                 newTestRaftActor(persistenceId, ImmutableMap.<String, String>builder().build(), leaderConfigParams);
47
48         waitUntilLeader(singleNodeActorRef);
49
50         ActorRef singleNodeCollectorActor = singleNodeActorRef.underlyingActor().collectorActor();
51         final RaftActorContext singleNodeContext = singleNodeActorRef.underlyingActor().getRaftActorContext();
52
53         InMemoryJournal.addWriteMessagesCompleteLatch(persistenceId, 6, ApplyJournalEntries.class);
54
55         final MockRaftActorContext.MockPayload payload0 = sendPayloadData(singleNodeActorRef, "zero");
56         final MockRaftActorContext.MockPayload payload1 = sendPayloadData(singleNodeActorRef, "one");
57         final MockRaftActorContext.MockPayload payload2 = sendPayloadData(singleNodeActorRef, "two");
58
59         MessageCollectorActor.expectMatching(singleNodeCollectorActor, ApplyJournalEntries.class, 3);
60
61         // this should trigger a snapshot
62         final MockRaftActorContext.MockPayload payload3 = sendPayloadData(singleNodeActorRef, "three");
63
64         MessageCollectorActor.expectMatching(singleNodeCollectorActor, ApplyJournalEntries.class, 4);
65
66         //add 2 more
67         final MockRaftActorContext.MockPayload payload4 = sendPayloadData(singleNodeActorRef, "four");
68         final MockRaftActorContext.MockPayload payload5 = sendPayloadData(singleNodeActorRef, "five");
69
70
71         // Wait for snapshot complete.
72         MessageCollectorActor.expectFirstMatching(singleNodeCollectorActor, SaveSnapshotSuccess.class);
73
74         MessageCollectorActor.expectMatching(singleNodeCollectorActor, ApplyJournalEntries.class, 6);
75
76         assertEquals("Last applied", 5, singleNodeContext.getLastApplied());
77
78         assertEquals("Incorrect State after snapshot success is received ", Lists.newArrayList(payload0, payload1,
79                 payload2, payload3, payload4, payload5), singleNodeActorRef.underlyingActor().getState());
80
81         InMemoryJournal.waitForWriteMessagesComplete(persistenceId);
82
83         // we get 2 log entries (4 and 5 indexes) and 3 ApplyJournalEntries (for 3, 4, and 5 indexes)
84         assertEquals(5, InMemoryJournal.get(persistenceId).size());
85
86         List<Snapshot> persistedSnapshots = InMemorySnapshotStore.getSnapshots(persistenceId, Snapshot.class);
87         assertEquals(1, persistedSnapshots.size());
88
89         List<Object> snapshottedState = MockRaftActor.fromState(persistedSnapshots.get(0).getState());
90         assertEquals("Incorrect Snapshot", Lists.newArrayList(payload0, payload1, payload2, payload3),
91                 snapshottedState);
92
93         //recovery logic starts
94         killActor(singleNodeActorRef);
95
96         singleNodeActorRef = newTestRaftActor(persistenceId,
97                 ImmutableMap.<String, String>builder().build(), leaderConfigParams);
98
99         singleNodeActorRef.underlyingActor().waitForRecoveryComplete();
100
101         assertEquals("Incorrect State after Recovery ", Lists.newArrayList(payload0, payload1, payload2, payload3,
102                 payload4, payload5), singleNodeActorRef.underlyingActor().getState());
103
104     }
105 }