X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-akka-raft%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fcluster%2Fraft%2FReplicatedLogImplTest.java;h=c2321caff420b68cc49cbb81562964e826723302;hp=fbe6fc4501f6b6b62b60490036e005e8ca065207;hb=fe8352361d49c76a0ecc80162a2b8258d35198b5;hpb=9704d3296de473f2a63ca479b9116debffb09060 diff --git a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/ReplicatedLogImplTest.java b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/ReplicatedLogImplTest.java index fbe6fc4501..c2321caff4 100644 --- a/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/ReplicatedLogImplTest.java +++ b/opendaylight/md-sal/sal-akka-raft/src/test/java/org/opendaylight/controller/cluster/raft/ReplicatedLogImplTest.java @@ -8,14 +8,13 @@ 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; @@ -30,9 +29,9 @@ import org.mockito.MockitoAnnotations; import org.mockito.internal.matchers.Same; 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.opendaylight.controller.cluster.raft.persisted.SimpleReplicatedLogEntry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,9 +49,6 @@ public class ReplicatedLogImplTest { @Mock private RaftActorBehavior mockBehavior; - @Mock - private SnapshotManager mockSnapshotManager; - private RaftActorContext context; private final DefaultConfigParamsImpl configParams = new DefaultConfigParamsImpl(); @@ -62,22 +58,21 @@ public class ReplicatedLogImplTest { context = new RaftActorContextImpl(null, null, "test", new ElectionTermImpl(mockPersistence, "test", LOG), - -1, -1, Collections.emptyMap(), configParams, mockPersistence, LOG) { - @Override - public SnapshotManager getSnapshotManager() { - return mockSnapshotManager; - } - }; + -1, -1, Collections.emptyMap(), configParams, mockPersistence, LOG); } private void verifyPersist(Object message) throws Exception { - verifyPersist(message, new Same(message)); + verifyPersist(message, new Same(message), true); } @SuppressWarnings({ "unchecked", "rawtypes" }) - private void verifyPersist(Object message, Matcher matcher) throws Exception { + private void verifyPersist(Object message, Matcher matcher, boolean async) throws Exception { ArgumentCaptor procedure = ArgumentCaptor.forClass(Procedure.class); - verify(mockPersistence).persist(Matchers.argThat(matcher), procedure.capture()); + if (async) { + verify(mockPersistence).persistAsync(Matchers.argThat(matcher), procedure.capture()); + } else { + verify(mockPersistence).persist(Matchers.argThat(matcher), procedure.capture()); + } procedure.getValue().apply(message); } @@ -85,50 +80,71 @@ public class ReplicatedLogImplTest { @SuppressWarnings("unchecked") @Test public void testAppendAndPersistExpectingNoCapture() throws Exception { - ReplicatedLog log = ReplicatedLogImpl.newInstance(context, mockBehavior); + ReplicatedLog log = ReplicatedLogImpl.newInstance(context); - MockReplicatedLogEntry logEntry = new MockReplicatedLogEntry(1, 1, new MockPayload("1")); + ReplicatedLogEntry logEntry1 = new SimpleReplicatedLogEntry(1, 1, new MockPayload("1")); - log.appendAndPersist(logEntry); + log.appendAndPersist(logEntry1, null, true); - verifyPersist(logEntry); + verifyPersist(logEntry1); assertEquals("size", 1, log.size()); reset(mockPersistence); + ReplicatedLogEntry logEntry2 = new SimpleReplicatedLogEntry(2, 1, new MockPayload("2")); Procedure mockCallback = Mockito.mock(Procedure.class); - log.appendAndPersist(logEntry, mockCallback); + log.appendAndPersist(logEntry2, mockCallback, true); - verifyPersist(logEntry); + verifyPersist(logEntry2); - verify(mockCallback).apply(same(logEntry)); - verifyNoMoreInteractions(mockSnapshotManager); + verify(mockCallback).apply(same(logEntry2)); assertEquals("size", 2, log.size()); } + @SuppressWarnings("unchecked") + @Test + public void testAppendAndPersisWithDuplicateEntry() throws Exception { + ReplicatedLog log = ReplicatedLogImpl.newInstance(context); + + Procedure mockCallback = Mockito.mock(Procedure.class); + ReplicatedLogEntry logEntry = new SimpleReplicatedLogEntry(1, 1, new MockPayload("1")); + + log.appendAndPersist(logEntry, mockCallback, true); + + verifyPersist(logEntry); + + assertEquals("size", 1, log.size()); + + reset(mockPersistence, mockCallback); + + log.appendAndPersist(logEntry, mockCallback, true); + + verifyNoMoreInteractions(mockPersistence, mockCallback); + + assertEquals("size", 1, log.size()); + } + @Test public void testAppendAndPersistExpectingCaptureDueToJournalCount() throws Exception { configParams.setSnapshotBatchCount(2); doReturn(1L).when(mockBehavior).getReplicatedToAllIndex(); - ReplicatedLog log = ReplicatedLogImpl.newInstance(context, 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 ReplicatedLogEntry logEntry1 = new SimpleReplicatedLogEntry(2, 1, new MockPayload("2")); + final ReplicatedLogEntry logEntry2 = new SimpleReplicatedLogEntry(3, 1, new MockPayload("3")); - log.appendAndPersist(logEntry1); + log.appendAndPersist(logEntry1, null, true); verifyPersist(logEntry1); - verifyNoMoreInteractions(mockSnapshotManager); reset(mockPersistence); - log.appendAndPersist(logEntry2); + log.appendAndPersist(logEntry2, null, true); verifyPersist(logEntry2); - verify(mockSnapshotManager).capture(same(logEntry2), eq(1L)); assertEquals("size", 2, log.size()); } @@ -137,50 +153,39 @@ public class ReplicatedLogImplTest { public void testAppendAndPersistExpectingCaptureDueToDataSize() throws Exception { doReturn(1L).when(mockBehavior).getReplicatedToAllIndex(); - context.setTotalMemoryRetriever(new Supplier() { - @Override - public Long get() { - return 100L; - } - }); + context.setTotalMemoryRetriever(() -> 100); - ReplicatedLog log = ReplicatedLogImpl.newInstance(context, mockBehavior); + ReplicatedLog log = ReplicatedLogImpl.newInstance(context); int dataSize = 600; - MockReplicatedLogEntry logEntry = new MockReplicatedLogEntry(1, 2, new MockPayload("2", dataSize)); + ReplicatedLogEntry logEntry = new SimpleReplicatedLogEntry(2, 1, new MockPayload("2", dataSize)); - doReturn(true).when(mockSnapshotManager).capture(same(logEntry), eq(1L)); - - log.appendAndPersist(logEntry); + log.appendAndPersist(logEntry, null, true); verifyPersist(logEntry); - verify(mockSnapshotManager).capture(same(logEntry), eq(1L)); - - reset(mockPersistence, mockSnapshotManager); + reset(mockPersistence); - logEntry = new MockReplicatedLogEntry(1, 3, new MockPayload("3", 5)); + logEntry = new SimpleReplicatedLogEntry(3, 1, new MockPayload("3", 5)); - log.appendAndPersist(logEntry); + log.appendAndPersist(logEntry, null, true); verifyPersist(logEntry); - verifyNoMoreInteractions(mockSnapshotManager); - assertEquals("size", 2, log.size()); } @Test public void testRemoveFromAndPersist() throws Exception { - ReplicatedLog log = ReplicatedLogImpl.newInstance(context, mockBehavior); + ReplicatedLog log = ReplicatedLogImpl.newInstance(context); - log.append(new MockReplicatedLogEntry(1, 0, new MockPayload("0"))); - log.append(new MockReplicatedLogEntry(1, 1, new MockPayload("1"))); - log.append(new MockReplicatedLogEntry(1, 2, new MockPayload("2"))); + log.append(new SimpleReplicatedLogEntry(0, 1, new MockPayload("0"))); + log.append(new SimpleReplicatedLogEntry(1, 1, new MockPayload("1"))); + log.append(new SimpleReplicatedLogEntry(2, 1, new MockPayload("2"))); log.removeFromAndPersist(1); DeleteEntries deleteEntries = new DeleteEntries(1); - verifyPersist(deleteEntries, match(deleteEntries)); + verifyPersist(deleteEntries, match(deleteEntries), false); assertEquals("size", 1, log.size()); @@ -191,11 +196,11 @@ public class ReplicatedLogImplTest { verifyNoMoreInteractions(mockPersistence); } - public Matcher match(final DeleteEntries actual){ + public Matcher match(final DeleteEntries actual) { return new BaseMatcher() { @Override - public boolean matches(Object o) { - DeleteEntries other = (DeleteEntries) o; + public boolean matches(Object obj) { + DeleteEntries other = (DeleteEntries) obj; return actual.getFromIndex() == other.getFromIndex(); }