22#include <glog/logging.h>
23#include <gmock/gmock.h>
24#include <gtest/gtest.h>
33#include "platform/proto/checkpoint_info.pb.h"
39using ::resdb::testing::EqualsProto;
41using ::testing::Invoke;
42using ::testing::Return;
45class MyCheckPointManager :
public CheckPointManager {
47 MyCheckPointManager(
const ResDBConfig& config,
48 ReplicaCommunicator* replica_communicator,
49 SignatureVerifier* verifier,
50 std::function<
void(int64_t)> call_back =
nullptr)
51 : CheckPointManager(config, replica_communicator, verifier),
54 void UpdateStableCheckPointCallback(int64_t stable_checkpoint) {
62ResConfigData GetConfigData() {
67 " \"replica_info\": { "
69 " \"ip\": \"127.0.0.1\", "
72 " \"replica_info\": { "
74 " \"ip\": \"127.0.0.1\", "
77 " \"replica_info\": { "
79 " \"ip\": \"127.0.0.1\", "
82 " \"replica_info\": { "
84 " \"ip\": \"127.0.0.1\", "
88 "\"view_change_timeout_ms\": 500"
93class CheckPointManagerTest :
public Test {
95 CheckPointManagerTest()
98 KeyInfo(), CertificateInfo()) {
107TEST_F(CheckPointManagerTest, SendCheckPoint) {
108 config_.SetViewchangeCommitTimeout(100);
111 for (
int i = 1; i <= 5; ++i) {
112 std::unique_ptr<Request> request = std::make_unique<Request>();
114 manager.AddCommitData(std::move(request));
117 std::promise<bool> propose_done;
118 std::future<bool> propose_done_future = propose_done.get_future();
120 LOG(ERROR) <<
"bcbcbc";
121 propose_done.set_value(
true);
123 propose_done_future.get();
124 LOG(ERROR) <<
"done";
127TEST_F(CheckPointManagerTest, SendCheckPointOnce) {
128 std::promise<bool> propose_done;
129 std::future<bool> propose_done_future = propose_done.get_future();
132 propose_done.set_value(
true);
136 for (
int i = 1; i <= 5; ++i) {
137 std::unique_ptr<Request> request = std::make_unique<Request>();
139 manager.AddCommitData(std::move(request));
143 std::unique_ptr<Request> request = std::make_unique<Request>();
145 manager.AddCommitData(std::move(request));
148 propose_done_future.get();
151TEST_F(CheckPointManagerTest, SendCheckPointTwo) {
152 config_.SetViewchangeCommitTimeout(100);
153 std::promise<bool> propose_done;
154 std::future<bool> propose_done_future = propose_done.get_future();
158 propose_done.set_value(
true);
163 std::unique_ptr<Request> request = std::make_unique<Request>();
164 for (
int i = 1; i <= 5; ++i) {
165 std::unique_ptr<Request> request = std::make_unique<Request>();
167 manager.AddCommitData(std::move(request));
170 for (
int i = 6; i <= 11; ++i) {
171 std::unique_ptr<Request> request = std::make_unique<Request>();
173 manager.AddCommitData(std::move(request));
176 propose_done_future.get();
179TEST_F(CheckPointManagerTest, StableCkpt) {
180 config_.SetViewchangeCommitTimeout(100);
181 std::promise<bool> ckp_done;
182 std::future<bool> ckp_done_future = ckp_done.get_future();
183 bool already_set = 0;
186 if (seq > 0 && !already_set) {
188 ckp_done.set_value(
true);
191 for (
int i = 1; i <= 4; ++i) {
192 CheckPointData checkpoint_data;
193 std::unique_ptr<Request> checkpoint_request =
194 NewRequest(Request::TYPE_CHECKPOINT, Request(), i);
195 checkpoint_data.set_seq(5);
196 checkpoint_data.set_hash(
"1234");
197 checkpoint_data.SerializeToString(checkpoint_request->mutable_data());
198 EXPECT_EQ(manager.ProcessCheckPoint(std::make_unique<Context>(),
199 std::move(checkpoint_request)),
202 ckp_done_future.get();
203 EXPECT_EQ(manager.GetStableCheckpoint(), 5);
206TEST_F(CheckPointManagerTest, StableCkptNotEnough) {
207 config_.SetViewchangeCommitTimeout(1000);
208 std::promise<bool> ckp_done;
209 std::future<bool> ckp_done_future = ckp_done.get_future();
210 bool set_done =
false;
213 if (seq > 0 && !set_done) {
215 ckp_done.set_value(
true);
218 for (
int i = 1; i <= 4; ++i) {
219 CheckPointData checkpoint_data;
220 std::unique_ptr<Request> checkpoint_request =
221 NewRequest(Request::TYPE_CHECKPOINT, Request(), i);
222 checkpoint_data.set_seq(5);
223 checkpoint_data.set_hash(
"1234");
224 checkpoint_data.SerializeToString(checkpoint_request->mutable_data());
225 EXPECT_EQ(manager.ProcessCheckPoint(std::make_unique<Context>(),
226 std::move(checkpoint_request)),
229 for (
int i = 1; i <= 4; ++i) {
230 CheckPointData checkpoint_data;
231 std::unique_ptr<Request> checkpoint_request =
232 NewRequest(Request::TYPE_CHECKPOINT, Request(), i);
233 checkpoint_data.set_seq(10);
235 checkpoint_data.set_hash(
"1234");
237 checkpoint_data.set_hash(
"2345");
239 checkpoint_data.SerializeToString(checkpoint_request->mutable_data());
240 EXPECT_EQ(manager.ProcessCheckPoint(std::make_unique<Context>(),
241 std::move(checkpoint_request)),
245 ckp_done_future.get();
246 EXPECT_EQ(manager.GetStableCheckpoint(), 5);
249TEST_F(CheckPointManagerTest, Votes) {
250 config_.SetViewchangeCommitTimeout(100);
251 MockSignatureVerifier mock_verifier;
252 EXPECT_CALL(mock_verifier, SignMessage).WillOnce(Return(SignatureInfo()));
253 EXPECT_CALL(mock_verifier, VerifyMessage(_, EqualsProto(SignatureInfo())))
254 .WillRepeatedly(Return(
true));
256 std::promise<bool> propose_done;
257 std::future<bool> propose_done_future = propose_done.get_future();
260 .WillRepeatedly(Invoke([&](
const google::protobuf::Message& message) {
261 for (
int i = 1; i <= 3; ++i) {
262 std::unique_ptr<Request> checkpoint_request =
263 std::make_unique<Request>();
264 checkpoint_request->CopyFrom(message);
265 checkpoint_request->set_sender_id(i);
266 EXPECT_EQ(manager.ProcessCheckPoint(std::make_unique<Context>(),
267 std::move(checkpoint_request)),
270 propose_done.set_value(
true);
273 std::unique_ptr<Request> request = std::make_unique<Request>();
274 for (
int i = 1; i <= 5; ++i) {
275 std::unique_ptr<Request> request = std::make_unique<Request>();
277 manager.AddCommitData(std::move(request));
279 propose_done_future.get();
281 StableCheckPoint ckpt = manager.GetStableCheckpointWithVotes();
282 EXPECT_EQ(ckpt.seq(), 5);
283 EXPECT_EQ(ckpt.signatures_size(), 3);
MockReplicaCommunicator replica_communicator_
std::function< void(int64_t)> call_back_
static Stats * GetGlobalStats(int sleep_seconds=5)
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_