inital commit
[c11concurrency-benchmarks.git] / mabain / src / unittest / update_test.cpp
1 #include <unistd.h>
2 #include <stdlib.h>
3 #include <list>
4 #include <cstdlib>
5
6 #include <gtest/gtest.h>
7
8 #include "../db.h"
9 #include "../mb_data.h"
10 #include "../resource_pool.h"
11 #include "./test_key.h"
12
13 #define MB_DIR "/var/tmp/mabain_test/"
14
15 using namespace mabain;
16
17 namespace {
18
19 class UpdateTest : public ::testing::Test
20 {
21 public:
22     UpdateTest() {
23         db = NULL;
24     }
25     virtual ~UpdateTest() {
26         if(db != NULL)
27             delete db;
28     }
29     virtual void SetUp() {
30         std::string cmd = std::string("mkdir -p ") + MB_DIR;
31         if(system(cmd.c_str()) != 0) {
32         }
33         cmd = std::string("rm ") + MB_DIR + "_*";
34         if(system(cmd.c_str()) != 0) {
35         }
36         db = new DB(MB_DIR, CONSTS::WriterOptions());
37     }
38     virtual void TearDown() {
39         db->Close();
40         ResourcePool::getInstance().RemoveAll();
41     }
42
43 protected:
44     DB *db;
45 };
46
47 TEST_F(UpdateTest, Update_all)
48 {
49     TestKey tkey(MABAIN_TEST_KEY_TYPE_INT);
50     TestKey tkey1(MABAIN_TEST_KEY_TYPE_SHA_128);
51     int num = 1000;
52     std::string key;
53     int rval;
54     for(int i = 0; i < num; i++) {
55         key = tkey.get_key(i);
56         rval = db->Add(key, key);
57         EXPECT_EQ(rval, MBError::SUCCESS);
58         key = tkey1.get_key(i);
59         rval = db->Add(key, key);
60         EXPECT_EQ(rval, MBError::SUCCESS);
61     }
62     for(int i = 0; i < num; i++) {
63         key = tkey.get_key(i);
64         rval = db->Add(key, key);
65         EXPECT_EQ(rval, MBError::IN_DICT);
66         key = tkey1.get_key(i);
67         rval = db->Add(key, key);
68         EXPECT_EQ(rval, MBError::IN_DICT);
69
70         key = tkey.get_key(i);
71         rval = db->Add(key, key+"_new", true);
72         EXPECT_EQ(rval, MBError::SUCCESS);
73         key = tkey1.get_key(i);
74         rval = db->Add(key, key+"_new", true);
75         EXPECT_EQ(rval, MBError::SUCCESS);
76     }
77
78     MBData mbd;
79     for(int i = 0; i < num; i++) {
80         key = tkey.get_key(i);
81         rval = db->Find(key, mbd);
82         EXPECT_EQ(rval, MBError::SUCCESS);
83         EXPECT_EQ(std::string((const char*)mbd.buff, mbd.data_len)==key+"_new", true);
84         key = tkey1.get_key(i);
85         rval = db->Find(key, mbd);
86         EXPECT_EQ(rval, MBError::SUCCESS);
87         EXPECT_EQ(std::string((const char*)mbd.buff, mbd.data_len)==key+"_new", true);
88     }
89 }
90
91 TEST_F(UpdateTest, Update_random)
92 {
93     srand(time(NULL));
94     TestKey tkey(MABAIN_TEST_KEY_TYPE_INT);
95     TestKey tkey1(MABAIN_TEST_KEY_TYPE_SHA_128);
96     int num = 3456;
97     std::string key;
98     int rval;
99     bool *added;
100
101     added = new bool[num];
102     for(int i = 0; i < num; i++) {
103         added[i] = false;
104     }
105     
106     for(int i = 0; i < num; i++) {
107         if(rand() % 100 < 21)
108             continue;
109
110         key = tkey.get_key(i);
111         rval = db->Add(key, key);
112         EXPECT_EQ(rval, MBError::SUCCESS);
113         key = tkey1.get_key(i);
114         rval = db->Add(key, key);
115         EXPECT_EQ(rval, MBError::SUCCESS);
116         added[i] = true;
117     }
118     for(int i = 0; i < num; i++) {
119         if(added[i]) {
120             key = tkey.get_key(i);
121             rval = db->Add(key, key);
122             EXPECT_EQ(rval, MBError::IN_DICT);
123             key = tkey1.get_key(i);
124             rval = db->Add(key, key);
125             EXPECT_EQ(rval, MBError::IN_DICT);
126
127             key = tkey.get_key(i);
128             rval = db->Add(key, key+"_new", true);
129             EXPECT_EQ(rval, MBError::SUCCESS);
130             key = tkey1.get_key(i);
131             rval = db->Add(key, key+"_new", true);
132             EXPECT_EQ(rval, MBError::SUCCESS);
133         } else {
134             key = tkey.get_key(i);
135             rval = db->Add(key, key);
136             EXPECT_EQ(rval, MBError::SUCCESS);
137             key = tkey1.get_key(i);
138             rval = db->Add(key, key);
139             EXPECT_EQ(rval, MBError::SUCCESS);
140         }
141     }
142
143     MBData mbd;
144     std::string value;
145     for(int i = 0; i < num; i++) {
146         key = tkey.get_key(i);
147         rval = db->Find(key, mbd);
148         EXPECT_EQ(rval, MBError::SUCCESS);
149         value = key;
150         if(added[i])
151             value += "_new";
152         EXPECT_EQ(std::string((const char*)mbd.buff, mbd.data_len)==value, true);
153         key = tkey1.get_key(i);
154         rval = db->Find(key, mbd);
155         value = key;
156         if(added[i])
157             value += "_new";
158         EXPECT_EQ(rval, MBError::SUCCESS);
159         EXPECT_EQ(std::string((const char*)mbd.buff, mbd.data_len)==value, true);
160     }
161
162     delete [] added;
163 }
164
165 }