package org.opendaylight.controller.cluster.raft;
import static org.junit.Assert.assertEquals;
-import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.same;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
+
import akka.japi.Procedure;
-import com.google.common.base.Supplier;
import java.util.Collections;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
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.DeleteEntries;
import org.opendaylight.controller.cluster.raft.behaviors.RaftActorBehavior;
+import org.opendaylight.controller.cluster.raft.persisted.DeleteEntries;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Mock
private RaftActorBehavior mockBehavior;
- @Mock
- private SnapshotManager mockSnapshotManager;
-
private RaftActorContext context;
private final DefaultConfigParamsImpl configParams = new DefaultConfigParamsImpl();
context = new RaftActorContextImpl(null, null, "test",
new ElectionTermImpl(mockPersistence, "test", LOG),
- -1, -1, Collections.<String,String>emptyMap(), configParams, mockPersistence, LOG) {
- @Override
- public SnapshotManager getSnapshotManager() {
- return mockSnapshotManager;
- }
- };
+ -1, -1, Collections.<String,String>emptyMap(), configParams, mockPersistence, LOG);
}
private void verifyPersist(Object message) throws Exception {
@SuppressWarnings("unchecked")
@Test
public void testAppendAndPersistExpectingNoCapture() throws Exception {
- ReplicatedLog log = ReplicatedLogImpl.newInstance(context, mockPersistence, mockBehavior);
+ ReplicatedLog log = ReplicatedLogImpl.newInstance(context);
- MockReplicatedLogEntry logEntry = new MockReplicatedLogEntry(1, 1, new MockPayload("1"));
+ MockReplicatedLogEntry logEntry1 = new MockReplicatedLogEntry(1, 1, new MockPayload("1"));
- log.appendAndPersist(logEntry);
+ log.appendAndPersist(logEntry1);
- verifyPersist(logEntry);
+ verifyPersist(logEntry1);
assertEquals("size", 1, log.size());
reset(mockPersistence);
+ MockReplicatedLogEntry logEntry2 = new MockReplicatedLogEntry(1, 2, new MockPayload("2"));
Procedure<ReplicatedLogEntry> mockCallback = Mockito.mock(Procedure.class);
+ log.appendAndPersist(logEntry2, mockCallback);
+
+ verifyPersist(logEntry2);
+
+ verify(mockCallback).apply(same(logEntry2));
+
+ assertEquals("size", 2, log.size());
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void testAppendAndPersisWithDuplicateEntry() throws Exception {
+ ReplicatedLog log = ReplicatedLogImpl.newInstance(context);
+
+ Procedure<ReplicatedLogEntry> mockCallback = Mockito.mock(Procedure.class);
+ MockReplicatedLogEntry logEntry = new MockReplicatedLogEntry(1, 1, new MockPayload("1"));
+
log.appendAndPersist(logEntry, mockCallback);
verifyPersist(logEntry);
- verify(mockCallback).apply(same(logEntry));
- verifyNoMoreInteractions(mockSnapshotManager);
+ assertEquals("size", 1, log.size());
- assertEquals("size", 2, log.size());
+ reset(mockPersistence, mockCallback);
+
+ log.appendAndPersist(logEntry, mockCallback);
+
+ verifyNoMoreInteractions(mockPersistence, mockCallback);
+
+ assertEquals("size", 1, log.size());
}
@Test
doReturn(1L).when(mockBehavior).getReplicatedToAllIndex();
- ReplicatedLog log = ReplicatedLogImpl.newInstance(context, mockPersistence, mockBehavior);
+ ReplicatedLog log = ReplicatedLogImpl.newInstance(context);
- MockReplicatedLogEntry logEntry1 = new MockReplicatedLogEntry(1, 2, new MockPayload("2"));
- MockReplicatedLogEntry logEntry2 = new MockReplicatedLogEntry(1, 3, new MockPayload("3"));
+ final MockReplicatedLogEntry logEntry1 = new MockReplicatedLogEntry(1, 2, new MockPayload("2"));
+ final MockReplicatedLogEntry logEntry2 = new MockReplicatedLogEntry(1, 3, new MockPayload("3"));
log.appendAndPersist(logEntry1);
verifyPersist(logEntry1);
- verifyNoMoreInteractions(mockSnapshotManager);
reset(mockPersistence);
log.appendAndPersist(logEntry2);
verifyPersist(logEntry2);
- verify(mockSnapshotManager).capture(same(logEntry2), eq(1L));
assertEquals("size", 2, log.size());
}
public void testAppendAndPersistExpectingCaptureDueToDataSize() throws Exception {
doReturn(1L).when(mockBehavior).getReplicatedToAllIndex();
- context.setTotalMemoryRetriever(new Supplier<Long>() {
- @Override
- public Long get() {
- return 100L;
- }
- });
+ context.setTotalMemoryRetriever(() -> 100);
- ReplicatedLog log = ReplicatedLogImpl.newInstance(context, mockPersistence, mockBehavior);
+ ReplicatedLog log = ReplicatedLogImpl.newInstance(context);
int dataSize = 600;
MockReplicatedLogEntry logEntry = new MockReplicatedLogEntry(1, 2, new MockPayload("2", dataSize));
- doReturn(true).when(mockSnapshotManager).capture(same(logEntry), eq(1L));
-
log.appendAndPersist(logEntry);
verifyPersist(logEntry);
- verify(mockSnapshotManager).capture(same(logEntry), eq(1L));
-
- reset(mockPersistence, mockSnapshotManager);
+ reset(mockPersistence);
logEntry = new MockReplicatedLogEntry(1, 3, new MockPayload("3", 5));
log.appendAndPersist(logEntry);
verifyPersist(logEntry);
- verifyNoMoreInteractions(mockSnapshotManager);
-
assertEquals("size", 2, log.size());
}
@Test
public void testRemoveFromAndPersist() throws Exception {
- ReplicatedLog log = ReplicatedLogImpl.newInstance(context, mockPersistence, mockBehavior);
+ ReplicatedLog log = ReplicatedLogImpl.newInstance(context);
log.append(new MockReplicatedLogEntry(1, 0, new MockPayload("0")));
log.append(new MockReplicatedLogEntry(1, 1, new MockPayload("1")));
verifyNoMoreInteractions(mockPersistence);
}
- public Matcher<DeleteEntries> match(final DeleteEntries actual){
+ public Matcher<DeleteEntries> match(final DeleteEntries actual) {
return new BaseMatcher<DeleteEntries>() {
@Override
- public boolean matches(Object o) {
- DeleteEntries other = (DeleteEntries) o;
+ public boolean matches(Object obj) {
+ DeleteEntries other = (DeleteEntries) obj;
return actual.getFromIndex() == other.getFromIndex();
}