Loading...
Searching...
No Matches
geo_pbft_commitment_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
28#include "platform/communication/mock_resdb_replica_client.h"
31#include "platform/consensus/execution/mock_transaction_executor_impl.h"
32#include "platform/crypto/mock_signature_verifier.h"
33
34namespace resdb {
35namespace {
36using ::testing::Invoke;
37using ::testing::Return;
38using ::testing::Test;
39
40TEST(GeoCommitTest, GeoRequestFromOtherRegion) {
41 ResConfigData config_data = ResConfigData();
42 config_data.set_self_region_id(1);
43 std::vector<ReplicaInfo> replicas = {
44 GenerateReplicaInfo(1, "127.0.0.1", 1234),
45 GenerateReplicaInfo(2, "127.0.0.1", 1235),
46 GenerateReplicaInfo(3, "127.0.0.1", 1236),
47 GenerateReplicaInfo(4, "127.0.0.1", 1237)};
48 ResDBConfig config = ResDBConfig(
49 replicas, GenerateReplicaInfo(1, "127.0.0.1", 1234), config_data);
50 auto system_info = std::make_unique<SystemInfo>(config);
51 MockResDBReplicaClient replica_client;
52 std::unique_ptr<MockGeoGlobalExecutor> global_executor;
53 std::unique_ptr<GeoPBFTCommitment> commitment;
54
55 auto context = std::make_unique<Context>();
56 context->signature.set_signature("signature");
57
58 Request request;
59 request.set_seq(1);
60 request.mutable_region_info()->set_region_id(2);
61 BatchClientRequest client_request;
62 *client_request.mutable_committed_certs()->add_committed_certs() =
63 SignatureInfo();
64 client_request.SerializeToString(request.mutable_data());
65
66 global_executor = std::make_unique<MockGeoGlobalExecutor>(
67 std::make_unique<MockTransactionExecutorImpl>(), config);
68 std::promise<bool> done;
69 std::future<bool> done_future = done.get_future();
70 EXPECT_CALL(replica_client, BroadCast).Times(1);
71 EXPECT_CALL(*global_executor, Execute).Times(1).WillOnce(Invoke([&]() {
72 done.set_value(true);
73 return;
74 }));
75
76 MockSignatureVerifier verifier;
77 EXPECT_CALL(verifier, VerifyMessage(::testing::_, ::testing::_))
78 .WillOnce(Return(true));
79 commitment = std::make_unique<GeoPBFTCommitment>(
80 std::move(global_executor), config, std::move(system_info),
81 &replica_client, &verifier);
82 EXPECT_EQ(commitment->GeoProcessCcm(std::move(context),
83 std::make_unique<Request>(request)),
84 0);
85 done_future.get();
86}
87
88TEST(GeoCommitTest, GeoRequestFromLocalRegion) {
89 ResConfigData config_data = ResConfigData();
90 config_data.set_self_region_id(1);
91 std::vector<ReplicaInfo> replicas = {
92 GenerateReplicaInfo(1, "127.0.0.1", 1234),
93 GenerateReplicaInfo(2, "127.0.0.1", 1235),
94 GenerateReplicaInfo(3, "127.0.0.1", 1236),
95 GenerateReplicaInfo(4, "127.0.0.1", 1237)};
96 ResDBConfig config = ResDBConfig(
97 replicas, GenerateReplicaInfo(1, "127.0.0.1", 1234), config_data);
98 auto system_info = std::make_unique<SystemInfo>(config);
99 MockResDBReplicaClient replica_client;
100 std::unique_ptr<MockGeoGlobalExecutor> global_executor;
101 std::unique_ptr<GeoPBFTCommitment> commitment;
102
103 auto context = std::make_unique<Context>();
104 context->signature.set_signature("signature");
105 Request request;
106 request.set_seq(1);
107 request.mutable_region_info()->set_region_id(1);
108 global_executor = std::make_unique<MockGeoGlobalExecutor>(
109 std::make_unique<MockTransactionExecutorImpl>(), config);
110
111 BatchClientRequest client_request;
112 *client_request.mutable_committed_certs()->add_committed_certs() =
113 SignatureInfo();
114 client_request.SerializeToString(request.mutable_data());
115 EXPECT_CALL(replica_client, BroadCast).Times(0);
116
117 std::promise<bool> done;
118 std::future<bool> done_future = done.get_future();
119 EXPECT_CALL(*global_executor, Execute).Times(1).WillOnce(Invoke([&]() {
120 done.set_value(true);
121 return;
122 }));
123
124 MockSignatureVerifier verifier;
125 EXPECT_CALL(verifier, VerifyMessage(::testing::_, ::testing::_))
126 .WillOnce(Return(true));
127 commitment = std::make_unique<GeoPBFTCommitment>(
128 std::move(global_executor), config, std::move(system_info),
129 &replica_client, &verifier);
130 EXPECT_EQ(commitment->GeoProcessCcm(std::move(context),
131 std::make_unique<Request>(request)),
132 0);
133 done_future.get();
134}
135
136TEST(GeoCommitTest, ReceiveSameGeoRequest) {
137 ResConfigData config_data = ResConfigData();
138 config_data.set_self_region_id(1);
139 std::vector<ReplicaInfo> replicas = {
140 GenerateReplicaInfo(1, "127.0.0.1", 1234),
141 GenerateReplicaInfo(2, "127.0.0.1", 1235),
142 GenerateReplicaInfo(3, "127.0.0.1", 1236),
143 GenerateReplicaInfo(4, "127.0.0.1", 1237)};
144 ResDBConfig config = ResDBConfig(
145 replicas, GenerateReplicaInfo(1, "127.0.0.1", 1234), config_data);
146 auto system_info = std::make_unique<SystemInfo>(config);
147 MockResDBReplicaClient replica_client;
148
149 auto context = std::make_unique<Context>();
150 context->signature.set_signature("signature");
151 Request request;
152 request.set_seq(1);
153 request.mutable_region_info()->set_region_id(2);
154
155 BatchClientRequest client_request;
156 *client_request.mutable_committed_certs()->add_committed_certs() =
157 SignatureInfo();
158 client_request.SerializeToString(request.mutable_data());
159
160 auto global_executor = std::make_unique<MockGeoGlobalExecutor>(
161 std::make_unique<MockTransactionExecutorImpl>(), config);
162 auto commitment = std::make_unique<GeoPBFTCommitment>(
163 std::move(global_executor), config, std::move(system_info),
164 &replica_client, nullptr);
165 EXPECT_EQ(commitment->GeoProcessCcm(std::move(context),
166 std::make_unique<Request>(request)),
167 0);
168
169 request.mutable_region_info()->set_region_id(1);
170 auto context_2 = std::make_unique<Context>();
171 context_2->signature.set_signature("signature");
172 EXPECT_EQ(commitment->GeoProcessCcm(std::move(context_2),
173 std::make_unique<Request>(request)),
174 1);
175 LOG(ERROR) << "done";
176}
177
178TEST(GeoCommitTest, NoCert) {
179 ResConfigData config_data = ResConfigData();
180 config_data.set_self_region_id(1);
181 std::vector<ReplicaInfo> replicas = {
182 GenerateReplicaInfo(1, "127.0.0.1", 1234),
183 GenerateReplicaInfo(2, "127.0.0.1", 1235),
184 GenerateReplicaInfo(3, "127.0.0.1", 1236),
185 GenerateReplicaInfo(4, "127.0.0.1", 1237)};
186 ResDBConfig config = ResDBConfig(
187 replicas, GenerateReplicaInfo(1, "127.0.0.1", 1234), config_data);
188 auto system_info = std::make_unique<SystemInfo>(config);
189 MockResDBReplicaClient replica_client;
190 std::unique_ptr<MockGeoGlobalExecutor> global_executor;
191 std::unique_ptr<GeoPBFTCommitment> commitment;
192
193 auto context = std::make_unique<Context>();
194 context->signature.set_signature("signature");
195 Request request;
196 request.set_seq(1);
197 request.mutable_region_info()->set_region_id(2);
198
199 BatchClientRequest client_request;
200 client_request.SerializeToString(request.mutable_data());
201
202 MockSignatureVerifier verifier;
203 EXPECT_CALL(verifier, VerifyMessage(::testing::_, ::testing::_)).Times(0);
204
205 global_executor = std::make_unique<MockGeoGlobalExecutor>(
206 std::make_unique<MockTransactionExecutorImpl>(), config);
207 commitment = std::make_unique<GeoPBFTCommitment>(
208 std::move(global_executor), config, std::move(system_info),
209 &replica_client, &verifier);
210 EXPECT_EQ(commitment->GeoProcessCcm(std::move(context),
211 std::make_unique<Request>(request)),
212 -2);
213}
214
215} // namespace
216} // namespace resdb
T ParseFromText(const std::string &json_str)
Definition test_macros.h:41
ReplicaInfo GenerateReplicaInfo(int id, const std::string &ip, int port)
TEST(NetworkUtilsTest, GetDNSName)