package org.opendaylight.controller.cluster.raft;
import static org.junit.Assert.assertEquals;
-import static org.mockito.Matchers.anyLong;
-import static org.mockito.Matchers.same;
-import static org.mockito.Mockito.doReturn;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
+
import akka.actor.ActorRef;
import akka.persistence.SaveSnapshotFailure;
import akka.persistence.SaveSnapshotSuccess;
import akka.persistence.SnapshotMetadata;
-import java.util.Arrays;
-import java.util.Collections;
+import com.google.common.util.concurrent.MoreExecutors;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnitRunner;
import org.opendaylight.controller.cluster.DataPersistenceProvider;
-import org.opendaylight.controller.cluster.raft.MockRaftActorContext.MockPayload;
-import org.opendaylight.controller.cluster.raft.MockRaftActorContext.MockReplicatedLogEntry;
import org.opendaylight.controller.cluster.raft.base.messages.ApplySnapshot;
import org.opendaylight.controller.cluster.raft.base.messages.CaptureSnapshotReply;
import org.opendaylight.controller.cluster.raft.behaviors.RaftActorBehavior;
+import org.opendaylight.controller.cluster.raft.persisted.ByteState;
+import org.opendaylight.controller.cluster.raft.persisted.Snapshot;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
*
* @author Thomas Pantelis
*/
+@RunWith(MockitoJUnitRunner.StrictStubs.class)
public class RaftActorSnapshotMessageSupportTest {
-
private static final Logger LOG = LoggerFactory.getLogger(RaftActorRecoverySupportTest.class);
@Mock
@Before
public void setup() {
- MockitoAnnotations.initMocks(this);
-
context = new RaftActorContextImpl(mockRaftActorRef, null, "test",
- new ElectionTermImpl(mockPersistence, "test", LOG),
- -1, -1, Collections.<String,String>emptyMap(), configParams, mockPersistence, LOG) {
+ new ElectionTermImpl(mockPersistence, "test", LOG), -1, -1, Map.of(),
+ configParams, mockPersistence, applyState -> { }, LOG, MoreExecutors.directExecutor()) {
@Override
public SnapshotManager getSnapshotManager() {
return mockSnapshotManager;
}
};
- support = new RaftActorSnapshotMessageSupport(mockPersistence, context, mockBehavior, mockCohort);
+ support = new RaftActorSnapshotMessageSupport(context, mockCohort);
- doReturn(true).when(mockPersistence).isRecoveryApplicable();
-
- context.setReplicatedLog(ReplicatedLogImpl.newInstance(context, mockPersistence, mockBehavior));
+ context.setReplicatedLog(ReplicatedLogImpl.newInstance(context));
}
- private void sendMessageToSupport(Object message) {
+ private void sendMessageToSupport(final Object message) {
sendMessageToSupport(message, true);
}
- private void sendMessageToSupport(Object message, boolean expHandled) {
- boolean handled = support.handleSnapshotMessage(message);
+ private void sendMessageToSupport(final Object message, final boolean expHandled) {
+ boolean handled = support.handleSnapshotMessage(message, mockRaftActorRef);
assertEquals("complete", expHandled, handled);
}
@Test
public void testOnApplySnapshot() {
- ReplicatedLog replicatedLog = context.getReplicatedLog();
- replicatedLog.append(new MockReplicatedLogEntry(1, 1, new MockPayload("1")));
-
- byte[] snapshotBytes = {1,2,3,4,5};
-
- ReplicatedLogEntry unAppliedEntry = new MockReplicatedLogEntry(1, 2, new MockPayload("2"));
-
long lastAppliedDuringSnapshotCapture = 1;
long lastIndexDuringSnapshotCapture = 2;
+ byte[] snapshotBytes = {1,2,3,4,5};
- Snapshot snapshot = Snapshot.create(snapshotBytes, Arrays.asList(unAppliedEntry),
- lastIndexDuringSnapshotCapture, 1, lastAppliedDuringSnapshotCapture, 1);
-
- sendMessageToSupport(new ApplySnapshot(snapshot));
+ Snapshot snapshot = Snapshot.create(ByteState.of(snapshotBytes), List.of(),
+ lastIndexDuringSnapshotCapture, 1, lastAppliedDuringSnapshotCapture, 1, -1, null, null);
- assertEquals("Journal log size", 1, context.getReplicatedLog().size());
- assertEquals("Last index", lastIndexDuringSnapshotCapture, context.getReplicatedLog().lastIndex());
- assertEquals("Last applied", lastAppliedDuringSnapshotCapture, context.getLastApplied());
- assertEquals("Commit index", -1, context.getCommitIndex());
- assertEquals("Snapshot term", 1, context.getReplicatedLog().getSnapshotTerm());
- assertEquals("Snapshot index", lastAppliedDuringSnapshotCapture, context.getReplicatedLog().getSnapshotIndex());
+ ApplySnapshot applySnapshot = new ApplySnapshot(snapshot);
+ sendMessageToSupport(applySnapshot);
- verify(mockCohort).applySnapshot(snapshotBytes);
+ verify(mockSnapshotManager).apply(applySnapshot);
}
@Test
public void testOnCaptureSnapshotReply() {
+ ByteState state = ByteState.of(new byte[]{1,2,3,4,5});
+ Optional<OutputStream> optionalStream = Optional.of(mock(OutputStream.class));
+ sendMessageToSupport(new CaptureSnapshotReply(state, optionalStream));
- byte[] snapshot = {1,2,3,4,5};
- sendMessageToSupport(new CaptureSnapshotReply(snapshot));
-
- verify(mockSnapshotManager).persist(same(mockPersistence), same(snapshot), same(mockBehavior), anyLong());
+ verify(mockSnapshotManager).persist(eq(state), eq(optionalStream), anyLong());
}
@Test
public void testOnSaveSnapshotSuccess() {
long sequenceNumber = 100;
- sendMessageToSupport(new SaveSnapshotSuccess(new SnapshotMetadata("foo", sequenceNumber, 1234L)));
+ long timeStamp = 1234L;
+ sendMessageToSupport(new SaveSnapshotSuccess(new SnapshotMetadata("foo", sequenceNumber, timeStamp)));
- verify(mockSnapshotManager).commit(mockPersistence, sequenceNumber);
+ verify(mockSnapshotManager).commit(eq(sequenceNumber), eq(timeStamp));
}
@Test
sendMessageToSupport(RaftActorSnapshotMessageSupport.COMMIT_SNAPSHOT);
- verify(mockSnapshotManager).commit(mockPersistence, -1);
+ verify(mockSnapshotManager).commit(eq(-1L), eq(-1L));
}
@Test