22#include <gmock/gmock.h>
23#include <gtest/gtest.h>
33using ::resdb::testing::EqualsProto;
34using ::testing::Invoke;
36ResDBConfig GetResDBConfig() {
37 return ResDBConfig({ReplicaInfo()}, ReplicaInfo());
40TEST(TransactionExecutorTest, ExecuteOne) {
41 std::promise<bool> done;
42 std::future<bool> done_future = done.get_future();
44 ResDBConfig config = GetResDBConfig();
48 BatchUserRequest batch_request;
49 batch_request.add_user_requests()->mutable_request()->set_data(
"execute_1");
50 batch_request.SerializeToString(request.mutable_data());
52 SystemInfo system_info(config);
53 auto mock_executor = std::make_unique<MockTransactionExecutorDataImpl>();
55 EXPECT_CALL(*mock_executor, ExecuteData)
56 .WillOnce(Invoke([&](
const std::string& input) {
57 EXPECT_EQ(input,
"execute_1");
61 TransactionExecutor executor(
63 [&](std::unique_ptr<Request>, std::unique_ptr<BatchUserResponse> resp) {},
64 &system_info, std::move(mock_executor));
66 EXPECT_EQ(executor.Commit(std::make_unique<Request>(request)), 0);
71TEST(TransactionExecutorTest, MaxPendingExecuteSeq) {
73 ResDBConfig config = GetResDBConfig();
78 BatchUserRequest batch_request;
79 batch_request.add_user_requests()->mutable_request()->set_data(
"execute_1");
80 batch_request.SerializeToString(request.mutable_data());
83 std::condition_variable cv;
84 std::atomic<int> call_num = 0;
85 SystemInfo system_info(config);
86 TransactionExecutor executor(
88 [&](std::unique_ptr<Request>, std::unique_ptr<BatchUserResponse> resp) {},
89 &system_info, std::make_unique<MockTransactionManager>());
91 executor.SetSeqUpdateNotifyFunc([&](uint64_t seq) {
92 std::unique_lock<std::mutex> lk(mutex);
97 EXPECT_EQ(executor.Commit(std::make_unique<Request>(request)), 0);
99 std::unique_lock<std::mutex> lk(mutex);
100 cv.wait(lk, [&]() {
return call_num >= 1; });
102 EXPECT_LE(executor.GetMaxPendingExecutedSeq(), 1);
105 EXPECT_EQ(executor.Commit(std::make_unique<Request>(request)), 0);
106 EXPECT_EQ(executor.GetMaxPendingExecutedSeq(), 1);
109 EXPECT_EQ(executor.Commit(std::make_unique<Request>(request)), 0);
111 std::unique_lock<std::mutex> lk(mutex);
112 cv.wait(lk, [&]() {
return call_num == 3; });
114 EXPECT_EQ(executor.GetMaxPendingExecutedSeq(), 3);
117TEST(TransactionExecutorTest, MaxPendingExecuteSeqOnOutOfOrder) {
119 ResDBConfig config = GetResDBConfig();
124 BatchUserRequest batch_request;
125 batch_request.add_user_requests()->mutable_request()->set_data(
"execute_1");
126 batch_request.SerializeToString(request.mutable_data());
129 std::condition_variable cv;
130 std::atomic<int> call_num = 0;
131 SystemInfo system_info(config);
132 TransactionExecutor executor(
134 [&](std::unique_ptr<Request>, std::unique_ptr<BatchUserResponse> resp) {},
135 &system_info, std::make_unique<MockTransactionManager>(
true));
137 executor.SetSeqUpdateNotifyFunc([&](uint64_t seq) {
138 std::unique_lock<std::mutex> lk(mutex);
143 EXPECT_EQ(executor.Commit(std::make_unique<Request>(request)), 0);
145 std::unique_lock<std::mutex> lk(mutex);
146 cv.wait(lk, [&]() {
return call_num >= 1; });
148 EXPECT_LE(executor.GetMaxPendingExecutedSeq(), 1);
151 EXPECT_EQ(executor.Commit(std::make_unique<Request>(request)), 0);
152 EXPECT_EQ(executor.GetMaxPendingExecutedSeq(), 1);
155 EXPECT_EQ(executor.Commit(std::make_unique<Request>(request)), 0);
157 std::unique_lock<std::mutex> lk(mutex);
158 cv.wait(lk, [&]() {
return call_num == 3; });
160 EXPECT_EQ(executor.GetMaxPendingExecutedSeq(), 3);
163TEST(TransactionExecutorTest, ExecuteWaitInOrder) {
164 std::promise<bool> done;
165 std::future<bool> done_future = done.get_future();
167 ResDBConfig config = GetResDBConfig();
169 SystemInfo system_info(config);
170 auto mock_executor = std::make_unique<MockTransactionExecutorDataImpl>();
172 EXPECT_CALL(*mock_executor, ExecuteData)
173 .WillOnce(Invoke([&](
const std::string& input) {
174 EXPECT_EQ(input,
"execute_1");
177 .WillOnce(Invoke([&](
const std::string& input) {
178 EXPECT_EQ(input,
"execute_2");
179 done.set_value(
true);
183 TransactionExecutor executor(
185 [&](std::unique_ptr<Request>, std::unique_ptr<BatchUserResponse> resp) {},
186 &system_info, std::move(mock_executor));
190 BatchUserRequest batch_request;
191 batch_request.add_user_requests()->mutable_request()->set_data(
"execute_2");
192 batch_request.SerializeToString(request.mutable_data());
193 EXPECT_EQ(executor.Commit(std::make_unique<Request>(request)), 0);
196 batch_request.clear_user_requests();
197 batch_request.add_user_requests()->mutable_request()->set_data(
"execute_1");
198 batch_request.SerializeToString(request.mutable_data());
199 EXPECT_EQ(executor.Commit(std::make_unique<Request>(request)), 0);
204TEST(TransactionExecutorTest, ExecuteWaitOutOfOrder) {
205 std::promise<bool> done;
206 std::future<bool> done_future = done.get_future();
208 ResDBConfig config = GetResDBConfig();
210 SystemInfo system_info(config);
211 auto mock_executor = std::make_unique<MockTransactionManager>(
true);
213 EXPECT_CALL(*mock_executor, ExecuteBatch)
214 .WillOnce(Invoke([&](
const BatchUserRequest& request) {
215 EXPECT_EQ(request.seq(), 4);
218 .WillOnce(Invoke([&](
const BatchUserRequest& request) {
219 EXPECT_EQ(request.seq(), 1);
220 done.set_value(
true);
224 TransactionExecutor executor(
226 [&](std::unique_ptr<Request>, std::unique_ptr<BatchUserResponse> resp) {},
227 &system_info, std::move(mock_executor));
231 BatchUserRequest batch_request;
232 batch_request.add_user_requests()->mutable_request()->set_data(
"execute_2");
233 batch_request.SerializeToString(request.mutable_data());
234 EXPECT_EQ(executor.Commit(std::make_unique<Request>(request)), 0);
237 batch_request.clear_user_requests();
238 batch_request.add_user_requests()->mutable_request()->set_data(
"execute_1");
239 batch_request.SerializeToString(request.mutable_data());
240 EXPECT_EQ(executor.Commit(std::make_unique<Request>(request)), 0);
245TEST(TransactionExecutorTest, CallBack) {
246 std::promise<bool> done;
247 std::future<bool> done_future = done.get_future();
249 ResDBConfig config = GetResDBConfig();
253 BatchUserRequest batch_request;
254 batch_request.add_user_requests()->mutable_request()->set_data(
"execute_1");
255 batch_request.SerializeToString(request.mutable_data());
257 SystemInfo system_info(config);
258 auto mock_executor = std::make_unique<MockTransactionExecutorDataImpl>();
260 EXPECT_CALL(*mock_executor, ExecuteData)
261 .WillOnce(Invoke([&](
const std::string& input) {
262 EXPECT_EQ(input,
"execute_1");
266 TransactionExecutor executor(
268 [&](std::unique_ptr<Request> call_request,
269 std::unique_ptr<BatchUserResponse> resp) {
270 EXPECT_EQ(call_request->seq(), 1);
271 done.set_value(
true);
273 &system_info, std::move(mock_executor));
275 EXPECT_EQ(executor.Commit(std::make_unique<Request>(request)), 0);
static Stats * GetGlobalStats(int sleep_seconds=5)
TEST(NetworkUtilsTest, GetDNSName)