Loading...
Searching...
No Matches
kv_storage_test.cpp
Go to the documentation of this file.
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19
20#include <glog/logging.h>
21#include <gmock/gmock.h>
22#include <gtest/gtest.h>
23
24#include <filesystem>
25
29
30namespace resdb {
31namespace storage {
32namespace {
33
34enum StorageType {
35 MEM = 0,
36 LEVELDB = 1,
37 ROCKSDB = 2,
38};
39
40class KVStorageTest : public ::testing::TestWithParam<StorageType> {
41 protected:
42 KVStorageTest() {
43 StorageType t = GetParam();
44 switch (t) {
45 case MEM:
47 break;
48 case LEVELDB:
49 Reset();
51 break;
52 case ROCKSDB:
53 Reset();
55 break;
56 }
57 }
58
59 private:
60 void Reset() { std::filesystem::remove_all(path_.c_str()); }
61
62 protected:
63 std::unique_ptr<Storage> storage;
64 std::string path_ = "/tmp/leveldb_test";
65};
66
67TEST_P(KVStorageTest, SetValue) {
68 EXPECT_EQ(storage->SetValue("test_key", "test_value"), 0);
69 EXPECT_EQ(storage->GetValue("test_key"), "test_value");
70}
71
72TEST_P(KVStorageTest, GetValue) {
73 EXPECT_EQ(storage->GetValue("test_key"), "");
74}
75
76TEST_P(KVStorageTest, GetEmptyValueWithVersion) {
77 EXPECT_EQ(storage->GetValueWithVersion("test_key", 0),
78 std::make_pair(std::string(""), 0));
79}
80
81TEST_P(KVStorageTest, SetValueWithVersion) {
82 EXPECT_EQ(storage->SetValueWithVersion("test_key", "test_value", 1), -2);
83
84 EXPECT_EQ(storage->SetValueWithVersion("test_key", "test_value", 0), 0);
85
86 EXPECT_EQ(storage->GetValueWithVersion("test_key", 0),
87 std::make_pair(std::string("test_value"), 1));
88 EXPECT_EQ(storage->GetValueWithVersion("test_key", 1),
89 std::make_pair(std::string("test_value"), 1));
90
91 EXPECT_EQ(storage->SetValueWithVersion("test_key", "test_value_v2", 2), -2);
92 EXPECT_EQ(storage->SetValueWithVersion("test_key", "test_value_v2", 1), 0);
93
94 EXPECT_EQ(storage->GetValueWithVersion("test_key", 0),
95 std::make_pair(std::string("test_value_v2"), 2));
96
97 EXPECT_EQ(storage->GetValueWithVersion("test_key", 1),
98 std::make_pair(std::string("test_value"), 1));
99
100 EXPECT_EQ(storage->GetValueWithVersion("test_key", 2),
101 std::make_pair(std::string("test_value_v2"), 2));
102
103 EXPECT_EQ(storage->GetValueWithVersion("test_key", 3),
104 std::make_pair(std::string("test_value_v2"), 2));
105}
106
107TEST_P(KVStorageTest, GetAllValueWithVersion) {
108 {
109 std::map<std::string, std::pair<std::string, int> > expected_list{
110 std::make_pair("test_key", std::make_pair("test_value", 1))};
111
112 EXPECT_EQ(storage->SetValueWithVersion("test_key", "test_value", 0), 0);
113 EXPECT_EQ(storage->GetAllItems(), expected_list);
114 }
115
116 {
117 std::map<std::string, std::pair<std::string, int> > expected_list{
118 std::make_pair("test_key", std::make_pair("test_value_v2", 2))};
119 EXPECT_EQ(storage->SetValueWithVersion("test_key", "test_value_v2", 1), 0);
120 EXPECT_EQ(storage->GetAllItems(), expected_list);
121 }
122
123 {
124 std::map<std::string, std::pair<std::string, int> > expected_list{
125 std::make_pair("test_key_v1", std::make_pair("test_value1", 1)),
126 std::make_pair("test_key", std::make_pair("test_value_v2", 2))};
127 EXPECT_EQ(storage->SetValueWithVersion("test_key_v1", "test_value1", 0), 0);
128 EXPECT_EQ(storage->GetAllItems(), expected_list);
129 }
130}
131
132TEST_P(KVStorageTest, GetKeyRange) {
133 EXPECT_EQ(storage->SetValueWithVersion("1", "value1", 0), 0);
134 EXPECT_EQ(storage->SetValueWithVersion("2", "value2", 0), 0);
135 EXPECT_EQ(storage->SetValueWithVersion("3", "value3", 0), 0);
136 EXPECT_EQ(storage->SetValueWithVersion("4", "value4", 0), 0);
137
138 {
139 std::map<std::string, std::pair<std::string, int> > expected_list{
140 std::make_pair("1", std::make_pair("value1", 1)),
141 std::make_pair("2", std::make_pair("value2", 1)),
142 std::make_pair("3", std::make_pair("value3", 1)),
143 std::make_pair("4", std::make_pair("value4", 1))};
144 EXPECT_EQ(storage->GetKeyRange("1", "4"), expected_list);
145 }
146
147 EXPECT_EQ(storage->SetValueWithVersion("3", "value3_1", 1), 0);
148 {
149 std::map<std::string, std::pair<std::string, int> > expected_list{
150 std::make_pair("1", std::make_pair("value1", 1)),
151 std::make_pair("2", std::make_pair("value2", 1)),
152 std::make_pair("3", std::make_pair("value3_1", 2)),
153 std::make_pair("4", std::make_pair("value4", 1))};
154 EXPECT_EQ(storage->GetKeyRange("1", "4"), expected_list);
155 }
156 {
157 std::map<std::string, std::pair<std::string, int> > expected_list{
158 std::make_pair("1", std::make_pair("value1", 1)),
159 std::make_pair("2", std::make_pair("value2", 1)),
160 std::make_pair("3", std::make_pair("value3_1", 2)),
161 };
162 EXPECT_EQ(storage->GetKeyRange("1", "3"), expected_list);
163 }
164 {
165 std::map<std::string, std::pair<std::string, int> > expected_list{
166 std::make_pair("2", std::make_pair("value2", 1)),
167 std::make_pair("3", std::make_pair("value3_1", 2)),
168 std::make_pair("4", std::make_pair("value4", 1))};
169 EXPECT_EQ(storage->GetKeyRange("2", "4"), expected_list);
170 }
171 {
172 std::map<std::string, std::pair<std::string, int> > expected_list{
173 std::make_pair("1", std::make_pair("value1", 1)),
174 std::make_pair("2", std::make_pair("value2", 1)),
175 std::make_pair("3", std::make_pair("value3_1", 2)),
176 std::make_pair("4", std::make_pair("value4", 1))};
177 EXPECT_EQ(storage->GetKeyRange("0", "5"), expected_list);
178 }
179 {
180 std::map<std::string, std::pair<std::string, int> > expected_list{
181 std::make_pair("2", std::make_pair("value2", 1)),
182 std::make_pair("3", std::make_pair("value3_1", 2)),
183 };
184 EXPECT_EQ(storage->GetKeyRange("2", "3"), expected_list);
185 }
186}
187
188TEST_P(KVStorageTest, GetHistory) {
189 {
190 std::vector<std::pair<std::string, int> > expected_list{};
191 EXPECT_EQ(storage->GetHistory("1", 1, 5), expected_list);
192 }
193 {
194 std::vector<std::pair<std::string, int> > expected_list{
195 std::make_pair("value3", 3), std::make_pair("value2", 2),
196 std::make_pair("value1", 1)};
197
198 EXPECT_EQ(storage->SetValueWithVersion("1", "value1", 0), 0);
199 EXPECT_EQ(storage->SetValueWithVersion("1", "value2", 1), 0);
200 EXPECT_EQ(storage->SetValueWithVersion("1", "value3", 2), 0);
201
202 EXPECT_EQ(storage->GetHistory("1", 1, 5), expected_list);
203 }
204
205 {
206 std::vector<std::pair<std::string, int> > expected_list{
207 std::make_pair("value5", 5), std::make_pair("value4", 4),
208 std::make_pair("value3", 3), std::make_pair("value2", 2),
209 std::make_pair("value1", 1)};
210
211 EXPECT_EQ(storage->SetValueWithVersion("1", "value4", 3), 0);
212 EXPECT_EQ(storage->SetValueWithVersion("1", "value5", 4), 0);
213 EXPECT_EQ(storage->SetValueWithVersion("1", "value6", 5), 0);
214 EXPECT_EQ(storage->SetValueWithVersion("1", "value7", 6), 0);
215
216 EXPECT_EQ(storage->GetHistory("1", 1, 5), expected_list);
217 }
218
219 {
220 std::vector<std::pair<std::string, int> > expected_list{
221 std::make_pair("value7", 7), std::make_pair("value6", 6)};
222
223 EXPECT_EQ(storage->GetTopHistory("1", 2), expected_list);
224 }
225}
226
227INSTANTIATE_TEST_CASE_P(KVStorageTest, KVStorageTest,
228 ::testing::Values(MEM, LEVELDB, ROCKSDB));
229
230} // namespace
231} // namespace storage
232} // namespace resdb
std::string path_
std::unique_ptr< Storage > storage
std::unique_ptr< Storage > NewResRocksDB(const std::string &path, std::optional< RocksDBInfo > config)
Definition rocksdb.cpp:29
std::unique_ptr< Storage > NewResLevelDB(const std::string &path, std::optional< LevelDBInfo > config)
Definition leveldb.cpp:29
std::unique_ptr< Storage > NewMemoryDB()
Definition memory_db.cpp:27