22#include <glog/logging.h>
23#include <gmock/gmock.h>
24#include <gtest/gtest.h>
39using ::resdb::testing::EqualsProto;
40using ::testing::Invoke;
41using ::testing::Return;
44ResDBConfig GenerateConfig() {
46 data.set_duplicate_check_frequency_useconds(100000);
54class CommitmentTest :
public Test {
68 std::unique_ptr<Context> GetContext() {
69 auto context = std::make_unique<Context>();
70 context->signature.set_signature(
"signature");
74 int AddProposeMsg(
int sender_id,
bool need_resp =
false,
int proxy_id = 1) {
75 auto context = std::make_unique<Context>();
76 context->signature.set_signature(
"signature");
79 request.set_current_view(1);
81 request.set_type(Request::TYPE_PRE_PREPARE);
82 request.set_sender_id(sender_id);
83 request.set_need_response(need_resp);
84 request.set_proxy_id(proxy_id);
85 request.set_data(data_);
87 return commitment_->ProcessProposeMsg(std::move(context),
88 std::make_unique<Request>(request));
91 int AddPrepareMsg(
int sender_id) {
92 auto context = std::make_unique<Context>();
93 context->signature.set_signature(
"signature");
96 request.set_current_view(1);
98 request.set_type(Request::TYPE_PREPARE);
99 request.set_sender_id(sender_id);
100 return commitment_->ProcessPrepareMsg(std::move(context),
101 std::make_unique<Request>(request));
104 int AddCommitMsg(
int sender_id) {
105 auto context = std::make_unique<Context>();
106 context->signature.set_signature(
"signature");
109 request.set_current_view(1);
111 request.set_type(Request::TYPE_COMMIT);
112 request.set_sender_id(sender_id);
113 return commitment_->ProcessCommitMsg(std::move(context),
114 std::make_unique<Request>(request));
129TEST_F(CommitmentTest, NotContesxt) {
131 commitment_->ProcessProposeMsg(
nullptr, std::make_unique<Request>()), -2);
133 commitment_->ProcessPrepareMsg(
nullptr, std::make_unique<Request>()), -2);
134 EXPECT_EQ(
commitment_->ProcessCommitMsg(
nullptr, std::make_unique<Request>()),
138TEST_F(CommitmentTest, NoSignature) {
139 EXPECT_EQ(
commitment_->ProcessProposeMsg(std::make_unique<Context>(),
140 std::make_unique<Request>()),
142 EXPECT_EQ(
commitment_->ProcessPrepareMsg(std::make_unique<Context>(),
143 std::make_unique<Request>()),
145 EXPECT_EQ(
commitment_->ProcessCommitMsg(std::make_unique<Context>(),
146 std::make_unique<Request>()),
150TEST_F(CommitmentTest, NoPrimary) {
152 EXPECT_EQ(AddProposeMsg(Request::TYPE_PRE_PREPARE, 1), -2);
156 auto context = std::make_unique<Context>();
157 context->signature.set_signature(
"signature");
159 request.set_data(
"data");
161 std::promise<bool> propose_done;
162 std::future<bool> propose_done_future = propose_done.get_future();
164 propose_done.set_value(
true);
168 VerifyMessage(
::testing::_, EqualsProto(SignatureInfo())))
169 .WillOnce(Return(
true));
171 EXPECT_EQ(
commitment_->ProcessNewRequest(std::move(context),
172 std::make_unique<Request>(request)),
174 propose_done_future.get();
177TEST_F(CommitmentTest, SeqConsumeAll) {
184 std::promise<bool> done;
185 std::future<bool> done_future = done.get_future();
187 VerifyMessage(
::testing::_, EqualsProto(SignatureInfo())))
188 .WillRepeatedly(Return(
true));
189 for (
int i = 0; i < 3; ++i) {
190 std::unique_ptr<MockNetChannel> channel =
191 std::make_unique<MockNetChannel>(
"127.0.0.1", 0);
192 auto context = std::make_unique<Context>();
193 context->signature.set_signature(
"signature");
195 request.set_data(
"sig" + std::to_string(i));
196 request.set_hash(
"hash" + std::to_string(i));
199 std::move(context), std::make_unique<Request>(request)),
203 std::move(context), std::make_unique<Request>(request)),
209TEST_F(CommitmentTest, ProposeMsgWithoutSignature) {
213 VerifyMessage(
::testing::_, EqualsProto(SignatureInfo())))
214 .WillOnce(Return(
false));
215 EXPECT_EQ(AddProposeMsg(Request::TYPE_PRE_PREPARE, 1), -2);
218TEST_F(CommitmentTest, ProposeMsg) {
220 BatchUserRequest request;
221 request.SerializeToString(&
data_);
223 EXPECT_CALL(
verifier_, VerifyMessage(
data_, EqualsProto(SignatureInfo())))
224 .WillOnce(Return(
true));
226 EXPECT_EQ(AddProposeMsg(Request::TYPE_PRE_PREPARE, 1), 0);
229TEST_F(CommitmentTest, ProposeMsgOnlyBCOnce) {
231 BatchUserRequest request;
232 request.SerializeToString(&
data_);
234 EXPECT_CALL(
verifier_, VerifyMessage(
data_, EqualsProto(SignatureInfo())))
235 .WillRepeatedly(Return(
true));
237 EXPECT_EQ(AddProposeMsg(Request::TYPE_PRE_PREPARE, 1), 0);
238 EXPECT_EQ(AddProposeMsg(Request::TYPE_PRE_PREPARE, 2), -2);
241TEST_F(CommitmentTest, ProcessPrepareMsg) {
244 EXPECT_EQ(AddProposeMsg(1), 0);
246 EXPECT_EQ(AddPrepareMsg(1), 0);
247 EXPECT_EQ(AddPrepareMsg(2), 0);
248 EXPECT_EQ(AddPrepareMsg(3), 0);
251TEST_F(CommitmentTest, ProcessPrepareMsgNotEnough) {
254 EXPECT_EQ(AddProposeMsg(1), 0);
256 EXPECT_EQ(AddPrepareMsg(1), 0);
259TEST_F(CommitmentTest, ProcessPrepareMsgNoProposeMsg) {
262 EXPECT_EQ(AddPrepareMsg(1), 0);
263 EXPECT_EQ(AddPrepareMsg(2), 0);
264 EXPECT_EQ(AddPrepareMsg(3), 0);
267TEST_F(CommitmentTest, ProcessPrepareMsgProposeMsgDelay) {
269 EXPECT_EQ(AddPrepareMsg(2), 0);
270 EXPECT_EQ(AddPrepareMsg(3), 0);
272 EXPECT_EQ(AddProposeMsg(1), 0);
274 EXPECT_EQ(AddPrepareMsg(1), 0);
277TEST_F(CommitmentTest, ProcessCommitMsg) {
281 EXPECT_EQ(AddProposeMsg(1), 0);
283 EXPECT_EQ(AddPrepareMsg(1), 0);
284 EXPECT_EQ(AddPrepareMsg(2), 0);
285 EXPECT_EQ(AddPrepareMsg(3), 0);
287 EXPECT_EQ(AddCommitMsg(1), 0);
288 EXPECT_EQ(AddCommitMsg(2), 0);
289 EXPECT_EQ(AddCommitMsg(3), 0);
292TEST_F(CommitmentTest, ProcessCommitMsgProposeDelay) {
296 EXPECT_EQ(AddPrepareMsg(2), 0);
297 EXPECT_EQ(AddPrepareMsg(3), 0);
299 EXPECT_EQ(AddCommitMsg(2), 0);
300 EXPECT_EQ(AddCommitMsg(3), 0);
302 EXPECT_EQ(AddProposeMsg(1), 0);
303 EXPECT_EQ(AddPrepareMsg(1), 0);
305 EXPECT_EQ(AddCommitMsg(1), 0);
308TEST_F(CommitmentTest, ProcessCommitMsgWithDuplicated) {
312 EXPECT_EQ(AddProposeMsg(1), 0);
313 EXPECT_EQ(AddProposeMsg(1), -2);
315 EXPECT_EQ(AddPrepareMsg(1), 0);
316 EXPECT_EQ(AddPrepareMsg(2), 0);
317 EXPECT_EQ(AddPrepareMsg(2), 0);
318 EXPECT_EQ(AddPrepareMsg(3), 0);
320 EXPECT_EQ(AddCommitMsg(1), 0);
321 EXPECT_EQ(AddCommitMsg(2), 0);
322 EXPECT_EQ(AddCommitMsg(3), 0);
323 EXPECT_EQ(AddCommitMsg(3), -2);
326TEST_F(CommitmentTest, ProcessCommitMsgWithResponse) {
329 std::promise<bool> done;
330 std::future<bool> done_future = done.get_future();
332 BatchUserResponse batch_resp;
334 batch_resp.set_primary_id(1);
335 batch_resp.set_proxy_id(1);
336 batch_resp.set_seq(1);
337 batch_resp.set_current_view(1);
340 Request resp_request;
341 resp_request.set_type(Request::TYPE_RESPONSE);
342 resp_request.set_sender_id(1);
343 resp_request.set_current_view(1);
344 resp_request.set_seq(1);
345 resp_request.set_proxy_id(1);
346 resp_request.set_primary_id(1);
347 batch_resp.SerializeToString(resp_request.mutable_data());
351 [&](
const google::protobuf::Message& request, int64_t node_id) {
352 done.set_value(
true);
356 EXPECT_EQ(AddProposeMsg(1,
true), 0);
358 EXPECT_EQ(AddPrepareMsg(1), 0);
359 EXPECT_EQ(AddPrepareMsg(2), 0);
360 EXPECT_EQ(AddPrepareMsg(3), 0);
362 EXPECT_EQ(AddCommitMsg(1), 0);
363 EXPECT_EQ(AddCommitMsg(2), 0);
364 EXPECT_EQ(AddCommitMsg(3), 0);
MockReplicaCommunicator replica_communicator_
void SetPrimary(uint32_t id)
std::unique_ptr< Commitment > commitment_
CheckPointManager checkpoint_manager_
std::unique_ptr< MessageManager > message_manager_
MockSignatureVerifier verifier_
T ParseFromText(const std::string &json_str)
std::unique_ptr< Request > NewRequest(Request::Type type, const Request &request, int sender_id)
ReplicaInfo GenerateReplicaInfo(int id, const std::string &ip, int port)
TEST_F(ResDBTest, TestPBFTService)
std::unique_ptr< ResDBConfig > config_