Loading...
Searching...
No Matches
kv_executor_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
21
22#include <gmock/gmock.h>
23#include <gtest/gtest.h>
24
29#include "proto/kv/kv.pb.h"
30
31namespace resdb {
32namespace {
33
34using ::resdb::testing::EqualsProto;
35using storage::MemoryDB;
36using ::testing::Invoke;
37using ::testing::Return;
38using ::testing::Test;
39
40class KVExecutorTest : public Test {
41 public:
42 KVExecutorTest() {
43 auto storage = std::make_unique<MemoryDB>();
44 storage_ptr_ = storage.get();
45 impl_ = std::make_unique<KVExecutor>(std::move(storage));
46 }
47
48 int Set(const std::string& key, const std::string& value) {
49 KVRequest request;
50 request.set_cmd(KVRequest::SET);
51 request.set_key(key);
52 request.set_value(value);
53
54 std::string str;
55 if (!request.SerializeToString(&str)) {
56 return -1;
57 }
58
59 impl_->ExecuteData(str);
60 return 0;
61 }
62
63 std::string Get(const std::string& key) {
64 KVRequest request;
65 request.set_cmd(KVRequest::GET);
66 request.set_key(key);
67
68 std::string str;
69 if (!request.SerializeToString(&str)) {
70 return "";
71 }
72 auto resp = impl_->ExecuteData(str);
73 if (resp == nullptr) {
74 return "";
75 }
76 KVResponse kv_response;
77 if (!kv_response.ParseFromString(*resp)) {
78 return "";
79 }
80 return kv_response.value();
81 }
82
83 std::string GetAllValues() {
84 KVRequest request;
85 request.set_cmd(KVRequest::GETALLVALUES);
86
87 std::string str;
88 if (!request.SerializeToString(&str)) {
89 return "";
90 }
91 auto resp = impl_->ExecuteData(str);
92 if (resp == nullptr) {
93 return "";
94 }
95 KVResponse kv_response;
96 if (!kv_response.ParseFromString(*resp)) {
97 return "";
98 }
99 return kv_response.value();
100 }
101
102 std::string GetRange(const std::string& min_key, const std::string& max_key) {
103 KVRequest request;
104 request.set_cmd(KVRequest::GETRANGE);
105 request.set_key(min_key);
106 request.set_value(max_key);
107
108 std::string str;
109 if (!request.SerializeToString(&str)) {
110 return "";
111 }
112 auto resp = impl_->ExecuteData(str);
113 if (resp == nullptr) {
114 return "";
115 }
116 KVResponse kv_response;
117 if (!kv_response.ParseFromString(*resp)) {
118 return "";
119 }
120 return kv_response.value();
121 }
122
123 int Set(const std::string& key, const std::string& value, int version) {
124 KVRequest request;
125 request.set_cmd(KVRequest::SET_WITH_VERSION);
126 request.set_key(key);
127 request.set_value(value);
128 request.set_version(version);
129
130 std::string str;
131 if (!request.SerializeToString(&str)) {
132 return -1;
133 }
134
135 impl_->ExecuteData(str);
136 return 0;
137 }
138
139 ValueInfo Get(const std::string& key, int version) {
140 KVRequest request;
141 request.set_cmd(KVRequest::GET_WITH_VERSION);
142 request.set_key(key);
143 request.set_version(version);
144
145 std::string str;
146 if (!request.SerializeToString(&str)) {
147 return ValueInfo();
148 }
149
150 auto resp = impl_->ExecuteData(str);
151 if (resp == nullptr) {
152 return ValueInfo();
153 }
154 KVResponse kv_response;
155 if (!kv_response.ParseFromString(*resp)) {
156 return ValueInfo();
157 }
158
159 return kv_response.value_info();
160 }
161
162 Items GetAllItems() {
163 KVRequest request;
164 request.set_cmd(KVRequest::GET_ALL_ITEMS);
165
166 std::string str;
167 if (!request.SerializeToString(&str)) {
168 return Items();
169 }
170
171 auto resp = impl_->ExecuteData(str);
172 if (resp == nullptr) {
173 return Items();
174 }
175 KVResponse kv_response;
176 if (!kv_response.ParseFromString(*resp)) {
177 return Items();
178 }
179
180 return kv_response.items();
181 }
182
183 Items GetKeyRange(const std::string& min_key, const std::string& max_key) {
184 KVRequest request;
185 request.set_cmd(KVRequest::GET_KEY_RANGE);
186 request.set_min_key(min_key);
187 request.set_max_key(max_key);
188
189 std::string str;
190 if (!request.SerializeToString(&str)) {
191 return Items();
192 }
193
194 auto resp = impl_->ExecuteData(str);
195 if (resp == nullptr) {
196 return Items();
197 }
198 KVResponse kv_response;
199 if (!kv_response.ParseFromString(*resp)) {
200 return Items();
201 }
202
203 return kv_response.items();
204 }
205
206 Items GetHistory(const std::string& key, int min_version, int max_version) {
207 KVRequest request;
208 request.set_cmd(KVRequest::GET_HISTORY);
209 request.set_key(key);
210 request.set_min_version(min_version);
211 request.set_max_version(max_version);
212
213 std::string str;
214 if (!request.SerializeToString(&str)) {
215 return Items();
216 }
217
218 auto resp = impl_->ExecuteData(str);
219 if (resp == nullptr) {
220 return Items();
221 }
222 KVResponse kv_response;
223 if (!kv_response.ParseFromString(*resp)) {
224 return Items();
225 }
226
227 return kv_response.items();
228 }
229
230 protected:
231 Storage* storage_ptr_;
232
233 private:
234 std::unique_ptr<KVExecutor> impl_;
235};
236
237TEST_F(KVExecutorTest, SetValue) {
238 std::map<std::string, std::string> data;
239
240 EXPECT_EQ(GetAllValues(), "[]");
241 EXPECT_EQ(Set("test_key", "test_value"), 0);
242 EXPECT_EQ(Get("test_key"), "test_value");
243
244 // GetAllValues and GetRange may be out of order for in-memory, so we test up
245 // to 1 key-value pair
246 EXPECT_EQ(GetAllValues(), "[test_value]");
247 EXPECT_EQ(GetRange("a", "z"), "[test_value]");
248}
249
250TEST_F(KVExecutorTest, SetValueWithVersion) {
251 std::map<std::string, std::string> data;
252
253 {
254 EXPECT_EQ(Set("test_key", "test_value", 0), 0);
255 ValueInfo expected_info;
256 expected_info.set_value("test_value");
257 expected_info.set_version(1);
258 EXPECT_THAT(Get("test_key", 1), EqualsProto(expected_info));
259 }
260
261 {
262 EXPECT_EQ(Set("test_key", "test_value1", 1), 0);
263 ValueInfo expected_info;
264 expected_info.set_value("test_value1");
265 expected_info.set_version(2);
266 EXPECT_THAT(Get("test_key", 2), EqualsProto(expected_info));
267 }
268 {
269 EXPECT_EQ(Set("test_key", "test_value1", 1), 0);
270 ValueInfo expected_info;
271 expected_info.set_value("test_value");
272 expected_info.set_version(1);
273 EXPECT_THAT(Get("test_key", 1), EqualsProto(expected_info));
274 }
275
276 {
277 EXPECT_EQ(Set("test_key1", "test_key1", 0), 0);
278 ValueInfo expected_info;
279 expected_info.set_value("test_key1");
280 expected_info.set_version(1);
281 EXPECT_THAT(Get("test_key1", 1), EqualsProto(expected_info));
282
283 ValueInfo expected_info2;
284 expected_info2.set_value("test_value");
285 expected_info2.set_version(1);
286 EXPECT_THAT(Get("test_key", 1), EqualsProto(expected_info2));
287
288 ValueInfo expected_info3;
289 expected_info3.set_value("test_value1");
290 expected_info3.set_version(2);
291 EXPECT_THAT(Get("test_key", 0), EqualsProto(expected_info3));
292 }
293
294 {
295 Items items;
296 {
297 Item* item = items.add_item();
298 item->set_key("test_key");
299 item->mutable_value_info()->set_value("test_value1");
300 item->mutable_value_info()->set_version(2);
301 }
302 {
303 Item* item = items.add_item();
304 item->set_key("test_key1");
305 item->mutable_value_info()->set_value("test_key1");
306 item->mutable_value_info()->set_version(1);
307 }
308
309 EXPECT_THAT(GetAllItems(), EqualsProto(items));
310 }
311
312 {
313 Items items;
314 {
315 Item* item = items.add_item();
316 item->set_key("test_key");
317 item->mutable_value_info()->set_value("test_value1");
318 item->mutable_value_info()->set_version(2);
319 }
320 EXPECT_THAT(GetKeyRange("test_key", "test_key"), EqualsProto(items));
321 }
322
323 {
324 Items items;
325 {
326 Item* item = items.add_item();
327 item->set_key("test_key");
328 item->mutable_value_info()->set_value("test_value1");
329 item->mutable_value_info()->set_version(2);
330 }
331 {
332 Item* item = items.add_item();
333 item->set_key("test_key");
334 item->mutable_value_info()->set_value("test_value");
335 item->mutable_value_info()->set_version(1);
336 }
337 EXPECT_THAT(GetHistory("test_key", 0, 2), EqualsProto(items));
338 }
339}
340
341} // namespace
342
343} // namespace resdb
std::string data
Storage * storage_ptr_
std::unique_ptr< Storage > storage
TEST_F(ResDBTest, TestPBFTService)