From cf62cf4ff89aa36e8f10f19f7f420e48a737cb68 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Mon, 29 Sep 2025 07:32:09 -0500 Subject: [PATCH] slow remote mount unit tests --- .../repertory_test/src/packet_client_test.cpp | 88 ++++++++++++++++++- 1 file changed, 87 insertions(+), 1 deletion(-) diff --git a/repertory/repertory_test/src/packet_client_test.cpp b/repertory/repertory_test/src/packet_client_test.cpp index 5b2ea3bd..d67b9b1f 100644 --- a/repertory/repertory_test/src/packet_client_test.cpp +++ b/repertory/repertory_test/src/packet_client_test.cpp @@ -65,7 +65,6 @@ inline auto make_cfg(std::uint16_t port, const std::string &token) cfg.encryption_token = token; return cfg; } -} // namespace TEST(packet_client_test, can_check_version) { std::string token = "cow_moose_doge_chicken"; @@ -120,3 +119,90 @@ TEST(packet_client_test, can_send_request_and_receive_response) { EXPECT_EQ(ret, 0); } + +TEST(packet_client_test, pooled_connection_reused_on_second_send) { + std::string token{"test_token"}; + std::uint16_t port{}; + ASSERT_TRUE(utils::get_next_available_port(50000U, port)); + + std::atomic close_count{0U}; + + packet_server server{ + port, token, 2U, + [&close_count](const std::string & /*client_id*/) { ++close_count; }, + [](std::uint32_t /*service_flags_in*/, const std::string & /*client_id*/, + std::uint64_t /*thread_id*/, const std::string &method, + packet * /*request*/, packet & /*response*/, + packet_server::message_complete_callback done) { + if (method == "ping") { + done(packet::error_type{0}); + } else { + done(packet::error_type{-1}); + } + }}; + + packet_client client(::make_cfg(port, token)); + + std::uint32_t service_flags{}; + packet req_one; + packet resp_one; + auto ret_one = client.send("ping", req_one, resp_one, service_flags); + EXPECT_EQ(ret_one, 0); + + packet req_two; + packet resp_two; + auto ret_two = client.send("ping", req_two, resp_two, service_flags); + EXPECT_EQ(ret_two, 0); + + EXPECT_EQ(close_count, 0U); +} + +TEST(packet_client_test, reconnects_when_server_closes_socket) { + std::string token{"test_token"}; + std::uint16_t port{}; + ASSERT_TRUE(utils::get_next_available_port(50000U, port)); + + std::atomic close_count{0U}; + std::shared_ptr last_conn; + + packet_server server{ + port, token, 2U, + [&close_count](const std::string & /*client_id*/) { ++close_count; }, + [&last_conn](std::uint32_t /*service_flags_in*/, + const std::string & /*client_id*/, + std::uint64_t /*thread_id*/, const std::string &method, + packet * /*request*/, packet & /*response*/, + packet_server::message_complete_callback done) { + if (method == "ping") { + done(packet::error_type{0}); + } else { + done(packet::error_type{-1}); + } + }}; + + packet_client client(::make_cfg(port, token)); + + std::uint32_t service_flags{}; + packet req_one; + packet resp_one; + auto ret_one = client.send("ping", req_one, resp_one, service_flags); + EXPECT_EQ(ret_one, 0); + + { + std::lock_guard guard(server.conn_mutex_); + if (not server.connections_.empty()) { + auto conn = *server.connections_.begin(); + boost::system::error_code ec; + conn->socket().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec); + conn->socket().close(ec); + } + } + + packet req_two; + packet resp_two; + auto ret_two = client.send("ping", req_two, resp_two, service_flags); + EXPECT_EQ(ret_two, 0); + + EXPECT_EQ(close_count, 1U); +} +} // namespace