Fix issue when AE leader differs from prior install snapshot leader
[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.eq;
13 import static org.mockito.Matchers.same;
14 import static org.mockito.Mockito.doReturn;
15 import static org.mockito.Mockito.verify;
16 import akka.actor.ActorRef;
17 import akka.persistence.SaveSnapshotFailure;
18 import akka.persistence.SaveSnapshotSuccess;
19 import akka.persistence.SnapshotMetadata;
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.base.messages.ApplySnapshot;
27 import org.opendaylight.controller.cluster.raft.base.messages.CaptureSnapshotReply;
28 import org.opendaylight.controller.cluster.raft.behaviors.RaftActorBehavior;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31
32 /**
33  * Unit tests for RaftActorSnapshotMessageSupport.
34  *
35  * @author Thomas Pantelis
36  */
37 public class RaftActorSnapshotMessageSupportTest {
38
39     private static final Logger LOG = LoggerFactory.getLogger(RaftActorRecoverySupportTest.class);
40
41     @Mock
42     private DataPersistenceProvider mockPersistence;
43
44     @Mock
45     private RaftActorBehavior mockBehavior;
46
47     @Mock
48     private RaftActorSnapshotCohort mockCohort;
49
50     @Mock
51     private SnapshotManager mockSnapshotManager;
52
53     @Mock
54     ActorRef mockRaftActorRef;
55
56     private RaftActorSnapshotMessageSupport support;
57
58     private RaftActorContext context;
59     private final DefaultConfigParamsImpl configParams = new DefaultConfigParamsImpl();
60
61     @Before
62     public void setup() {
63         MockitoAnnotations.initMocks(this);
64
65         context = new RaftActorContextImpl(mockRaftActorRef, null, "test",
66                 new ElectionTermImpl(mockPersistence, "test", LOG),
67                 -1, -1, Collections.<String,String>emptyMap(), configParams, mockPersistence, LOG) {
68             @Override
69             public SnapshotManager getSnapshotManager() {
70                 return mockSnapshotManager;
71             }
72         };
73
74         support = new RaftActorSnapshotMessageSupport(context, mockCohort);
75
76         doReturn(true).when(mockPersistence).isRecoveryApplicable();
77
78         context.setReplicatedLog(ReplicatedLogImpl.newInstance(context));
79     }
80
81     private void sendMessageToSupport(Object message) {
82         sendMessageToSupport(message, true);
83     }
84
85     private void sendMessageToSupport(Object message, boolean expHandled) {
86         boolean handled = support.handleSnapshotMessage(message, mockRaftActorRef);
87         assertEquals("complete", expHandled, handled);
88     }
89
90     @Test
91     public void testOnApplySnapshot() {
92
93         long lastAppliedDuringSnapshotCapture = 1;
94         long lastIndexDuringSnapshotCapture = 2;
95         byte[] snapshotBytes = {1,2,3,4,5};
96
97         Snapshot snapshot = Snapshot.create(snapshotBytes, Collections.<ReplicatedLogEntry>emptyList(),
98                 lastIndexDuringSnapshotCapture, 1, lastAppliedDuringSnapshotCapture, 1);
99
100         ApplySnapshot applySnapshot = new ApplySnapshot(snapshot);
101         sendMessageToSupport(applySnapshot);
102
103         verify(mockSnapshotManager).apply(applySnapshot);
104     }
105
106     @Test
107     public void testOnCaptureSnapshotReply() {
108
109         byte[] snapshot = {1,2,3,4,5};
110         sendMessageToSupport(new CaptureSnapshotReply(snapshot));
111
112         verify(mockSnapshotManager).persist(same(snapshot), anyLong());
113     }
114
115     @Test
116     public void testOnSaveSnapshotSuccess() {
117
118         long sequenceNumber = 100;
119         long timeStamp = 1234L;
120         sendMessageToSupport(new SaveSnapshotSuccess(new SnapshotMetadata("foo", sequenceNumber, timeStamp)));
121
122         verify(mockSnapshotManager).commit(eq(sequenceNumber), eq(timeStamp));
123     }
124
125     @Test
126     public void testOnSaveSnapshotFailure() {
127
128         sendMessageToSupport(new SaveSnapshotFailure(new SnapshotMetadata("foo", 100, 1234L),
129                 new Throwable("mock")));
130
131         verify(mockSnapshotManager).rollback();
132     }
133
134     @Test
135     public void testOnCommitSnapshot() {
136
137         sendMessageToSupport(RaftActorSnapshotMessageSupport.COMMIT_SNAPSHOT);
138
139         verify(mockSnapshotManager).commit(eq(-1L), eq(-1L));
140     }
141
142     @Test
143     public void testUnhandledMessage() {
144
145         sendMessageToSupport("unhandled", false);
146     }
147 }