+ 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("B", from.get(1).getData().toString());
+ assertEquals("C", from.get(2).getData().toString());
+ assertEquals("D", from.get(3).getData().toString());
+
+ // Pre-calculate sizing information for use with capping
+ final int sizeB = from.get(1).serializedSize();
+ final int sizeC = from.get(2).serializedSize();
+ final int sizeD = from.get(3).serializedSize();
+
+ 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, sizeB + sizeC);
+ assertEquals(2, from.size());
+ assertEquals("B", from.get(0).getData().toString());
+ assertEquals("C", from.get(1).getData().toString());
+
+ from = replicatedLogImpl.getFrom(1, 3, sizeB + sizeC + sizeD);
+ 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, sizeB + sizeC + sizeD);
+ 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 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(8, replicatedLogImpl.size());
+ assertEquals(-1, replicatedLogImpl.getSnapshotIndex());
+ assertEquals(-1, replicatedLogImpl.getSnapshotTerm());
+
+ replicatedLogImpl.snapshotPreCommit(4, 2);
+ assertEquals(3, replicatedLogImpl.size());
+ assertEquals(4, replicatedLogImpl.getSnapshotIndex());
+ assertEquals(2, replicatedLogImpl.getSnapshotTerm());
+
+ replicatedLogImpl.snapshotPreCommit(6, 3);
+ assertEquals(1, replicatedLogImpl.size());
+ assertEquals(6, replicatedLogImpl.getSnapshotIndex());
+ assertEquals(3, replicatedLogImpl.getSnapshotTerm());
+
+ replicatedLogImpl.snapshotPreCommit(7, 3);
+ assertEquals(0, replicatedLogImpl.size());
+ assertEquals(7, replicatedLogImpl.getSnapshotIndex());
+ assertEquals(3, replicatedLogImpl.getSnapshotTerm());
+
+ //running it again on an empty list should not throw exception
+ replicatedLogImpl.snapshotPreCommit(7, 3);
+ assertEquals(0, replicatedLogImpl.size());
+ assertEquals(7, replicatedLogImpl.getSnapshotIndex());
+ assertEquals(3, replicatedLogImpl.getSnapshotTerm());
+ }
+
+ @Test
+ public void testSnapshotCommit() {