* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
-
package org.opendaylight.controller.cluster.raft;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyLong;
-import static org.mockito.Matchers.anyObject;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import akka.actor.ActorRef;
import akka.persistence.SnapshotSelectionCriteria;
import java.io.OutputStream;
-import java.util.Arrays;
+import java.util.List;
import java.util.Optional;
import java.util.function.Consumer;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnitRunner;
import org.opendaylight.controller.cluster.DataPersistenceProvider;
import org.opendaylight.controller.cluster.io.FileBackedOutputStreamFactory;
import org.opendaylight.controller.cluster.raft.SnapshotManager.LastAppliedTermInformationReader;
import org.opendaylight.controller.cluster.raft.utils.MessageCollectorActor;
import org.slf4j.LoggerFactory;
+@RunWith(MockitoJUnitRunner.StrictStubs.class)
public class SnapshotManagerTest extends AbstractActorTest {
@Mock
@Before
public void setUp() {
- MockitoAnnotations.initMocks(this);
-
doReturn(false).when(mockRaftActorContext).hasFollowers();
doReturn(mockConfigParams).when(mockRaftActorContext).getConfigParams();
doReturn(10L).when(mockConfigParams).getSnapshotBatchCount();
@Test
public void testConstruction() {
- assertEquals(false, snapshotManager.isCapturing());
+ assertFalse(snapshotManager.isCapturing());
}
@SuppressWarnings({ "unchecked", "rawtypes" })
snapshotManager.captureToInstall(new SimpleReplicatedLogEntry(0, 1,
new MockRaftActorContext.MockPayload()), 0, "follower-1");
- assertEquals(true, snapshotManager.isCapturing());
+ assertTrue(snapshotManager.isCapturing());
ArgumentCaptor<Optional> outputStream = ArgumentCaptor.forClass(Optional.class);
verify(mockProcedure).accept(outputStream.capture());
assertTrue(capture);
- assertEquals(true, snapshotManager.isCapturing());
+ assertTrue(snapshotManager.isCapturing());
ArgumentCaptor<Optional> outputStream = ArgumentCaptor.forClass(Optional.class);
verify(mockProcedure).accept(outputStream.capture());
assertTrue(capture);
- assertEquals(true, snapshotManager.isCapturing());
+ assertTrue(snapshotManager.isCapturing());
ArgumentCaptor<Optional> outputStream = ArgumentCaptor.forClass(Optional.class);
verify(mockProcedure).accept(outputStream.capture());
CaptureSnapshot captureSnapshot = snapshotManager.getCaptureSnapshot();
// LastIndex and LastTerm are picked up from the lastLogEntry
- assertEquals(-1L, captureSnapshot.getLastIndex());
- assertEquals(-1L, captureSnapshot.getLastTerm());
+ assertEquals(0, captureSnapshot.getLastIndex());
+ assertEquals(0, captureSnapshot.getLastTerm());
// Since the actor does not have any followers (no peer addresses) lastApplied will be from lastLogEntry
- assertEquals(-1L, captureSnapshot.getLastAppliedIndex());
- assertEquals(-1L, captureSnapshot.getLastAppliedTerm());
+ assertEquals(0, captureSnapshot.getLastAppliedIndex());
+ assertEquals(0, captureSnapshot.getLastAppliedTerm());
//
assertEquals(-1L, captureSnapshot.getReplicatedToAllIndex());
@Test
public void testCaptureWithCreateProcedureError() {
- doThrow(new RuntimeException("mock")).when(mockProcedure).accept(anyObject());
+ doThrow(new RuntimeException("mock")).when(mockProcedure).accept(any());
boolean capture = snapshotManager.capture(new SimpleReplicatedLogEntry(9, 1,
new MockRaftActorContext.MockPayload()), 9);
assertFalse(capture);
- assertEquals(false, snapshotManager.isCapturing());
+ assertFalse(snapshotManager.isCapturing());
- verify(mockProcedure).accept(anyObject());
+ verify(mockProcedure).accept(any());
}
@SuppressWarnings("unchecked")
assertTrue(capture);
- verify(mockProcedure).accept(anyObject());
+ verify(mockProcedure).accept(any());
reset(mockProcedure);
assertFalse(capture);
- verify(mockProcedure, never()).accept(anyObject());
+ verify(mockProcedure, never()).accept(any());
}
@Test
8L, 2L, new MockRaftActorContext.MockPayload());
doReturn(lastAppliedEntry).when(mockReplicatedLog).get(8L);
- doReturn(Arrays.asList(lastLogEntry)).when(mockReplicatedLog).getFrom(9L);
+ doReturn(List.of(lastLogEntry)).when(mockReplicatedLog).getFrom(9L);
// when replicatedToAllIndex = -1
snapshotManager.capture(lastLogEntry, -1);
assertEquals("getLastAppliedTerm", 2L, snapshot.getLastAppliedTerm());
assertEquals("getLastAppliedIndex", 8L, snapshot.getLastAppliedIndex());
assertEquals("getState", snapshotState, snapshot.getState());
- assertEquals("getUnAppliedEntries", Arrays.asList(lastLogEntry), snapshot.getUnAppliedEntries());
+ assertEquals("getUnAppliedEntries", List.of(lastLogEntry), snapshot.getUnAppliedEntries());
assertEquals("electionTerm", mockElectionTerm.getCurrentTerm(), snapshot.getElectionTerm());
assertEquals("electionVotedFor", mockElectionTerm.getVotedFor(), snapshot.getElectionVotedFor());
doReturn(45L).when(mockReplicatedLog).getSnapshotIndex();
doReturn(6L).when(mockReplicatedLog).getSnapshotTerm();
ReplicatedLogEntry replicatedLogEntry = mock(ReplicatedLogEntry.class);
+ doReturn(null).when(mockReplicatedLog).get(0);
doReturn(replicatedLogEntry).when(mockReplicatedLog).get(9);
doReturn(6L).when(replicatedLogEntry).getTerm();
doReturn(9L).when(replicatedLogEntry).getIndex();
long replicatedToAllIndex = 1;
ReplicatedLogEntry replicatedLogEntry = mock(ReplicatedLogEntry.class);
+ doReturn(null).when(mockReplicatedLog).get(0);
doReturn(replicatedLogEntry).when(mockReplicatedLog).get(replicatedToAllIndex);
doReturn(6L).when(replicatedLogEntry).getTerm();
doReturn(replicatedToAllIndex).when(replicatedLogEntry).getIndex();
@Test
public void testPersistSendInstallSnapshot() throws Exception {
doReturn(Integer.MAX_VALUE).when(mockReplicatedLog).dataSize();
- doNothing().when(mockProcedure).accept(anyObject());
+ doNothing().when(mockProcedure).accept(any());
// when replicatedToAllIndex = -1
boolean capture = snapshotManager.captureToInstall(new SimpleReplicatedLogEntry(9, 6,
Optional<OutputStream> installSnapshotStream = installSnapshotStreamCapture.getValue();
assertEquals("isPresent", true, installSnapshotStream.isPresent());
- installSnapshotStream.get().write(snapshotState.getBytes());
+ installSnapshotStream.orElseThrow().write(snapshotState.getBytes());
snapshotManager.persist(snapshotState, installSnapshotStream, Runtime.getRuntime().totalMemory());
- assertEquals(true, snapshotManager.isCapturing());
+ assertTrue(snapshotManager.isCapturing());
verify(mockDataPersistenceProvider).saveSnapshot(any(Snapshot.class));
snapshotManager.persist(ByteState.empty(), Optional.empty(), Runtime.getRuntime().totalMemory());
- assertEquals(true, snapshotManager.isCapturing());
+ assertTrue(snapshotManager.isCapturing());
snapshotManager.commit(100L, 1234L);
- assertEquals(false, snapshotManager.isCapturing());
+ assertFalse(snapshotManager.isCapturing());
verify(mockReplicatedLog).snapshotCommit();
verify(mockDataPersistenceProvider).deleteSnapshots(criteriaCaptor.capture());
- assertEquals(100L, criteriaCaptor.getValue().maxSequenceNr());
+ assertEquals(Long.MAX_VALUE, criteriaCaptor.getValue().maxSequenceNr());
assertEquals(1233L, criteriaCaptor.getValue().maxTimestamp());
MessageCollectorActor.expectFirstMatching(actorRef, SnapshotComplete.class);
assertEquals("return index", 10L, retIndex);
verify(mockReplicatedLog).snapshotPreCommit(10, 5);
- verify(mockReplicatedLog).snapshotCommit();
+ verify(mockReplicatedLog).snapshotCommit(false);
verify(mockRaftActorBehavior, never()).setReplicatedToAllIndex(anyLong());
}
public void testTrimLogWhenLastAppliedNotSet() {
doReturn(-1L).when(mockRaftActorContext).getLastApplied();
- ReplicatedLogEntry replicatedLogEntry = mock(ReplicatedLogEntry.class);
- doReturn(true).when(mockReplicatedLog).isPresent(10);
- doReturn(replicatedLogEntry).when(mockReplicatedLog).get(10);
- doReturn(5L).when(replicatedLogEntry).getTerm();
-
long retIndex = snapshotManager.trimLog(10);
assertEquals("return index", -1L, retIndex);
verify(mockReplicatedLog, never()).snapshotPreCommit(anyLong(), anyLong());
- verify(mockReplicatedLog, never()).snapshotCommit();
+ verify(mockReplicatedLog, never()).snapshotCommit(false);
verify(mockRaftActorBehavior, never()).setReplicatedToAllIndex(anyLong());
}
public void testTrimLogWhenLastAppliedZero() {
doReturn(0L).when(mockRaftActorContext).getLastApplied();
- ReplicatedLogEntry replicatedLogEntry = mock(ReplicatedLogEntry.class);
- doReturn(true).when(mockReplicatedLog).isPresent(10);
- doReturn(replicatedLogEntry).when(mockReplicatedLog).get(10);
- doReturn(5L).when(replicatedLogEntry).getTerm();
-
long retIndex = snapshotManager.trimLog(10);
assertEquals("return index", -1L, retIndex);
verify(mockReplicatedLog, never()).snapshotPreCommit(anyLong(), anyLong());
- verify(mockReplicatedLog, never()).snapshotCommit();
+ verify(mockReplicatedLog, never()).snapshotCommit(false);
verify(mockRaftActorBehavior, never()).setReplicatedToAllIndex(anyLong());
}
assertEquals("return index", -1L, retIndex);
verify(mockReplicatedLog, never()).snapshotPreCommit(anyLong(), anyLong());
- verify(mockReplicatedLog, never()).snapshotCommit();
+ verify(mockReplicatedLog, never()).snapshotCommit(false);
// Trim index is greater than replicatedToAllIndex so should update it.
verify(mockRaftActorBehavior).setReplicatedToAllIndex(10L);
assertTrue(capture);
- assertEquals(true, snapshotManager.isCapturing());
-
- ReplicatedLogEntry replicatedLogEntry = mock(ReplicatedLogEntry.class);
- doReturn(20L).when(mockRaftActorContext).getLastApplied();
- doReturn(true).when(mockReplicatedLog).isPresent(10);
- doReturn(replicatedLogEntry).when(mockReplicatedLog).get(10);
- doReturn(5L).when(replicatedLogEntry).getTerm();
+ assertTrue(snapshotManager.isCapturing());
snapshotManager.trimLog(10);
verify(mockReplicatedLog, never()).snapshotPreCommit(anyLong(), anyLong());
- verify(mockReplicatedLog, never()).snapshotCommit();
-
+ verify(mockReplicatedLog, never()).snapshotCommit(false);
}
@Test
assertTrue(capture);
- assertEquals(true, snapshotManager.isCapturing());
-
- ReplicatedLogEntry replicatedLogEntry = mock(ReplicatedLogEntry.class);
- doReturn(20L).when(mockRaftActorContext).getLastApplied();
- doReturn(true).when(mockReplicatedLog).isPresent(10);
- doReturn(replicatedLogEntry).when(mockReplicatedLog).get(10);
- doReturn(5L).when(replicatedLogEntry).getTerm();
+ assertTrue(snapshotManager.isCapturing());
snapshotManager.trimLog(10);
verify(mockReplicatedLog, never()).snapshotPreCommit(10, 5);
verify(mockReplicatedLog, never()).snapshotCommit();
-
}
@Test