Loading...
Searching...
No Matches
query_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 <glog/logging.h>
23#include <gmock/gmock.h>
24#include <gtest/gtest.h>
25
26#include <future>
27
35
36namespace resdb {
37namespace {
38
39using ::resdb::testing::EqualsProto;
40using ::testing::_;
41using ::testing::Invoke;
42using ::testing::Return;
43using ::testing::Test;
44
45ResDBConfig GenerateConfig() {
46 ResConfigData config_data;
47 config_data.set_view_change_timeout_ms(100);
48
49 return ResDBConfig({GenerateReplicaInfo(1, "127.0.0.1", 1234),
50 GenerateReplicaInfo(2, "127.0.0.1", 1235),
51 GenerateReplicaInfo(3, "127.0.0.1", 1236),
52 GenerateReplicaInfo(4, "127.0.0.1", 1237)},
53 GenerateReplicaInfo(1, "127.0.0.1", 1234), config_data);
54}
55
56class QueryTest : public Test {
57 public:
58 QueryTest()
59 : global_stats_(Stats::GetGlobalStats(1)),
60 config_(GenerateConfig()),
66 &verifier_) {}
67
68 int AddProposeMsg(int sender_id, bool need_resp = false, int proxy_id = 1) {
69 auto context = std::make_unique<Context>();
70 context->signature.set_signature("signature");
71
72 Request request;
73 request.set_current_view(1);
74 request.set_seq(1);
75 request.set_type(Request::TYPE_PRE_PREPARE);
76 request.set_sender_id(sender_id);
77 request.set_need_response(need_resp);
78 request.set_proxy_id(proxy_id);
79
80 return commitment_.ProcessProposeMsg(std::move(context),
81 std::make_unique<Request>(request));
82 }
83
84 int AddPrepareMsg(int sender_id) {
85 auto context = std::make_unique<Context>();
86 context->signature.set_signature("signature");
87
88 Request request;
89 request.set_current_view(1);
90 request.set_seq(1);
91 request.set_type(Request::TYPE_PREPARE);
92 request.set_sender_id(sender_id);
93 return commitment_.ProcessPrepareMsg(std::move(context),
94 std::make_unique<Request>(request));
95 }
96
97 int AddCommitMsg(int sender_id) {
98 auto context = std::make_unique<Context>();
99 context->signature.set_signature("signature");
100
101 Request request;
102 request.set_current_view(1);
103 request.set_seq(1);
104 request.set_type(Request::TYPE_COMMIT);
105 request.set_sender_id(sender_id);
106 return commitment_.ProcessCommitMsg(std::move(context),
107 std::make_unique<Request>(request));
108 }
109
110 void CommitMsg() {
111 std::promise<bool> done;
112 std::future<bool> done_future = done.get_future();
113
114 EXPECT_CALL(replica_communicator_, SendMessage(_, 1))
115 .WillOnce(Invoke(
116 [&](const google::protobuf::Message& request, int64_t node_id) {
117 done.set_value(true);
118 return 0;
119 }));
120
121 EXPECT_EQ(AddProposeMsg(1, true), 0);
122
123 EXPECT_EQ(AddPrepareMsg(1), 0);
124 EXPECT_EQ(AddPrepareMsg(2), 0);
125 EXPECT_EQ(AddPrepareMsg(3), 0);
126
127 EXPECT_EQ(AddCommitMsg(1), 0);
128 EXPECT_EQ(AddCommitMsg(2), 0);
129 EXPECT_EQ(AddCommitMsg(3), 0);
130 done_future.get();
131 }
132
133 protected:
135 ResDBConfig config_;
136 SystemInfo system_info_;
137 CheckPointManager checkpoint_manager_;
138 MessageManager message_manager_;
139 Query query_;
140 MockReplicaCommunicator replica_communicator_;
141 MockSignatureVerifier verifier_;
142 Commitment commitment_;
143};
144
145MATCHER_P(EqualsProtoNoConfigData, replica, "") {
146 ReplicaState x = dynamic_cast<const ReplicaState&>(arg);
147 ReplicaState y = replica;
148 x.mutable_replica_config()->Clear();
149 y.mutable_replica_config()->Clear();
150 return ::google::protobuf::util::MessageDifferencer::Equals(x, y);
151}
152
153TEST_F(QueryTest, QueryState) {
154 ReplicaState replica_state;
155 replica_state.set_view(1);
156 replica_state.mutable_replica_info()->set_id(1);
157 replica_state.mutable_replica_info()->set_ip("127.0.0.1");
158 replica_state.mutable_replica_info()->set_port(1234);
159
160 std::unique_ptr<MockNetChannel> channel =
161 std::make_unique<MockNetChannel>("127.0.0.1", 0);
162 EXPECT_CALL(*channel, SendRawMessage(EqualsProtoNoConfigData(replica_state)))
163 .Times(1);
164
165 auto context = std::make_unique<Context>();
166 context->client = std::move(channel);
167 context->signature.set_signature("signature");
168
169 int ret = query_.ProcessGetReplicaState(std::move(context), nullptr);
170 EXPECT_EQ(ret, 0);
171}
172
173TEST_F(QueryTest, QueryTxn) {
174 CommitMsg();
175
176 QueryResponse response;
177 auto txn = response.add_transactions();
178 txn->set_seq(1);
179 txn->set_proxy_id(1);
180
181 std::unique_ptr<MockNetChannel> channel =
182 std::make_unique<MockNetChannel>("127.0.0.1", 0);
183 EXPECT_CALL(*channel, SendRawMessage(EqualsProto(response))).Times(1);
184
185 auto context = std::make_unique<Context>();
186 context->client = std::move(channel);
187
188 context->signature.set_signature("signature");
189
190 Request request;
191 QueryRequest query;
192 query.set_min_seq(1);
193 query.set_max_seq(2);
194 query.SerializeToString(request.mutable_data());
195
196 int ret = query_.ProcessQuery(std::move(context),
197 std::make_unique<Request>(request));
198 EXPECT_EQ(ret, 0);
199}
200
201} // namespace
202
203} // namespace resdb
MockReplicaCommunicator replica_communicator_
virtual int ProcessGetReplicaState(std::unique_ptr< Context > context, std::unique_ptr< Request > request)
Definition query.cpp:35
virtual int ProcessQuery(std::unique_ptr< Context > context, std::unique_ptr< Request > request)
Definition query.cpp:51
std::unique_ptr< Commitment > commitment_
CheckPointManager checkpoint_manager_
Stats * global_stats_
SystemInfo system_info_
std::unique_ptr< MessageManager > message_manager_
MockSignatureVerifier verifier_
MATCHER_P(EqualsProto, replica, "")
Definition test_macros.h:36
ReplicaInfo GenerateReplicaInfo(int id, const std::string &ip, int port)
TEST_F(ResDBTest, TestPBFTService)
Query query_
std::unique_ptr< ResDBConfig > config_