blob: 5aae159df8c9196549c9401aebcf65cf41c28581 [file] [log] [blame]
Madan Jampani778f7ad2014-11-05 22:46:15 -08001package org.onlab.onos.store.service.impl;
2
3import java.io.File;
4import java.io.IOException;
5import java.nio.file.Files;
6import java.util.List;
7
8import net.kuujo.copycat.internal.log.OperationEntry;
9import net.kuujo.copycat.log.Entry;
10import net.kuujo.copycat.log.Log;
11
12import org.junit.After;
13import org.junit.Assert;
14import org.junit.Before;
15import org.junit.Test;
16import org.onlab.onos.store.serializers.StoreSerializer;
17
18import com.google.common.testing.EqualsTester;
19
20/**
21 * Test the MapDBLog implementation.
22 */
23public class MapDBLogTest {
24
Yuta HIGUCHI91768e32014-11-22 05:06:35 -080025 private static final StoreSerializer SERIALIZER = ClusterMessagingProtocol.DB_SERIALIZER;
Madan Jampani778f7ad2014-11-05 22:46:15 -080026 private static final Entry TEST_ENTRY1 = new OperationEntry(1, "test1");
27 private static final Entry TEST_ENTRY2 = new OperationEntry(2, "test12");
28 private static final Entry TEST_ENTRY3 = new OperationEntry(3, "test123");
29 private static final Entry TEST_ENTRY4 = new OperationEntry(4, "test1234");
30
31 private static final Entry TEST_SNAPSHOT_ENTRY = new OperationEntry(5, "snapshot");
32
33 private static final long TEST_ENTRY1_SIZE = SERIALIZER.encode(TEST_ENTRY1).length;
34 private static final long TEST_ENTRY2_SIZE = SERIALIZER.encode(TEST_ENTRY2).length;
35 private static final long TEST_ENTRY3_SIZE = SERIALIZER.encode(TEST_ENTRY3).length;
36 private static final long TEST_ENTRY4_SIZE = SERIALIZER.encode(TEST_ENTRY4).length;
37
38 private static final long TEST_SNAPSHOT_ENTRY_SIZE = SERIALIZER.encode(TEST_SNAPSHOT_ENTRY).length;
39
Yuta HIGUCHI8ba3ac02014-11-17 17:07:54 -080040 private String dbFileName;
41
42
Madan Jampani778f7ad2014-11-05 22:46:15 -080043 @Before
44 public void setUp() throws Exception {
Yuta HIGUCHI8ba3ac02014-11-17 17:07:54 -080045 File logFile = File.createTempFile("mapdbTest", null);
46 dbFileName = logFile.getAbsolutePath();
Madan Jampani778f7ad2014-11-05 22:46:15 -080047 }
48
49 @After
50 public void tearDown() throws Exception {
Yuta HIGUCHI8ba3ac02014-11-17 17:07:54 -080051 Files.deleteIfExists(new File(dbFileName).toPath());
52 Files.deleteIfExists(new File(dbFileName + ".t").toPath());
53 Files.deleteIfExists(new File(dbFileName + ".p").toPath());
Madan Jampani778f7ad2014-11-05 22:46:15 -080054 }
55
56 @Test(expected = IllegalStateException.class)
57 public void testAssertOpen() {
Yuta HIGUCHI8ba3ac02014-11-17 17:07:54 -080058 Log log = new MapDBLog(dbFileName, SERIALIZER);
Madan Jampani778f7ad2014-11-05 22:46:15 -080059 log.size();
60 }
61
62 @Test
63 public void testAppendEntry() throws IOException {
Yuta HIGUCHI8ba3ac02014-11-17 17:07:54 -080064 Log log = new MapDBLog(dbFileName, SERIALIZER);
Madan Jampani778f7ad2014-11-05 22:46:15 -080065 log.open();
66 log.appendEntry(TEST_ENTRY1);
67 OperationEntry first = log.firstEntry();
68 OperationEntry last = log.lastEntry();
69 new EqualsTester()
70 .addEqualityGroup(first, last, TEST_ENTRY1)
71 .testEquals();
72 Assert.assertEquals(TEST_ENTRY1_SIZE, log.size());
73 Assert.assertEquals(1, log.firstIndex());
74 Assert.assertEquals(1, log.lastIndex());
75 }
76
77 @Test
78 public void testAppendEntries() throws IOException {
Yuta HIGUCHI8ba3ac02014-11-17 17:07:54 -080079 Log log = new MapDBLog(dbFileName, SERIALIZER);
Madan Jampani778f7ad2014-11-05 22:46:15 -080080 log.open();
81 log.appendEntries(TEST_ENTRY1, TEST_ENTRY2, TEST_ENTRY3);
82 OperationEntry first = log.firstEntry();
83 OperationEntry last = log.lastEntry();
84 new EqualsTester()
85 .addEqualityGroup(first, TEST_ENTRY1)
86 .addEqualityGroup(last, TEST_ENTRY3)
87 .testEquals();
88 Assert.assertEquals(TEST_ENTRY1_SIZE + TEST_ENTRY2_SIZE, TEST_ENTRY3_SIZE, log.size());
89 Assert.assertEquals(1, log.firstIndex());
90 Assert.assertEquals(3, log.lastIndex());
91 Assert.assertTrue(log.containsEntry(1));
92 Assert.assertTrue(log.containsEntry(2));
93 }
94
95 @Test
96 public void testDelete() throws IOException {
Yuta HIGUCHI8ba3ac02014-11-17 17:07:54 -080097 Log log = new MapDBLog(dbFileName, SERIALIZER);
Madan Jampani778f7ad2014-11-05 22:46:15 -080098 log.open();
99 log.appendEntries(TEST_ENTRY1, TEST_ENTRY2);
100 log.delete();
101 Assert.assertEquals(0, log.size());
102 Assert.assertTrue(log.isEmpty());
103 Assert.assertEquals(0, log.firstIndex());
104 Assert.assertNull(log.firstEntry());
105 Assert.assertEquals(0, log.lastIndex());
106 Assert.assertNull(log.lastEntry());
107 }
108
109 @Test
110 public void testGetEntries() throws IOException {
Yuta HIGUCHI8ba3ac02014-11-17 17:07:54 -0800111 Log log = new MapDBLog(dbFileName, SERIALIZER);
Madan Jampani778f7ad2014-11-05 22:46:15 -0800112 log.open();
113 log.appendEntries(TEST_ENTRY1, TEST_ENTRY2, TEST_ENTRY3, TEST_ENTRY4);
114 Assert.assertEquals(
115 TEST_ENTRY1_SIZE +
116 TEST_ENTRY2_SIZE +
117 TEST_ENTRY3_SIZE +
118 TEST_ENTRY4_SIZE, log.size());
119
120 List<Entry> entries = log.getEntries(2, 3);
121 new EqualsTester()
122 .addEqualityGroup(log.getEntry(4), TEST_ENTRY4)
123 .addEqualityGroup(entries.get(0), TEST_ENTRY2)
124 .addEqualityGroup(entries.get(1), TEST_ENTRY3)
125 .testEquals();
126 }
127
128 @Test
129 public void testRemoveAfter() throws IOException {
Yuta HIGUCHI8ba3ac02014-11-17 17:07:54 -0800130 Log log = new MapDBLog(dbFileName, SERIALIZER);
Madan Jampani778f7ad2014-11-05 22:46:15 -0800131 log.open();
132 log.appendEntries(TEST_ENTRY1, TEST_ENTRY2, TEST_ENTRY3, TEST_ENTRY4);
133 log.removeAfter(1);
134 Assert.assertEquals(TEST_ENTRY1_SIZE, log.size());
135 new EqualsTester()
136 .addEqualityGroup(log.firstEntry(), log.lastEntry(), TEST_ENTRY1)
137 .testEquals();
138 }
139
140 @Test
141 public void testAddAfterRemove() throws IOException {
Yuta HIGUCHI8ba3ac02014-11-17 17:07:54 -0800142 Log log = new MapDBLog(dbFileName, SERIALIZER);
Madan Jampani778f7ad2014-11-05 22:46:15 -0800143 log.open();
144 log.appendEntries(TEST_ENTRY1, TEST_ENTRY2, TEST_ENTRY3, TEST_ENTRY4);
145 log.removeAfter(1);
146 log.appendEntry(TEST_ENTRY4);
147 Assert.assertEquals(TEST_ENTRY1_SIZE + TEST_ENTRY4_SIZE, log.size());
148 new EqualsTester()
149 .addEqualityGroup(log.firstEntry(), TEST_ENTRY1)
150 .addEqualityGroup(log.lastEntry(), TEST_ENTRY4)
151 .addEqualityGroup(log.size(), TEST_ENTRY1_SIZE + TEST_ENTRY4_SIZE)
152 .testEquals();
153 }
154
155 @Test
156 public void testClose() throws IOException {
Yuta HIGUCHI8ba3ac02014-11-17 17:07:54 -0800157 Log log = new MapDBLog(dbFileName, SERIALIZER);
Madan Jampani778f7ad2014-11-05 22:46:15 -0800158 Assert.assertFalse(log.isOpen());
159 log.open();
160 Assert.assertTrue(log.isOpen());
161 log.close();
162 Assert.assertFalse(log.isOpen());
163 }
164
165 @Test
166 public void testReopen() throws IOException {
Yuta HIGUCHI8ba3ac02014-11-17 17:07:54 -0800167 Log log = new MapDBLog(dbFileName, SERIALIZER);
Madan Jampani778f7ad2014-11-05 22:46:15 -0800168 log.open();
169 log.appendEntries(TEST_ENTRY1, TEST_ENTRY2, TEST_ENTRY3, TEST_ENTRY4);
170 log.close();
171 log.open();
172
173 new EqualsTester()
174 .addEqualityGroup(log.firstEntry(), TEST_ENTRY1)
175 .addEqualityGroup(log.getEntry(2), TEST_ENTRY2)
176 .addEqualityGroup(log.lastEntry(), TEST_ENTRY4)
177 .addEqualityGroup(log.size(),
178 TEST_ENTRY1_SIZE +
179 TEST_ENTRY2_SIZE +
180 TEST_ENTRY3_SIZE +
181 TEST_ENTRY4_SIZE)
182 .testEquals();
183 }
184
185 @Test
186 public void testCompact() throws IOException {
Yuta HIGUCHI8ba3ac02014-11-17 17:07:54 -0800187 Log log = new MapDBLog(dbFileName, SERIALIZER);
Madan Jampani778f7ad2014-11-05 22:46:15 -0800188 log.open();
189 log.appendEntries(TEST_ENTRY1, TEST_ENTRY2, TEST_ENTRY3, TEST_ENTRY4);
190 log.compact(3, TEST_SNAPSHOT_ENTRY);
191 new EqualsTester()
192 .addEqualityGroup(log.firstEntry(), TEST_SNAPSHOT_ENTRY)
193 .addEqualityGroup(log.lastEntry(), TEST_ENTRY4)
194 .addEqualityGroup(log.size(),
195 TEST_SNAPSHOT_ENTRY_SIZE +
196 TEST_ENTRY4_SIZE)
197 .testEquals();
198 }
199}