2 * Copyright (c) 2015 Brocade Communications Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.controller.cluster.raft;
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.any;
15 import static org.mockito.Mockito.doNothing;
16 import static org.mockito.Mockito.doReturn;
17 import static org.mockito.Mockito.verify;
18 import akka.actor.ActorRef;
19 import akka.japi.Procedure;
20 import akka.persistence.SaveSnapshotFailure;
21 import akka.persistence.SaveSnapshotSuccess;
22 import akka.persistence.SnapshotMetadata;
23 import java.util.Collections;
24 import org.junit.Before;
25 import org.junit.Test;
26 import org.mockito.Mock;
27 import org.mockito.MockitoAnnotations;
28 import org.opendaylight.controller.cluster.DataPersistenceProvider;
29 import org.opendaylight.controller.cluster.raft.base.messages.ApplySnapshot;
30 import org.opendaylight.controller.cluster.raft.base.messages.CaptureSnapshotReply;
31 import org.opendaylight.controller.cluster.raft.behaviors.RaftActorBehavior;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
36 * Unit tests for RaftActorSnapshotMessageSupport.
38 * @author Thomas Pantelis
40 public class RaftActorSnapshotMessageSupportTest {
42 private static final Logger LOG = LoggerFactory.getLogger(RaftActorRecoverySupportTest.class);
45 private DataPersistenceProvider mockPersistence;
48 private RaftActorBehavior mockBehavior;
51 private RaftActorSnapshotCohort mockCohort;
54 private SnapshotManager mockSnapshotManager;
57 ActorRef mockRaftActorRef;
59 private RaftActorSnapshotMessageSupport support;
61 private RaftActorContext context;
62 private final DefaultConfigParamsImpl configParams = new DefaultConfigParamsImpl();
66 MockitoAnnotations.initMocks(this);
68 doNothing().when(mockSnapshotManager).setApplySnapshotProcedure(any(Procedure.class));
69 doNothing().when(mockSnapshotManager).setCreateSnapshotCallable(any(Procedure.class));
70 doNothing().when(mockSnapshotManager).apply(any(ApplySnapshot.class));
71 doNothing().when(mockSnapshotManager).commit(any(long.class), any(RaftActorBehavior.class));
72 doNothing().when(mockSnapshotManager).persist(any(byte[].class), any(RaftActorBehavior.class), any(long.class));
73 doNothing().when(mockSnapshotManager).rollback();
75 context = new RaftActorContextImpl(mockRaftActorRef, null, "test",
76 new ElectionTermImpl(mockPersistence, "test", LOG),
77 -1, -1, Collections.<String,String>emptyMap(), configParams, mockPersistence, LOG) {
79 public SnapshotManager getSnapshotManager() {
80 return mockSnapshotManager;
84 support = new RaftActorSnapshotMessageSupport(context, mockBehavior, mockCohort);
86 doReturn(true).when(mockPersistence).isRecoveryApplicable();
88 context.setReplicatedLog(ReplicatedLogImpl.newInstance(context, mockBehavior));
91 private void sendMessageToSupport(Object message) {
92 sendMessageToSupport(message, true);
95 private void sendMessageToSupport(Object message, boolean expHandled) {
96 boolean handled = support.handleSnapshotMessage(message, mockRaftActorRef);
97 assertEquals("complete", expHandled, handled);
101 public void testOnApplySnapshot() {
103 long lastAppliedDuringSnapshotCapture = 1;
104 long lastIndexDuringSnapshotCapture = 2;
105 byte[] snapshotBytes = {1,2,3,4,5};
107 Snapshot snapshot = Snapshot.create(snapshotBytes, Collections.<ReplicatedLogEntry>emptyList(),
108 lastIndexDuringSnapshotCapture, 1, lastAppliedDuringSnapshotCapture, 1);
110 ApplySnapshot applySnapshot = new ApplySnapshot(snapshot);
111 sendMessageToSupport(applySnapshot);
113 verify(mockSnapshotManager).apply(applySnapshot);
117 public void testOnCaptureSnapshotReply() {
119 byte[] snapshot = {1,2,3,4,5};
120 sendMessageToSupport(new CaptureSnapshotReply(snapshot));
122 verify(mockSnapshotManager).persist(same(snapshot), same(mockBehavior), anyLong());
126 public void testOnSaveSnapshotSuccess() {
128 long sequenceNumber = 100;
129 sendMessageToSupport(new SaveSnapshotSuccess(new SnapshotMetadata("foo", sequenceNumber, 1234L)));
131 verify(mockSnapshotManager).commit(eq(sequenceNumber), same(mockBehavior));
135 public void testOnSaveSnapshotFailure() {
137 sendMessageToSupport(new SaveSnapshotFailure(new SnapshotMetadata("foo", 100, 1234L),
138 new Throwable("mock")));
140 verify(mockSnapshotManager).rollback();
144 public void testOnCommitSnapshot() {
146 sendMessageToSupport(RaftActorSnapshotMessageSupport.COMMIT_SNAPSHOT);
148 verify(mockSnapshotManager).commit(eq(-1L), same(mockBehavior));
152 public void testUnhandledMessage() {
154 sendMessageToSupport("unhandled", false);