22#include <gmock/gmock.h>
23#include <gtest/gtest.h>
29#include "proto/kv/kv.pb.h"
34using ::resdb::testing::EqualsProto;
35using storage::MemoryDB;
36using ::testing::Invoke;
37using ::testing::Return;
40class KVExecutorTest :
public Test {
43 auto storage = std::make_unique<MemoryDB>();
45 impl_ = std::make_unique<KVExecutor>(std::move(storage));
48 int Set(
const std::string& key,
const std::string& value) {
50 request.set_cmd(KVRequest::SET);
52 request.set_value(value);
55 if (!request.SerializeToString(&str)) {
59 impl_->ExecuteData(str);
63 std::string Get(
const std::string& key) {
65 request.set_cmd(KVRequest::GET);
69 if (!request.SerializeToString(&str)) {
72 auto resp = impl_->ExecuteData(str);
73 if (resp ==
nullptr) {
76 KVResponse kv_response;
77 if (!kv_response.ParseFromString(*resp)) {
80 return kv_response.value();
83 std::string GetAllValues() {
85 request.set_cmd(KVRequest::GETALLVALUES);
88 if (!request.SerializeToString(&str)) {
91 auto resp = impl_->ExecuteData(str);
92 if (resp ==
nullptr) {
95 KVResponse kv_response;
96 if (!kv_response.ParseFromString(*resp)) {
99 return kv_response.value();
102 std::string GetRange(
const std::string& min_key,
const std::string& max_key) {
104 request.set_cmd(KVRequest::GETRANGE);
105 request.set_key(min_key);
106 request.set_value(max_key);
109 if (!request.SerializeToString(&str)) {
112 auto resp = impl_->ExecuteData(str);
113 if (resp ==
nullptr) {
116 KVResponse kv_response;
117 if (!kv_response.ParseFromString(*resp)) {
120 return kv_response.value();
123 int Set(
const std::string& key,
const std::string& value,
int version) {
125 request.set_cmd(KVRequest::SET_WITH_VERSION);
126 request.set_key(key);
127 request.set_value(value);
128 request.set_version(version);
131 if (!request.SerializeToString(&str)) {
135 impl_->ExecuteData(str);
139 ValueInfo Get(
const std::string& key,
int version) {
141 request.set_cmd(KVRequest::GET_WITH_VERSION);
142 request.set_key(key);
143 request.set_version(version);
146 if (!request.SerializeToString(&str)) {
150 auto resp = impl_->ExecuteData(str);
151 if (resp ==
nullptr) {
154 KVResponse kv_response;
155 if (!kv_response.ParseFromString(*resp)) {
159 return kv_response.value_info();
162 Items GetAllItems() {
164 request.set_cmd(KVRequest::GET_ALL_ITEMS);
167 if (!request.SerializeToString(&str)) {
171 auto resp = impl_->ExecuteData(str);
172 if (resp ==
nullptr) {
175 KVResponse kv_response;
176 if (!kv_response.ParseFromString(*resp)) {
180 return kv_response.items();
183 Items GetKeyRange(
const std::string& min_key,
const std::string& max_key) {
185 request.set_cmd(KVRequest::GET_KEY_RANGE);
186 request.set_min_key(min_key);
187 request.set_max_key(max_key);
190 if (!request.SerializeToString(&str)) {
194 auto resp = impl_->ExecuteData(str);
195 if (resp ==
nullptr) {
198 KVResponse kv_response;
199 if (!kv_response.ParseFromString(*resp)) {
203 return kv_response.items();
206 Items GetHistory(
const std::string& key,
int min_version,
int max_version) {
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);
214 if (!request.SerializeToString(&str)) {
218 auto resp = impl_->ExecuteData(str);
219 if (resp ==
nullptr) {
222 KVResponse kv_response;
223 if (!kv_response.ParseFromString(*resp)) {
227 return kv_response.items();
234 std::unique_ptr<KVExecutor> impl_;
237TEST_F(KVExecutorTest, SetValue) {
238 std::map<std::string, std::string>
data;
240 EXPECT_EQ(GetAllValues(),
"[]");
241 EXPECT_EQ(Set(
"test_key",
"test_value"), 0);
242 EXPECT_EQ(Get(
"test_key"),
"test_value");
246 EXPECT_EQ(GetAllValues(),
"[test_value]");
247 EXPECT_EQ(GetRange(
"a",
"z"),
"[test_value]");
250TEST_F(KVExecutorTest, SetValueWithVersion) {
251 std::map<std::string, std::string>
data;
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));
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));
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));
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));
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));
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));
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);
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);
309 EXPECT_THAT(GetAllItems(), EqualsProto(items));
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);
320 EXPECT_THAT(GetKeyRange(
"test_key",
"test_key"), EqualsProto(items));
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);
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);
337 EXPECT_THAT(GetHistory(
"test_key", 0, 2), EqualsProto(items));
std::unique_ptr< Storage > storage
TEST_F(ResDBTest, TestPBFTService)