2 * Copyright (C) 2018 Cisco Inc.
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License, version 2,
6 * as published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 // @author Changxue Deng <chadeng@cisco.com>
21 #include <gtest/gtest.h>
23 #include "../dict_mem.h"
24 #include "../drm_base.h"
25 #include "../integer_4b_5b.h"
26 #include "../resource_pool.h"
28 using namespace mabain;
32 #define DICT_MEM_TEST_DIR "/var/tmp/mabain_test/"
34 class DictMemTest : public ::testing::Test
40 memset(&lfree, 0, sizeof(lfree));
42 virtual ~DictMemTest() {
46 virtual void SetUp() {
47 std::string cmd = std::string("mkdir -p ") + DICT_MEM_TEST_DIR;
48 if(system(cmd.c_str()) != 0) {
51 virtual void TearDown() {
52 std::string cmd = std::string("rm -rf ") + DICT_MEM_TEST_DIR + "/_*";
53 if(system(cmd.c_str()) != 0) {
55 ResourcePool::getInstance().RemoveAll();
59 dmm = new DictMem(std::string(DICT_MEM_TEST_DIR), true, 8*1024*1024,
60 CONSTS::ACCESS_MODE_WRITER | CONSTS::USE_SLIDING_WINDOW,
63 EXPECT_EQ(dmm->IsValid(), true);
64 header = dmm->GetHeaderPtr();
65 EXPECT_EQ(header != NULL, true);
66 lfree.LockFreeInit(&header->lock_free, header, CONSTS::ACCESS_MODE_WRITER);
67 dmm->InitLockFreePtr(&lfree);
84 TEST_F(DictMemTest, Constructor_test)
86 dmm = new DictMem(std::string(DICT_MEM_TEST_DIR), true, 8*1024*1024,
87 CONSTS::ACCESS_MODE_WRITER, 8*1024*1024, 1, 0);
88 dmm->PrintStats(std::cout);
89 EXPECT_EQ(dmm->IsValid(), false);
91 EXPECT_EQ(dmm->IsValid(), true);
92 dmm->PrintStats(std::cout);
95 dmm = new DictMem(std::string(DICT_MEM_TEST_DIR), false, 8*1024*1024,
96 CONSTS::ACCESS_MODE_WRITER, 8*1024*1024, 1, 0);
97 EXPECT_EQ(dmm->IsValid(), true);
100 dmm = new DictMem(std::string(DICT_MEM_TEST_DIR), false, 8*1024*1024,
101 CONSTS::ACCESS_MODE_READER, 8*1024*1024, 1, 0);
102 EXPECT_EQ(dmm->IsValid(), false);
108 dmm = new DictMem(std::string(DICT_MEM_TEST_DIR), false, 8*1024*1024,
109 CONSTS::ACCESS_MODE_WRITER, 12*1024*1024, 1, 0);
113 EXPECT_EQ(error, MBError::INVALID_SIZE);
114 EXPECT_EQ(dmm==NULL, true);
117 TEST_F(DictMemTest, AddRootEdge_test)
125 memset(&edge_ptrs, 0, sizeof(edge_ptrs));
126 EXPECT_EQ(dmm->GetRootEdge_Writer(false, 'm', edge_ptrs), MBError::SUCCESS);
127 dmm->AddRootEdge(edge_ptrs, (const uint8_t *) "mabain-test", 11, 1234);
128 EXPECT_EQ(edge_ptrs.flag_ptr[0], EDGE_FLAG_DATA_OFF);
129 offset = Get5BInteger(edge_ptrs.ptr);
130 shm_ptr = dmm->GetShmPtr(offset, 10);
131 EXPECT_EQ(shm_ptr != NULL, true);
132 if(memcmp(shm_ptr, "abain-test", 10)) {
135 offset = Get6BInteger(edge_ptrs.offset_ptr);
136 EXPECT_EQ(offset, 1234u);
137 shm_ptr = dmm->GetShmPtr(header->excep_lf_offset, EDGE_SIZE);
138 EXPECT_EQ(shm_ptr != NULL, true);
139 if(memcmp(shm_ptr, edge_ptrs.ptr, EDGE_SIZE)) {
142 EXPECT_EQ(header->excep_updating_status, EXCEP_STATUS_NONE);
144 memset(&edge_ptrs, 0, sizeof(edge_ptrs));
145 EXPECT_EQ(dmm->GetRootEdge_Writer(false, 'x', edge_ptrs), MBError::SUCCESS);
146 dmm->AddRootEdge(edge_ptrs, (const uint8_t *) "xyz", 3, 2234);
147 EXPECT_EQ(edge_ptrs.flag_ptr[0], EDGE_FLAG_DATA_OFF);
148 offset = Get6BInteger(edge_ptrs.offset_ptr);
149 EXPECT_EQ(offset, 2234u);
150 shm_ptr = dmm->GetShmPtr(header->excep_lf_offset, EDGE_SIZE);
151 EXPECT_EQ(shm_ptr != NULL, true);
152 if(memcmp(shm_ptr, edge_ptrs.ptr, EDGE_SIZE)) {
155 EXPECT_EQ(header->excep_updating_status, EXCEP_STATUS_NONE);
158 TEST_F(DictMemTest, InsertNode_test)
168 memset(&edge_ptrs, 0, sizeof(edge_ptrs));
169 EXPECT_EQ(dmm->GetRootEdge_Writer(false, 'm', edge_ptrs), MBError::SUCCESS);
170 dmm->AddRootEdge(edge_ptrs, (const uint8_t *) "mabain-test", 11, 1234);
172 memset(&edge_ptrs, 0, sizeof(edge_ptrs));
173 EXPECT_EQ(dmm->GetRootEdge_Writer(false, 'm', edge_ptrs), MBError::SUCCESS);
174 EXPECT_EQ(edge_ptrs.len_ptr[0] >= 6, true);
175 rval = dmm->InsertNode(edge_ptrs, 6, 1334, mbd);
176 EXPECT_EQ(rval, MBError::SUCCESS);
177 EXPECT_EQ(header->excep_updating_status, EXCEP_STATUS_NONE);
178 offset = Get6BInteger(edge_ptrs.offset_ptr);
179 shm_ptr = dmm->GetShmPtr(offset, dmm->GetNodeSizePtr()[0]);
180 EXPECT_EQ(shm_ptr != NULL, true);
181 EXPECT_EQ(shm_ptr[0], FLAG_NODE_NONE | FLAG_NODE_MATCH);
182 EXPECT_EQ(shm_ptr[1], 0);
183 EXPECT_EQ(shm_ptr[8], (uint8_t)'-');
184 EXPECT_EQ(Get6BInteger(shm_ptr+2), 1334u);
185 shm_ptr = dmm->GetShmPtr(header->excep_lf_offset, EDGE_SIZE);
186 EXPECT_EQ(shm_ptr != NULL, true);
187 if(memcmp(shm_ptr, edge_ptrs.ptr, EDGE_SIZE)) {
190 EXPECT_EQ(edge_ptrs.len_ptr[0], 6);
191 EXPECT_EQ(edge_ptrs.flag_ptr[0], 0);
192 if(memcmp(edge_ptrs.ptr, "abain", 5)) {
197 TEST_F(DictMemTest, InsertNode_test1)
207 memset(&edge_ptrs, 0, sizeof(edge_ptrs));
208 EXPECT_EQ(dmm->GetRootEdge_Writer(false, 'm', edge_ptrs), MBError::SUCCESS);
209 dmm->AddRootEdge(edge_ptrs, (const uint8_t *) "mabain-testabcdefghijk", 22, 1234);
211 memset(&edge_ptrs, 0, sizeof(edge_ptrs));
212 EXPECT_EQ(dmm->GetRootEdge_Writer(false, 'm', edge_ptrs), MBError::SUCCESS);
213 EXPECT_EQ(edge_ptrs.len_ptr[0] >= 6, true);
214 rval = dmm->InsertNode(edge_ptrs, 6, 1334, mbd);
215 EXPECT_EQ(rval, MBError::SUCCESS);
216 EXPECT_EQ(header->excep_updating_status, EXCEP_STATUS_NONE);
217 offset = Get6BInteger(edge_ptrs.offset_ptr);
218 shm_ptr = dmm->GetShmPtr(offset, dmm->GetNodeSizePtr()[0]);
219 EXPECT_EQ(shm_ptr != NULL, true);
220 EXPECT_EQ(shm_ptr[0], FLAG_NODE_NONE | FLAG_NODE_MATCH);
221 EXPECT_EQ(shm_ptr[1], 0);
222 EXPECT_EQ(shm_ptr[8], (uint8_t)'-');
223 EXPECT_EQ(Get6BInteger(shm_ptr+2), 1334u);
224 shm_ptr = dmm->GetShmPtr(header->excep_lf_offset, EDGE_SIZE);
225 EXPECT_EQ(shm_ptr != NULL, true);
226 if(memcmp(shm_ptr, edge_ptrs.ptr, EDGE_SIZE)) {
229 EXPECT_EQ(edge_ptrs.len_ptr[0], 6);
230 EXPECT_EQ(edge_ptrs.flag_ptr[0], 0);
231 if(memcmp(edge_ptrs.ptr, "abain", 5)) {
236 TEST_F(DictMemTest, InsertNode_test2)
246 memset(&edge_ptrs, 0, sizeof(edge_ptrs));
247 EXPECT_EQ(dmm->GetRootEdge_Writer(false, 'x', edge_ptrs), MBError::SUCCESS);
248 dmm->AddRootEdge(edge_ptrs, (const uint8_t *) "xxxxxxxmabain-test", 18, 1234);
250 memset(&edge_ptrs, 0, sizeof(edge_ptrs));
251 EXPECT_EQ(dmm->GetRootEdge_Writer(false, 'x', edge_ptrs), MBError::SUCCESS);
252 EXPECT_EQ(edge_ptrs.len_ptr[0] >= 6, true);
253 rval = dmm->InsertNode(edge_ptrs, 13, 1334, mbd);
254 EXPECT_EQ(rval, MBError::SUCCESS);
255 EXPECT_EQ(header->excep_updating_status, EXCEP_STATUS_NONE);
256 offset = Get6BInteger(edge_ptrs.offset_ptr);
257 shm_ptr = dmm->GetShmPtr(offset, dmm->GetNodeSizePtr()[0]);
258 EXPECT_EQ(shm_ptr != NULL, true);
259 EXPECT_EQ(shm_ptr[0], FLAG_NODE_NONE | FLAG_NODE_MATCH);
260 EXPECT_EQ(shm_ptr[1], 0);
261 EXPECT_EQ(shm_ptr[8], (uint8_t)'-');
262 EXPECT_EQ(Get6BInteger(shm_ptr+2), 1334u);
263 shm_ptr = dmm->GetShmPtr(header->excep_lf_offset, EDGE_SIZE);
264 EXPECT_EQ(shm_ptr != NULL, true);
265 if(memcmp(shm_ptr, edge_ptrs.ptr, EDGE_SIZE)) {
268 EXPECT_EQ(edge_ptrs.len_ptr[0], 13);
269 EXPECT_EQ(edge_ptrs.flag_ptr[0], 0);
270 EXPECT_EQ(Get5BInteger(edge_ptrs.ptr), 3631u);
273 TEST_F(DictMemTest, AddLink_test)
281 memset(&edge_ptrs, 0, sizeof(edge_ptrs));
282 EXPECT_EQ(dmm->GetRootEdge_Writer(false, 'm', edge_ptrs), MBError::SUCCESS);
283 dmm->AddRootEdge(edge_ptrs, (const uint8_t *) "mabain-test", 18, 1234);
285 memset(&edge_ptrs, 0, sizeof(edge_ptrs));
286 EXPECT_EQ(dmm->GetRootEdge_Writer(false, 'm', edge_ptrs), MBError::SUCCESS);
287 rval = dmm->AddLink(edge_ptrs, 7, (const uint8_t *)"klsakkslslsldds",
289 EXPECT_EQ(rval, MBError::SUCCESS);
290 EXPECT_EQ(edge_ptrs.offset, 1681u);
291 EXPECT_EQ(header->excep_updating_status, EXCEP_STATUS_NONE);
292 EXPECT_EQ(Get6BInteger(edge_ptrs.offset_ptr), 3609u);
293 shm_ptr = dmm->GetShmPtr(3609, 10);
294 EXPECT_EQ((int)shm_ptr[0], 0);
295 EXPECT_EQ((int)shm_ptr[1], 1);
296 EXPECT_EQ((char)shm_ptr[8], 't');
297 EXPECT_EQ((char)shm_ptr[9], 'k');
298 EXPECT_EQ(Get5BInteger(edge_ptrs.ptr), 3655u);
299 shm_ptr = dmm->GetShmPtr(3655, 10);
300 EXPECT_EQ(std::string((const char *)shm_ptr, 5).compare("abain"), 0);
303 TEST_F(DictMemTest, UpdateNode_test)
311 memset(&edge_ptrs, 0, sizeof(edge_ptrs));
312 EXPECT_EQ(dmm->GetRootEdge_Writer(false, 'm', edge_ptrs), MBError::SUCCESS);
313 dmm->AddRootEdge(edge_ptrs, (const uint8_t *) "mabain-test", 18, 1234);
315 memset(&edge_ptrs, 0, sizeof(edge_ptrs));
316 EXPECT_EQ(dmm->GetRootEdge_Writer(false, 'm', edge_ptrs), MBError::SUCCESS);
317 rval = dmm->AddLink(edge_ptrs, 7, (const uint8_t *)"klsakkslslsldds",
319 EXPECT_EQ(rval, MBError::SUCCESS);
321 uint8_t tmp_buff[256];
323 memset(&edge_ptrs, 0, sizeof(edge_ptrs));
324 EXPECT_EQ(dmm->GetRootEdge_Writer(false, 'm', edge_ptrs), MBError::SUCCESS);
325 bool next = dmm->FindNext((const uint8_t*)"abcdefg", 7, match_len, edge_ptrs, tmp_buff);
326 EXPECT_EQ(next, false);
327 rval = dmm->UpdateNode(edge_ptrs, (const uint8_t*)"abcdefg", 7, 12345);
328 EXPECT_EQ(rval, MBError::SUCCESS);
329 EXPECT_EQ(edge_ptrs.offset, 1681u);
330 EXPECT_EQ(Get5BInteger(edge_ptrs.ptr), 3655u);
331 shm_ptr = dmm->GetShmPtr(3655, 6);
332 EXPECT_EQ(std::string((const char*)shm_ptr, 6).compare("abain-"), 0);
335 TEST_F(DictMemTest, FindNext_test)
342 memset(&edge_ptrs, 0, sizeof(edge_ptrs));
343 EXPECT_EQ(dmm->GetRootEdge_Writer(false, 'm', edge_ptrs), MBError::SUCCESS);
344 dmm->AddRootEdge(edge_ptrs, (const uint8_t *) "mabain-abc", 18, 1234);
346 memset(&edge_ptrs, 0, sizeof(edge_ptrs));
347 EXPECT_EQ(dmm->GetRootEdge_Writer(false, 'm', edge_ptrs), MBError::SUCCESS);
348 rval = dmm->AddLink(edge_ptrs, 7, (const uint8_t *)"hijk", 4, 12345, mbd);
349 EXPECT_EQ(rval, MBError::SUCCESS);
353 uint8_t tmp_buff[256];
356 memset(&edge_ptrs, 0, sizeof(edge_ptrs));
357 EXPECT_EQ(dmm->GetRootEdge_Writer(false, 'm', edge_ptrs), MBError::SUCCESS);
358 next = dmm->FindNext((const uint8_t*)"xyz293ksk", 9, match_len,
359 edge_ptrs, tmp_buff);
360 EXPECT_EQ(next, false);
361 rval = dmm->UpdateNode(edge_ptrs, (const uint8_t*)"xyz293ksk", 9, 22345);
362 EXPECT_EQ(rval, MBError::SUCCESS);
364 for(int i = 0; i < 256; i++) {
365 key[i] = (uint8_t) i;
367 for(int i = 0; i < 256; i++) {
368 memset(&edge_ptrs, 0, sizeof(edge_ptrs));
369 EXPECT_EQ(dmm->GetRootEdge_Writer(false, 'm', edge_ptrs), MBError::SUCCESS);
370 next = dmm->FindNext((const uint8_t*)key+i, 1, match_len,
371 edge_ptrs, tmp_buff);
372 if((char)key[i] == 'a' || (char)key[i] == 'h' || (char) key[i] == 'x') {
373 EXPECT_EQ(next, true);
375 EXPECT_EQ(next, false);
380 TEST_F(DictMemTest, GetRootEdge_test)
385 memset(&edge_ptrs, 0, sizeof(edge_ptrs));
386 EXPECT_EQ(dmm->GetRootEdge_Writer(false, 'm', edge_ptrs), MBError::SUCCESS);
387 dmm->AddRootEdge(edge_ptrs, (const uint8_t *) "mabain-unittest", 15, 1234);
388 memset(&edge_ptrs, 0, sizeof(edge_ptrs));
389 EXPECT_EQ(dmm->GetRootEdge(false, 'm', edge_ptrs), MBError::SUCCESS);
390 EXPECT_EQ(edge_ptrs.offset, 1681u);
391 EXPECT_EQ(Get5BInteger(edge_ptrs.ptr), 3592u);
393 uint8_t *ptr = dmm->GetShmPtr(3592, 14);
394 EXPECT_EQ(memcmp(ptr, "abain-unittest", 14)==0, true);
397 TEST_F(DictMemTest, GetRootEdge_Writer_test)
402 memset(&edge_ptrs, 0, sizeof(edge_ptrs));
403 for(int i = 0; i < 256; i++) {
404 EXPECT_EQ(dmm->GetRootEdge_Writer(false, i, edge_ptrs), MBError::SUCCESS);
408 TEST_F(DictMemTest, ClearRootEdge_test)
414 dmm->WriteData(buff, 0, dmm->GetRootOffset());
416 dmm->ClearRootEdge(0);
417 dmm->GetRootEdge(0, 0, edge_ptrs);
418 EXPECT_EQ(memcmp(edge_ptrs.edge_buff, DictMem::empty_edge, EDGE_SIZE)==0, true);
420 dmm->ClearRootEdge(10);
421 dmm->GetRootEdge(0, 10, edge_ptrs);
422 EXPECT_EQ(memcmp(edge_ptrs.edge_buff, DictMem::empty_edge, EDGE_SIZE)==0, true);
424 dmm->ClearRootEdge(111);
425 dmm->GetRootEdge(0, 111, edge_ptrs);
426 EXPECT_EQ(memcmp(edge_ptrs.edge_buff, DictMem::empty_edge, EDGE_SIZE)==0, true);
429 TEST_F(DictMemTest, ReserveData_test)
438 dmm->ReserveData(buff, size, offset, false);
439 EXPECT_EQ(header->m_index_offset, 3692u);
440 EXPECT_EQ(header->m_index_offset, offset+100);
443 TEST_F(DictMemTest, NextEdge_test)
448 TEST_F(DictMemTest, RemoveEdgeByIndex_test)
453 TEST_F(DictMemTest, InitRootNode_test)
458 EXPECT_EQ(header->m_index_offset, 3592u);
461 TEST_F(DictMemTest, WriteEdge_test)
465 header->m_index_offset = 10000;
467 edge_ptrs.offset = 1234;
468 edge_ptrs.ptr = edge_ptrs.edge_buff;
469 dmm->WriteEdge(edge_ptrs);
470 EXPECT_EQ(header->excep_updating_status, EXCEP_STATUS_NONE);
473 TEST_F(DictMemTest, WriteData_test)
484 header->m_index_offset = offset + 10000;
485 for(int i = 0; i < size; i++) {
486 buff[i] = (uint8_t) i;
488 dmm->WriteData(buff, size, offset);
490 shm_ptr = dmm->GetShmPtr(offset, size);
491 EXPECT_EQ(shm_ptr != NULL, true);
492 for(int i = 0; i < size; i++) {
493 EXPECT_EQ((int)shm_ptr[i], i);
497 TEST_F(DictMemTest, Flush_test)
501 header->m_index_offset = 10000000;
502 dmm->WriteData(buff, 32, 10000);