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.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;
35 * Unit tests for RaftActorSnapshotMessageSupport.
37 * @author Thomas Pantelis
39 public class RaftActorSnapshotMessageSupportTest {
41 private static final Logger LOG = LoggerFactory.getLogger(RaftActorRecoverySupportTest.class);
44 private DataPersistenceProvider mockPersistence;
47 private RaftActorBehavior mockBehavior;
50 private RaftActorSnapshotCohort mockCohort;
53 private SnapshotManager mockSnapshotManager;
56 ActorRef mockRaftActorRef;
58 private RaftActorSnapshotMessageSupport support;
60 private RaftActorContext context;
61 private final DefaultConfigParamsImpl configParams = new DefaultConfigParamsImpl();
65 MockitoAnnotations.initMocks(this);
67 context = new RaftActorContextImpl(mockRaftActorRef, null, "test",
68 new ElectionTermImpl(mockPersistence, "test", LOG),
69 -1, -1, Collections.<String,String>emptyMap(), configParams, mockPersistence, LOG) {
71 public SnapshotManager getSnapshotManager() {
72 return mockSnapshotManager;
76 support = new RaftActorSnapshotMessageSupport(context, mockBehavior, mockCohort);
78 doReturn(true).when(mockPersistence).isRecoveryApplicable();
80 context.setReplicatedLog(ReplicatedLogImpl.newInstance(context, mockBehavior));
83 private void sendMessageToSupport(Object message) {
84 sendMessageToSupport(message, true);
87 private void sendMessageToSupport(Object message, boolean expHandled) {
88 boolean handled = support.handleSnapshotMessage(message);
89 assertEquals("complete", expHandled, handled);
93 public void testOnApplySnapshot() {
95 ReplicatedLog replicatedLog = context.getReplicatedLog();
96 replicatedLog.append(new MockReplicatedLogEntry(1, 1, new MockPayload("1")));
98 byte[] snapshotBytes = {1,2,3,4,5};
100 ReplicatedLogEntry unAppliedEntry = new MockReplicatedLogEntry(1, 2, new MockPayload("2"));
102 long lastAppliedDuringSnapshotCapture = 1;
103 long lastIndexDuringSnapshotCapture = 2;
105 Snapshot snapshot = Snapshot.create(snapshotBytes, Arrays.asList(unAppliedEntry),
106 lastIndexDuringSnapshotCapture, 1, lastAppliedDuringSnapshotCapture, 1);
108 sendMessageToSupport(new ApplySnapshot(snapshot));
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());
117 verify(mockCohort).applySnapshot(snapshotBytes);
121 public void testOnCaptureSnapshotReply() {
123 byte[] snapshot = {1,2,3,4,5};
124 sendMessageToSupport(new CaptureSnapshotReply(snapshot));
126 verify(mockSnapshotManager).persist(same(snapshot), same(mockBehavior), anyLong());
130 public void testOnSaveSnapshotSuccess() {
132 long sequenceNumber = 100;
133 sendMessageToSupport(new SaveSnapshotSuccess(new SnapshotMetadata("foo", sequenceNumber, 1234L)));
135 verify(mockSnapshotManager).commit(sequenceNumber);
139 public void testOnSaveSnapshotFailure() {
141 sendMessageToSupport(new SaveSnapshotFailure(new SnapshotMetadata("foo", 100, 1234L),
142 new Throwable("mock")));
144 verify(mockSnapshotManager).rollback();
148 public void testOnCommitSnapshot() {
150 sendMessageToSupport(RaftActorSnapshotMessageSupport.COMMIT_SNAPSHOT);
152 verify(mockSnapshotManager).commit(-1);
156 public void testUnhandledMessage() {
158 sendMessageToSupport("unhandled", false);