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.ArgumentMatchers.anyLong;
12 import static org.mockito.ArgumentMatchers.eq;
13 import static org.mockito.Mockito.mock;
14 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 com.google.common.util.concurrent.MoreExecutors;
21 import java.io.OutputStream;
22 import java.util.List;
24 import java.util.Optional;
25 import org.junit.Before;
26 import org.junit.Test;
27 import org.junit.runner.RunWith;
28 import org.mockito.Mock;
29 import org.mockito.junit.MockitoJUnitRunner;
30 import org.opendaylight.controller.cluster.DataPersistenceProvider;
31 import org.opendaylight.controller.cluster.raft.base.messages.ApplySnapshot;
32 import org.opendaylight.controller.cluster.raft.base.messages.CaptureSnapshotReply;
33 import org.opendaylight.controller.cluster.raft.behaviors.RaftActorBehavior;
34 import org.opendaylight.controller.cluster.raft.persisted.ByteState;
35 import org.opendaylight.controller.cluster.raft.persisted.Snapshot;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
40 * Unit tests for RaftActorSnapshotMessageSupport.
42 * @author Thomas Pantelis
44 @RunWith(MockitoJUnitRunner.StrictStubs.class)
45 public class RaftActorSnapshotMessageSupportTest {
46 private static final Logger LOG = LoggerFactory.getLogger(RaftActorRecoverySupportTest.class);
49 private DataPersistenceProvider mockPersistence;
52 private RaftActorBehavior mockBehavior;
55 private RaftActorSnapshotCohort mockCohort;
58 private SnapshotManager mockSnapshotManager;
61 ActorRef mockRaftActorRef;
63 private RaftActorSnapshotMessageSupport support;
65 private RaftActorContext context;
66 private final DefaultConfigParamsImpl configParams = new DefaultConfigParamsImpl();
70 context = new RaftActorContextImpl(mockRaftActorRef, null, "test",
71 new ElectionTermImpl(mockPersistence, "test", LOG), -1, -1, Map.of(),
72 configParams, mockPersistence, applyState -> { }, LOG, MoreExecutors.directExecutor()) {
74 public SnapshotManager getSnapshotManager() {
75 return mockSnapshotManager;
79 support = new RaftActorSnapshotMessageSupport(context, mockCohort);
81 context.setReplicatedLog(ReplicatedLogImpl.newInstance(context));
84 private void sendMessageToSupport(final Object message) {
85 sendMessageToSupport(message, true);
88 private void sendMessageToSupport(final Object message, final boolean expHandled) {
89 boolean handled = support.handleSnapshotMessage(message, mockRaftActorRef);
90 assertEquals("complete", expHandled, handled);
94 public void testOnApplySnapshot() {
96 long lastAppliedDuringSnapshotCapture = 1;
97 long lastIndexDuringSnapshotCapture = 2;
98 byte[] snapshotBytes = {1,2,3,4,5};
100 Snapshot snapshot = Snapshot.create(ByteState.of(snapshotBytes), List.of(),
101 lastIndexDuringSnapshotCapture, 1, lastAppliedDuringSnapshotCapture, 1, -1, null, null);
103 ApplySnapshot applySnapshot = new ApplySnapshot(snapshot);
104 sendMessageToSupport(applySnapshot);
106 verify(mockSnapshotManager).apply(applySnapshot);
110 public void testOnCaptureSnapshotReply() {
111 ByteState state = ByteState.of(new byte[]{1,2,3,4,5});
112 Optional<OutputStream> optionalStream = Optional.of(mock(OutputStream.class));
113 sendMessageToSupport(new CaptureSnapshotReply(state, optionalStream));
115 verify(mockSnapshotManager).persist(eq(state), eq(optionalStream), anyLong());
119 public void testOnSaveSnapshotSuccess() {
121 long sequenceNumber = 100;
122 long timeStamp = 1234L;
123 sendMessageToSupport(new SaveSnapshotSuccess(new SnapshotMetadata("foo", sequenceNumber, timeStamp)));
125 verify(mockSnapshotManager).commit(eq(sequenceNumber), eq(timeStamp));
129 public void testOnSaveSnapshotFailure() {
131 sendMessageToSupport(new SaveSnapshotFailure(new SnapshotMetadata("foo", 100, 1234L),
132 new Throwable("mock")));
134 verify(mockSnapshotManager).rollback();
138 public void testOnCommitSnapshot() {
140 sendMessageToSupport(RaftActorSnapshotMessageSupport.COMMIT_SNAPSHOT);
142 verify(mockSnapshotManager).commit(eq(-1L), eq(-1L));
146 public void testUnhandledMessage() {
148 sendMessageToSupport("unhandled", false);