mirror of
https://github.com/XRPLF/clio.git
synced 2025-11-04 11:55:51 +00:00
test: Fix flaky test (#2729)
This commit is contained in:
@@ -44,8 +44,10 @@
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <chrono>
|
||||
#include <condition_variable>
|
||||
#include <cstddef>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <ranges>
|
||||
#include <string>
|
||||
#include <thread>
|
||||
@@ -108,32 +110,39 @@ TEST_F(WebWsConnectionTests, WasUpgraded)
|
||||
});
|
||||
}
|
||||
|
||||
// This test is either flaky or incorrect
|
||||
// see https://github.com/XRPLF/clio/issues/2700
|
||||
TEST_F(WebWsConnectionTests, DISABLED_DisconnectClientOnInactivity)
|
||||
TEST_F(WebWsConnectionTests, DisconnectClientOnInactivity)
|
||||
{
|
||||
boost::asio::io_context clientCtx;
|
||||
auto work = boost::asio::make_work_guard(clientCtx);
|
||||
std::thread clientThread{[&clientCtx]() { clientCtx.run(); }};
|
||||
|
||||
util::spawn(clientCtx, [&work, this](boost::asio::yield_context yield) {
|
||||
std::mutex mutex;
|
||||
std::condition_variable cv;
|
||||
bool finished{false};
|
||||
|
||||
util::spawn(clientCtx, [&](boost::asio::yield_context yield) {
|
||||
auto expectedSuccess =
|
||||
wsClient_.connect("localhost", httpServer_.port(), yield, std::chrono::milliseconds{100});
|
||||
[&]() { ASSERT_TRUE(expectedSuccess.has_value()) << expectedSuccess.error().message(); }();
|
||||
boost::asio::steady_timer timer{yield.get_executor(), std::chrono::milliseconds{5}};
|
||||
timer.async_wait(yield);
|
||||
std::unique_lock lock{mutex};
|
||||
// Wait for 2 seconds to not block the test infinitely in case of failure
|
||||
auto const gotNotified = cv.wait_for(lock, std::chrono::seconds{2}, [&finished]() { return finished; });
|
||||
[&]() { EXPECT_TRUE(gotNotified); }();
|
||||
work.reset();
|
||||
});
|
||||
|
||||
runSpawn([this](boost::asio::yield_context yield) {
|
||||
runSpawn([&, this](boost::asio::yield_context yield) {
|
||||
auto wsConnection = acceptConnection(yield);
|
||||
wsConnection->setTimeout(std::chrono::milliseconds{1});
|
||||
// Client will not respond to pings because there is no reading operation scheduled for it.
|
||||
|
||||
auto const start = std::chrono::steady_clock::now();
|
||||
// Client will not respond to pings because there is no reading operation scheduled for it.
|
||||
auto const receivedMessage = wsConnection->receive(yield);
|
||||
auto const end = std::chrono::steady_clock::now();
|
||||
EXPECT_LT(end - start, std::chrono::milliseconds{4}); // Should be 2 ms, double it in case of slow CI.
|
||||
|
||||
{
|
||||
std::unique_lock lock{mutex};
|
||||
finished = true;
|
||||
cv.notify_one();
|
||||
}
|
||||
|
||||
EXPECT_FALSE(receivedMessage.has_value());
|
||||
EXPECT_EQ(receivedMessage.error().value(), boost::asio::error::no_permission);
|
||||
|
||||
Reference in New Issue
Block a user