22#include <glog/logging.h>
23#include <gmock/gmock.h>
24#include <gtest/gtest.h>
39using ::resdb::testing::EqualsProto;
41using ::testing::Invoke;
42using ::testing::Return;
45ResDBConfig GenerateConfig() {
46 ResConfigData config_data;
47 config_data.set_view_change_timeout_ms(100);
56class QueryTest :
public Test {
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");
73 request.set_current_view(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);
80 return commitment_.ProcessProposeMsg(std::move(context),
81 std::make_unique<Request>(request));
84 int AddPrepareMsg(
int sender_id) {
85 auto context = std::make_unique<Context>();
86 context->signature.set_signature(
"signature");
89 request.set_current_view(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));
97 int AddCommitMsg(
int sender_id) {
98 auto context = std::make_unique<Context>();
99 context->signature.set_signature(
"signature");
102 request.set_current_view(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));
111 std::promise<bool> done;
112 std::future<bool> done_future = done.get_future();
114 EXPECT_CALL(replica_communicator_, SendMessage(_, 1))
116 [&](
const google::protobuf::Message& request, int64_t node_id) {
117 done.set_value(
true);
121 EXPECT_EQ(AddProposeMsg(1,
true), 0);
123 EXPECT_EQ(AddPrepareMsg(1), 0);
124 EXPECT_EQ(AddPrepareMsg(2), 0);
125 EXPECT_EQ(AddPrepareMsg(3), 0);
127 EXPECT_EQ(AddCommitMsg(1), 0);
128 EXPECT_EQ(AddCommitMsg(2), 0);
129 EXPECT_EQ(AddCommitMsg(3), 0);
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);
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);
160 std::unique_ptr<MockNetChannel> channel =
161 std::make_unique<MockNetChannel>(
"127.0.0.1", 0);
162 EXPECT_CALL(*channel, SendRawMessage(EqualsProtoNoConfigData(replica_state)))
165 auto context = std::make_unique<Context>();
166 context->client = std::move(channel);
167 context->signature.set_signature(
"signature");
173TEST_F(QueryTest, QueryTxn) {
176 QueryResponse response;
177 auto txn = response.add_transactions();
179 txn->set_proxy_id(1);
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);
185 auto context = std::make_unique<Context>();
186 context->client = std::move(channel);
188 context->signature.set_signature(
"signature");
192 query.set_min_seq(1);
193 query.set_max_seq(2);
194 query.SerializeToString(request.mutable_data());
197 std::make_unique<Request>(request));
MockReplicaCommunicator replica_communicator_
virtual int ProcessGetReplicaState(std::unique_ptr< Context > context, std::unique_ptr< Request > request)
virtual int ProcessQuery(std::unique_ptr< Context > context, std::unique_ptr< Request > request)
std::unique_ptr< Commitment > commitment_
CheckPointManager checkpoint_manager_
std::unique_ptr< MessageManager > message_manager_
MockSignatureVerifier verifier_
MATCHER_P(EqualsProto, replica, "")
ReplicaInfo GenerateReplicaInfo(int id, const std::string &ip, int port)
TEST_F(ResDBTest, TestPBFTService)
std::unique_ptr< ResDBConfig > config_