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.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;
33 * Unit tests for RaftActorSnapshotMessageSupport.
35 * @author Thomas Pantelis
37 public class RaftActorSnapshotMessageSupportTest {
39 private static final Logger LOG = LoggerFactory.getLogger(RaftActorRecoverySupportTest.class);
42 private DataPersistenceProvider mockPersistence;
45 private RaftActorBehavior mockBehavior;
48 private RaftActorSnapshotCohort mockCohort;
51 private SnapshotManager mockSnapshotManager;
54 ActorRef mockRaftActorRef;
56 private RaftActorSnapshotMessageSupport support;
58 private RaftActorContext context;
59 private final DefaultConfigParamsImpl configParams = new DefaultConfigParamsImpl();
63 MockitoAnnotations.initMocks(this);
65 context = new RaftActorContextImpl(mockRaftActorRef, null, "test",
66 new ElectionTermImpl(mockPersistence, "test", LOG),
67 -1, -1, Collections.<String,String>emptyMap(), configParams, mockPersistence, LOG) {
69 public SnapshotManager getSnapshotManager() {
70 return mockSnapshotManager;
74 support = new RaftActorSnapshotMessageSupport(context, mockBehavior, mockCohort);
76 doReturn(true).when(mockPersistence).isRecoveryApplicable();
78 context.setReplicatedLog(ReplicatedLogImpl.newInstance(context, mockBehavior));
81 private void sendMessageToSupport(Object message) {
82 sendMessageToSupport(message, true);
85 private void sendMessageToSupport(Object message, boolean expHandled) {
86 boolean handled = support.handleSnapshotMessage(message);
87 assertEquals("complete", expHandled, handled);
91 public void testOnApplySnapshot() {
93 long lastAppliedDuringSnapshotCapture = 1;
94 long lastIndexDuringSnapshotCapture = 2;
95 byte[] snapshotBytes = {1,2,3,4,5};
97 Snapshot snapshot = Snapshot.create(snapshotBytes, Collections.<ReplicatedLogEntry>emptyList(),
98 lastIndexDuringSnapshotCapture, 1, lastAppliedDuringSnapshotCapture, 1);
100 ApplySnapshot applySnapshot = new ApplySnapshot(snapshot);
101 sendMessageToSupport(applySnapshot);
103 verify(mockSnapshotManager).apply(applySnapshot);
107 public void testOnCaptureSnapshotReply() {
109 byte[] snapshot = {1,2,3,4,5};
110 sendMessageToSupport(new CaptureSnapshotReply(snapshot));
112 verify(mockSnapshotManager).persist(same(snapshot), same(mockBehavior), anyLong());
116 public void testOnSaveSnapshotSuccess() {
118 long sequenceNumber = 100;
119 sendMessageToSupport(new SaveSnapshotSuccess(new SnapshotMetadata("foo", sequenceNumber, 1234L)));
121 verify(mockSnapshotManager).commit(eq(sequenceNumber), same(mockBehavior));
125 public void testOnSaveSnapshotFailure() {
127 sendMessageToSupport(new SaveSnapshotFailure(new SnapshotMetadata("foo", 100, 1234L),
128 new Throwable("mock")));
130 verify(mockSnapshotManager).rollback();
134 public void testOnCommitSnapshot() {
136 sendMessageToSupport(RaftActorSnapshotMessageSupport.COMMIT_SNAPSHOT);
138 verify(mockSnapshotManager).commit(eq(-1L), same(mockBehavior));
142 public void testUnhandledMessage() {
144 sendMessageToSupport("unhandled", false);