import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
-import akka.japi.Procedure;
+
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.junit.Assert;
+import java.util.function.Consumer;
import org.junit.Before;
import org.junit.Test;
import org.opendaylight.controller.cluster.raft.MockRaftActorContext.MockPayload;
-import org.opendaylight.controller.cluster.raft.MockRaftActorContext.MockReplicatedLogEntry;
+import org.opendaylight.controller.cluster.raft.persisted.SimpleReplicatedLogEntry;
/**
-*
+* Unit tests for AbstractReplicatedLogImplTest.
*/
public class AbstractReplicatedLogImplTest {
public void setUp() {
replicatedLogImpl = new MockAbstractReplicatedLogImpl();
// create a set of initial entries in the in-memory log
- replicatedLogImpl.append(new MockReplicatedLogEntry(1, 0, new MockPayload("A")));
- replicatedLogImpl.append(new MockReplicatedLogEntry(1, 1, new MockPayload("B")));
- replicatedLogImpl.append(new MockReplicatedLogEntry(1, 2, new MockPayload("C")));
- replicatedLogImpl.append(new MockReplicatedLogEntry(2, 3, new MockPayload("D")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(0, 1, new MockPayload("A")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(1, 1, new MockPayload("B")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(2, 1, new MockPayload("C")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(3, 2, new MockPayload("D")));
}
assertEquals("lastTerm", -1, replicatedLogImpl.lastTerm());
assertEquals("isPresent", false, replicatedLogImpl.isPresent(0));
assertEquals("isInSnapshot", false, replicatedLogImpl.isInSnapshot(0));
- Assert.assertNull("get(0)", replicatedLogImpl.get(0));
- Assert.assertNull("last", replicatedLogImpl.last());
+ assertNull("get(0)", replicatedLogImpl.get(0));
+ assertNull("last", replicatedLogImpl.last());
- List<ReplicatedLogEntry> list = replicatedLogImpl.getFrom(0, 1);
+ List<ReplicatedLogEntry> list = replicatedLogImpl.getFrom(0, 1, ReplicatedLog.NO_MAX_SIZE);
assertEquals("getFrom size", 0, list.size());
assertEquals("removeFrom", -1, replicatedLogImpl.removeFrom(1));
assertTrue(replicatedLogImpl.isInSnapshot(2));
// append few more entries
- replicatedLogImpl.append(new MockReplicatedLogEntry(2, 4, new MockPayload("E")));
- replicatedLogImpl.append(new MockReplicatedLogEntry(2, 5, new MockPayload("F")));
- replicatedLogImpl.append(new MockReplicatedLogEntry(3, 6, new MockPayload("G")));
- replicatedLogImpl.append(new MockReplicatedLogEntry(3, 7, new MockPayload("H")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(4, 2, new MockPayload("E")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(5, 2, new MockPayload("F")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(6, 3, new MockPayload("G")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(7, 3, new MockPayload("H")));
// check their values as well
assertEquals(5, replicatedLogImpl.size());
}
@Test
- public void testGetFromWithMax(){
- List<ReplicatedLogEntry> from = replicatedLogImpl.getFrom(0, 1);
- Assert.assertEquals(1, from.size());
- Assert.assertEquals(1, from.get(0).getTerm());
-
- from = replicatedLogImpl.getFrom(0, 20);
- Assert.assertEquals(4, from.size());
- Assert.assertEquals(2, from.get(3).getTerm());
-
- from = replicatedLogImpl.getFrom(1, 2);
- Assert.assertEquals(2, from.size());
- Assert.assertEquals(1, from.get(1).getTerm());
-
+ public void testGetFromWithMax() {
+ List<ReplicatedLogEntry> from = replicatedLogImpl.getFrom(0, 1, ReplicatedLog.NO_MAX_SIZE);
+ assertEquals(1, from.size());
+ assertEquals("A", from.get(0).getData().toString());
+
+ from = replicatedLogImpl.getFrom(0, 20, ReplicatedLog.NO_MAX_SIZE);
+ assertEquals(4, from.size());
+ assertEquals("A", from.get(0).getData().toString());
+ assertEquals("D", from.get(3).getData().toString());
+
+ from = replicatedLogImpl.getFrom(1, 2, ReplicatedLog.NO_MAX_SIZE);
+ assertEquals(2, from.size());
+ assertEquals("B", from.get(0).getData().toString());
+ assertEquals("C", from.get(1).getData().toString());
+
+ from = replicatedLogImpl.getFrom(1, 3, 2);
+ assertEquals(2, from.size());
+ assertEquals("B", from.get(0).getData().toString());
+ assertEquals("C", from.get(1).getData().toString());
+
+ from = replicatedLogImpl.getFrom(1, 3, 3);
+ assertEquals(3, from.size());
+ assertEquals("B", from.get(0).getData().toString());
+ assertEquals("C", from.get(1).getData().toString());
+ assertEquals("D", from.get(2).getData().toString());
+
+ from = replicatedLogImpl.getFrom(1, 2, 3);
+ assertEquals(2, from.size());
+ assertEquals("B", from.get(0).getData().toString());
+ assertEquals("C", from.get(1).getData().toString());
+
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(4, 2, new MockPayload("12345")));
+ from = replicatedLogImpl.getFrom(4, 2, 2);
+ assertEquals(1, from.size());
+ assertEquals("12345", from.get(0).getData().toString());
}
@Test
public void testSnapshotPreCommit() {
//add 4 more entries
- replicatedLogImpl.append(new MockReplicatedLogEntry(2, 4, new MockPayload("E")));
- replicatedLogImpl.append(new MockReplicatedLogEntry(2, 5, new MockPayload("F")));
- replicatedLogImpl.append(new MockReplicatedLogEntry(3, 6, new MockPayload("G")));
- replicatedLogImpl.append(new MockReplicatedLogEntry(3, 7, new MockPayload("H")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(4, 2, new MockPayload("E")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(5, 2, new MockPayload("F")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(6, 3, new MockPayload("G")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(7, 3, new MockPayload("H")));
//sending negative values should not cause any changes
replicatedLogImpl.snapshotPreCommit(-1, -1);
assertEquals("lastIndex", 3, replicatedLogImpl.lastIndex());
assertEquals("lastTerm", 2, replicatedLogImpl.lastTerm());
- Assert.assertNull("get(0)", replicatedLogImpl.get(0));
- Assert.assertNull("get(1)", replicatedLogImpl.get(1));
- Assert.assertNotNull("get(2)", replicatedLogImpl.get(2));
- Assert.assertNotNull("get(3)", replicatedLogImpl.get(3));
+ assertNull("get(0)", replicatedLogImpl.get(0));
+ assertNull("get(1)", replicatedLogImpl.get(1));
+ assertNotNull("get(2)", replicatedLogImpl.get(2));
+ assertNotNull("get(3)", replicatedLogImpl.get(3));
}
@Test
assertEquals("dataSize", 4, replicatedLogImpl.dataSize());
assertEquals("getSnapshotIndex", -1, replicatedLogImpl.getSnapshotIndex());
assertEquals("getSnapshotTerm", -1, replicatedLogImpl.getSnapshotTerm());
- Assert.assertNotNull("get(0)", replicatedLogImpl.get(0));
- Assert.assertNotNull("get(3)", replicatedLogImpl.get(3));
+ assertNotNull("get(0)", replicatedLogImpl.get(0));
+ assertNotNull("get(3)", replicatedLogImpl.get(3));
}
@Test
assertTrue(replicatedLogImpl.isPresent(2));
assertTrue(replicatedLogImpl.isPresent(3));
- replicatedLogImpl.append(new MockReplicatedLogEntry(2, 4, new MockPayload("D")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(4, 2, new MockPayload("D")));
replicatedLogImpl.snapshotPreCommit(3, 2); //snapshot on 3
replicatedLogImpl.snapshotCommit();
replicatedLogImpl.snapshotCommit();
assertFalse(replicatedLogImpl.isPresent(4));
- replicatedLogImpl.append(new MockReplicatedLogEntry(2, 5, new MockPayload("D")));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(5, 2, new MockPayload("D")));
assertTrue(replicatedLogImpl.isPresent(5));
}
@Test
public void testRemoveFrom() {
- replicatedLogImpl.append(new MockReplicatedLogEntry(2, 4, new MockPayload("E", 2)));
- replicatedLogImpl.append(new MockReplicatedLogEntry(2, 5, new MockPayload("F", 3)));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(4, 2, new MockPayload("E", 2)));
+ replicatedLogImpl.append(new SimpleReplicatedLogEntry(5, 2, new MockPayload("F", 3)));
assertEquals("dataSize", 9, replicatedLogImpl.dataSize());
long lastIndex = 0;
long lastTerm = 0;
- for(int i = 0; i < numEntries; i++) {
+ for (int i = 0; i < numEntries; i++) {
ReplicatedLogEntry entry = replicatedLogImpl.getAtPhysicalIndex(i);
map.put(entry.getIndex(), entry.getData().toString());
lastIndex = entry.getIndex();
return map;
}
- class MockAbstractReplicatedLogImpl extends AbstractReplicatedLogImpl {
+
+ static class MockAbstractReplicatedLogImpl extends AbstractReplicatedLogImpl {
+ @Override
+ public boolean removeFromAndPersist(final long index) {
+ return true;
+ }
+
@Override
- public void appendAndPersist(final ReplicatedLogEntry replicatedLogEntry) {
+ public boolean appendAndPersist(final ReplicatedLogEntry replicatedLogEntry,
+ final Consumer<ReplicatedLogEntry> callback, final boolean doAsync) {
+ if (callback != null) {
+ callback.accept(replicatedLogEntry);
+ }
+ return true;
}
@Override
- public void removeFromAndPersist(final long index) {
+ public void captureSnapshotIfReady(final ReplicatedLogEntry replicatedLogEntry) {
+ // No-op
}
@Override
- public void appendAndPersist(ReplicatedLogEntry replicatedLogEntry, Procedure<ReplicatedLogEntry> callback) {
+ public boolean shouldCaptureSnapshot(final long logIndex) {
+ return false;
}
}
}