9 #include <gtest/gtest.h>
13 #include "../mb_data.h"
14 #include "../mb_backup.h"
15 #include "../resource_pool.h"
16 #include "./test_key.h"
18 #define MB_DIR "/var/tmp/mabain_test/"
19 #define MB_BACKUP_DIR "/var/tmp/mabain_backup/"
20 #define MB_BACKUP_DIR_2 "/var/tmp/mabain_backup_2/"
22 using namespace mabain;
26 class BackupTest : public ::testing::Test
31 virtual ~BackupTest() {
35 std::string cmd_2 = std::string("mkdir -p ") + MB_DIR;
36 std::string cmd = std::string("mkdir -p ") + MB_BACKUP_DIR;
37 if(system(cmd_2.c_str())!= 0){
39 if(system(cmd.c_str()) != 0) {
41 cmd = std::string("rm ") + MB_DIR + "_*";
42 std::string cmd_1 = std::string("rm ") + MB_BACKUP_DIR + "_*";
43 if(system(cmd.c_str()) != 0){
45 if(system(cmd_1.c_str()) != 0){
47 cmd = std::string("mkdir -p ") + MB_BACKUP_DIR_2;
48 if(system(cmd.c_str()) != 0){
50 cmd = std::string("rm ") + MB_BACKUP_DIR_2 + "_*";
51 if(system(cmd.c_str()) != 0){
55 virtual void TearDown() {
56 ResourcePool::getInstance().RemoveAll();
59 void check_overwritten_keys(DB *db_bkp, int num)
61 TestKey tkey(MABAIN_TEST_KEY_TYPE_INT);
62 TestKey tkey1(MABAIN_TEST_KEY_TYPE_SHA_128);
65 for(int i = 0; i < num; i++)
68 key = tkey.get_key(i);
69 rval = db_bkp->Find(key, mbd);
70 EXPECT_EQ(rval, MBError::SUCCESS);
71 EXPECT_EQ(std::string((const char*)mbd.buff, mbd.data_len)==key+"_new", true);
72 key = tkey1.get_key(i);
73 rval = db_bkp->Find(key, mbd);
74 EXPECT_EQ(rval, MBError::SUCCESS);
75 EXPECT_EQ(std::string((const char*)mbd.buff, mbd.data_len)==key+"_new", true);
84 TEST_F(BackupTest, Create_backup_db)
86 TestKey tkey(MABAIN_TEST_KEY_TYPE_INT);
87 TestKey tkey1(MABAIN_TEST_KEY_TYPE_SHA_128);
91 DB *db = new DB(MB_DIR, CONSTS::WriterOptions());
92 assert(db->is_open());
93 for(int i = 0; i < num; i++)
95 key = tkey.get_key(i);
96 rval = db->Add(key, key);
97 EXPECT_EQ(rval, MBError::SUCCESS);
98 key = tkey1.get_key(i);
99 rval = db->Add(key, key);
100 EXPECT_EQ(rval, MBError::SUCCESS);
109 rval = bk.Backup(MB_BACKUP_DIR);
113 std::cout << "Backup failed "<< MBError::get_error_str(error) <<"\n";
117 EXPECT_EQ(rval, MBError::SUCCESS);
119 printf ("It took me %ld clicks (%f seconds).\n",t,((float)t)/CLOCKS_PER_SEC);
120 DB *db_bkp = new DB(MB_BACKUP_DIR, CONSTS::WriterOptions());
122 //Test to check already inserted key.
123 for(int i = 0; i < num; i++)
125 key = tkey.get_key(i);
126 rval = db_bkp->Add(key, key);
127 EXPECT_EQ(rval, MBError::IN_DICT);
128 key = tkey1.get_key(i);
129 rval = db_bkp->Add(key, key);
130 EXPECT_EQ(rval, MBError::IN_DICT);
133 //Test to overwrite existing key and retrive it.
134 for(int i = 0; i < num; i++)
136 key = tkey.get_key(i);
137 rval = db_bkp->Add(key, key+"_new", true);
138 EXPECT_EQ(rval, MBError::SUCCESS);
139 key = tkey1.get_key(i);
140 rval = db_bkp->Add(key, key+"_new", true);
143 // Retrive the overwritten key and check it.
144 check_overwritten_keys(db_bkp, num);
148 //Asycwriter DB backup test
149 db_bkp = new DB(MB_BACKUP_DIR, CONSTS::WriterOptions() | CONSTS::ASYNC_WRITER_MODE, 128LL*1024*1024, 128LL*1024*1024);
150 assert(db_bkp->is_open());
151 #ifndef __SHM_QUEUE__
152 assert(db_bkp->AsyncWriterEnabled());
154 DB *db_r = new DB(MB_BACKUP_DIR, CONSTS::ReaderOptions(), 128LL*1024*1024, 128LL*1024*1024);
155 assert(db_r->is_open());
156 #ifndef __SHM_QUEUE__
157 assert(db_r->SetAsyncWriterPtr(db_bkp) == MBError::SUCCESS);
158 assert(db_r->AsyncWriterEnabled());
160 rval = db_r->Backup(MB_BACKUP_DIR_2);
161 EXPECT_EQ(rval, MBError::SUCCESS);
162 while (db_r->AsyncWriterBusy()) {
165 #ifndef __SHM_QUEUE__
166 assert(db_r->UnsetAsyncWriterPtr(db_bkp) == MBError::SUCCESS);
172 db_bkp = new DB(MB_BACKUP_DIR_2, CONSTS::WriterOptions(), 128LL*1024*1024, 128LL*1024*1024);
173 check_overwritten_keys(db_bkp, num);
175 //Test to remove all the keys from the DB.
176 rval = db_bkp->RemoveAll();
177 EXPECT_EQ(rval, MBError::SUCCESS);
178 EXPECT_EQ(0, db_bkp->Count());