Fix checkstyle warnings in netty-threadgroup-config.
[controller.git] / opendaylight / md-sal / sal-akka-raft / src / test / java / org / opendaylight / controller / cluster / raft / AbstractReplicatedLogImplTest.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.controller.cluster.raft;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertNull;
13 import static org.junit.Assert.assertTrue;
14 import java.util.HashMap;
15 import java.util.List;
16 import java.util.Map;
17 import org.junit.After;
18 import org.junit.Assert;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.opendaylight.controller.cluster.raft.MockRaftActorContext.MockPayload;
22 import org.opendaylight.controller.cluster.raft.MockRaftActorContext.MockReplicatedLogEntry;
23 /**
24 *
25 */
26 public class AbstractReplicatedLogImplTest {
27
28     private MockAbstractReplicatedLogImpl replicatedLogImpl;
29
30     @Before
31     public void setUp() {
32         replicatedLogImpl = new MockAbstractReplicatedLogImpl();
33         // create a set of initial entries in the in-memory log
34         replicatedLogImpl.append(new MockReplicatedLogEntry(1, 0, new MockPayload("A")));
35         replicatedLogImpl.append(new MockReplicatedLogEntry(1, 1, new MockPayload("B")));
36         replicatedLogImpl.append(new MockReplicatedLogEntry(1, 2, new MockPayload("C")));
37         replicatedLogImpl.append(new MockReplicatedLogEntry(2, 3, new MockPayload("D")));
38
39     }
40
41     @After
42     public void tearDown() {
43         replicatedLogImpl.journal.clear();
44         replicatedLogImpl.setSnapshotIndex(-1);
45         replicatedLogImpl.setSnapshotTerm(-1);
46         replicatedLogImpl = null;
47     }
48
49     @Test
50     public void testIndexOperations() {
51
52         // check if the values returned are correct, with snapshotIndex = -1
53         assertEquals("B", replicatedLogImpl.get(1).getData().toString());
54         assertEquals("D", replicatedLogImpl.last().getData().toString());
55         assertEquals(3, replicatedLogImpl.lastIndex());
56         assertEquals(2, replicatedLogImpl.lastTerm());
57         assertEquals(2, replicatedLogImpl.getFrom(2).size());
58         assertEquals(4, replicatedLogImpl.size());
59         assertTrue(replicatedLogImpl.isPresent(2));
60         assertFalse(replicatedLogImpl.isPresent(4));
61         assertFalse(replicatedLogImpl.isInSnapshot(2));
62
63         // now create a snapshot of 3 entries, with 1 unapplied entry left in the log
64         // It removes the entries which have made it to snapshot
65         // and updates the snapshot index and term
66         Map<Long, String> state = takeSnapshot(3);
67
68         // check the values after the snapshot.
69         // each index value passed in the test is the logical index (log entry index)
70         // which gets mapped to the list's physical index
71         assertEquals("D", replicatedLogImpl.get(3).getData().toString());
72         assertEquals("D", replicatedLogImpl.last().getData().toString());
73         assertNull(replicatedLogImpl.get(1));
74         assertEquals(3, replicatedLogImpl.lastIndex());
75         assertEquals(2, replicatedLogImpl.lastTerm());
76         assertEquals(0, replicatedLogImpl.getFrom(2).size());
77         assertEquals(1, replicatedLogImpl.size());
78         assertFalse(replicatedLogImpl.isPresent(2));
79         assertTrue(replicatedLogImpl.isPresent(3));
80         assertFalse(replicatedLogImpl.isPresent(4));
81         assertTrue(replicatedLogImpl.isInSnapshot(2));
82
83         // append few more entries
84         replicatedLogImpl.append(new MockReplicatedLogEntry(2, 4, new MockPayload("E")));
85         replicatedLogImpl.append(new MockReplicatedLogEntry(2, 5, new MockPayload("F")));
86         replicatedLogImpl.append(new MockReplicatedLogEntry(3, 6, new MockPayload("G")));
87         replicatedLogImpl.append(new MockReplicatedLogEntry(3, 7, new MockPayload("H")));
88
89         // check their values as well
90         assertEquals(5, replicatedLogImpl.size());
91         assertEquals("D", replicatedLogImpl.get(3).getData().toString());
92         assertEquals("E", replicatedLogImpl.get(4).getData().toString());
93         assertEquals("H", replicatedLogImpl.last().getData().toString());
94         assertEquals(3, replicatedLogImpl.lastTerm());
95         assertEquals(7, replicatedLogImpl.lastIndex());
96         assertTrue(replicatedLogImpl.isPresent(7));
97         assertFalse(replicatedLogImpl.isInSnapshot(7));
98         assertEquals(1, replicatedLogImpl.getFrom(7).size());
99         assertEquals(2, replicatedLogImpl.getFrom(6).size());
100
101         // take a second snapshot with 5 entries with 0 unapplied entries left in the log
102         state = takeSnapshot(5);
103
104         assertEquals(0, replicatedLogImpl.size());
105         assertNull(replicatedLogImpl.last());
106         assertNull(replicatedLogImpl.get(7));
107         assertNull(replicatedLogImpl.get(1));
108         assertFalse(replicatedLogImpl.isPresent(7));
109         assertTrue(replicatedLogImpl.isInSnapshot(7));
110         assertEquals(0, replicatedLogImpl.getFrom(7).size());
111         assertEquals(0, replicatedLogImpl.getFrom(6).size());
112
113     }
114
115     @Test
116     public void testGetFromWithMax(){
117         List<ReplicatedLogEntry> from = replicatedLogImpl.getFrom(0, 1);
118         Assert.assertEquals(1, from.size());
119         Assert.assertEquals(1, from.get(0).getTerm());
120
121         from = replicatedLogImpl.getFrom(0, 20);
122         Assert.assertEquals(4, from.size());
123         Assert.assertEquals(2, from.get(3).getTerm());
124
125         from = replicatedLogImpl.getFrom(1, 2);
126         Assert.assertEquals(2, from.size());
127         Assert.assertEquals(1, from.get(1).getTerm());
128
129     }
130
131     // create a snapshot for test
132     public Map<Long, String> takeSnapshot(final int numEntries) {
133         Map<Long, String> map = new HashMap<>(numEntries);
134         List<ReplicatedLogEntry> entries = replicatedLogImpl.getEntriesTill(numEntries);
135         for (ReplicatedLogEntry entry : entries) {
136             map.put(entry.getIndex(), entry.getData().toString());
137         }
138
139         int term = (int) replicatedLogImpl.lastTerm();
140         int lastIndex = (int) entries.get(entries.size() - 1).getIndex();
141         entries.clear();
142         replicatedLogImpl.setSnapshotTerm(term);
143         replicatedLogImpl.setSnapshotIndex(lastIndex);
144
145         return map;
146
147     }
148     class MockAbstractReplicatedLogImpl extends AbstractReplicatedLogImpl {
149         @Override
150         public void appendAndPersist(final ReplicatedLogEntry replicatedLogEntry) {
151         }
152
153         @Override
154         public void removeFromAndPersist(final long index) {
155         }
156
157         @Override
158         public void setSnapshotIndex(final long snapshotIndex) {
159             this.snapshotIndex = snapshotIndex;
160         }
161
162         @Override
163         public void setSnapshotTerm(final long snapshotTerm) {
164             this.snapshotTerm = snapshotTerm;
165         }
166
167         public List<ReplicatedLogEntry> getEntriesTill(final int index) {
168             return journal.subList(0, index);
169         }
170     }
171 }