Merge "Bug 2998 - RESTCONF not recogizing top-level input."
[controller.git] / opendaylight / md-sal / sal-akka-raft / src / test / java / org / opendaylight / controller / cluster / raft / RaftActorSnapshotMessageSupportTest.java
1 /*
2  * Copyright (c) 2015 Brocade Communications 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 import static org.mockito.Matchers.anyLong;
12 import static org.mockito.Matchers.same;
13 import static org.mockito.Mockito.doReturn;
14 import static org.mockito.Mockito.verify;
15 import akka.actor.ActorRef;
16 import akka.persistence.SaveSnapshotFailure;
17 import akka.persistence.SaveSnapshotSuccess;
18 import akka.persistence.SnapshotMetadata;
19 import java.util.Arrays;
20 import java.util.Collections;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.mockito.Mock;
24 import org.mockito.MockitoAnnotations;
25 import org.opendaylight.controller.cluster.DataPersistenceProvider;
26 import org.opendaylight.controller.cluster.raft.MockRaftActorContext.MockPayload;
27 import org.opendaylight.controller.cluster.raft.MockRaftActorContext.MockReplicatedLogEntry;
28 import org.opendaylight.controller.cluster.raft.base.messages.ApplySnapshot;
29 import org.opendaylight.controller.cluster.raft.base.messages.CaptureSnapshotReply;
30 import org.opendaylight.controller.cluster.raft.behaviors.RaftActorBehavior;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33
34 /**
35  * Unit tests for RaftActorSnapshotMessageSupport.
36  *
37  * @author Thomas Pantelis
38  */
39 public class RaftActorSnapshotMessageSupportTest {
40
41     private static final Logger LOG = LoggerFactory.getLogger(RaftActorRecoverySupportTest.class);
42
43     @Mock
44     private DataPersistenceProvider mockPersistence;
45
46     @Mock
47     private RaftActorBehavior mockBehavior;
48
49     @Mock
50     private RaftActorSnapshotCohort mockCohort;
51
52     @Mock
53     private SnapshotManager mockSnapshotManager;
54
55     @Mock
56     ActorRef mockRaftActorRef;
57
58     private RaftActorSnapshotMessageSupport support;
59
60     private RaftActorContext context;
61     private final DefaultConfigParamsImpl configParams = new DefaultConfigParamsImpl();
62
63     @Before
64     public void setup() {
65         MockitoAnnotations.initMocks(this);
66
67         context = new RaftActorContextImpl(mockRaftActorRef, null, "test",
68                 new ElectionTermImpl(mockPersistence, "test", LOG),
69                 -1, -1, Collections.<String,String>emptyMap(), configParams, mockPersistence, LOG) {
70             @Override
71             public SnapshotManager getSnapshotManager() {
72                 return mockSnapshotManager;
73             }
74         };
75
76         support = new RaftActorSnapshotMessageSupport(context, mockBehavior, mockCohort);
77
78         doReturn(true).when(mockPersistence).isRecoveryApplicable();
79
80         context.setReplicatedLog(ReplicatedLogImpl.newInstance(context, mockBehavior));
81     }
82
83     private void sendMessageToSupport(Object message) {
84         sendMessageToSupport(message, true);
85     }
86
87     private void sendMessageToSupport(Object message, boolean expHandled) {
88         boolean handled = support.handleSnapshotMessage(message);
89         assertEquals("complete", expHandled, handled);
90     }
91
92     @Test
93     public void testOnApplySnapshot() {
94
95         ReplicatedLog replicatedLog = context.getReplicatedLog();
96         replicatedLog.append(new MockReplicatedLogEntry(1, 1, new MockPayload("1")));
97
98         byte[] snapshotBytes = {1,2,3,4,5};
99
100         ReplicatedLogEntry unAppliedEntry = new MockReplicatedLogEntry(1, 2, new MockPayload("2"));
101
102         long lastAppliedDuringSnapshotCapture = 1;
103         long lastIndexDuringSnapshotCapture = 2;
104
105         Snapshot snapshot = Snapshot.create(snapshotBytes, Arrays.asList(unAppliedEntry),
106                 lastIndexDuringSnapshotCapture, 1, lastAppliedDuringSnapshotCapture, 1);
107
108         sendMessageToSupport(new ApplySnapshot(snapshot));
109
110         assertEquals("Journal log size", 1, context.getReplicatedLog().size());
111         assertEquals("Last index", lastIndexDuringSnapshotCapture, context.getReplicatedLog().lastIndex());
112         assertEquals("Last applied", lastAppliedDuringSnapshotCapture, context.getLastApplied());
113         assertEquals("Commit index", -1, context.getCommitIndex());
114         assertEquals("Snapshot term", 1, context.getReplicatedLog().getSnapshotTerm());
115         assertEquals("Snapshot index", lastAppliedDuringSnapshotCapture, context.getReplicatedLog().getSnapshotIndex());
116
117         verify(mockCohort).applySnapshot(snapshotBytes);
118     }
119
120     @Test
121     public void testOnCaptureSnapshotReply() {
122
123         byte[] snapshot = {1,2,3,4,5};
124         sendMessageToSupport(new CaptureSnapshotReply(snapshot));
125
126         verify(mockSnapshotManager).persist(same(snapshot), same(mockBehavior), anyLong());
127     }
128
129     @Test
130     public void testOnSaveSnapshotSuccess() {
131
132         long sequenceNumber = 100;
133         sendMessageToSupport(new SaveSnapshotSuccess(new SnapshotMetadata("foo", sequenceNumber, 1234L)));
134
135         verify(mockSnapshotManager).commit(sequenceNumber);
136     }
137
138     @Test
139     public void testOnSaveSnapshotFailure() {
140
141         sendMessageToSupport(new SaveSnapshotFailure(new SnapshotMetadata("foo", 100, 1234L),
142                 new Throwable("mock")));
143
144         verify(mockSnapshotManager).rollback();
145     }
146
147     @Test
148     public void testOnCommitSnapshot() {
149
150         sendMessageToSupport(RaftActorSnapshotMessageSupport.COMMIT_SNAPSHOT);
151
152         verify(mockSnapshotManager).commit(-1);
153     }
154
155     @Test
156     public void testUnhandledMessage() {
157
158         sendMessageToSupport("unhandled", false);
159     }
160 }