chore: use condition variable to shutdown websocket pools (#5721)
This commit is contained in:
@@ -51,6 +51,7 @@ set(test_SOURCES
|
||||
${CMAKE_CURRENT_LIST_DIR}/src/Plugins.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/src/TwitchIrc.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/src/IgnoreController.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/src/OnceFlag.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/src/lib/Snapshot.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/src/lib/Snapshot.hpp
|
||||
# Add your new file above this line!
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
#include "util/OnceFlag.hpp"
|
||||
|
||||
#include "Test.hpp"
|
||||
|
||||
#include <thread>
|
||||
|
||||
using namespace chatterino;
|
||||
|
||||
// this test shouldn't time out (no assert necessary)
|
||||
TEST(OnceFlag, basic)
|
||||
{
|
||||
OnceFlag startedFlag;
|
||||
OnceFlag startedAckFlag;
|
||||
OnceFlag stoppedFlag;
|
||||
|
||||
std::thread t([&] {
|
||||
startedFlag.set();
|
||||
startedAckFlag.wait();
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds{50});
|
||||
stoppedFlag.set();
|
||||
});
|
||||
|
||||
startedFlag.wait();
|
||||
startedAckFlag.set();
|
||||
stoppedFlag.wait();
|
||||
|
||||
t.join();
|
||||
}
|
||||
|
||||
TEST(OnceFlag, waitFor)
|
||||
{
|
||||
OnceFlag startedFlag;
|
||||
OnceFlag startedAckFlag;
|
||||
OnceFlag stoppedFlag;
|
||||
|
||||
std::thread t([&] {
|
||||
startedFlag.set();
|
||||
startedAckFlag.wait();
|
||||
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds{100});
|
||||
stoppedFlag.set();
|
||||
});
|
||||
|
||||
startedFlag.wait();
|
||||
startedAckFlag.set();
|
||||
|
||||
auto start = std::chrono::system_clock::now();
|
||||
ASSERT_TRUE(stoppedFlag.waitFor(std::chrono::milliseconds{200}));
|
||||
auto stop = std::chrono::system_clock::now();
|
||||
|
||||
ASSERT_LT(stop - start, std::chrono::milliseconds{150});
|
||||
|
||||
start = std::chrono::system_clock::now();
|
||||
ASSERT_TRUE(stoppedFlag.waitFor(std::chrono::milliseconds{1000}));
|
||||
stop = std::chrono::system_clock::now();
|
||||
|
||||
ASSERT_LT(stop - start, std::chrono::milliseconds{10});
|
||||
|
||||
start = std::chrono::system_clock::now();
|
||||
stoppedFlag.wait();
|
||||
stop = std::chrono::system_clock::now();
|
||||
|
||||
ASSERT_LT(stop - start, std::chrono::milliseconds{10});
|
||||
|
||||
t.join();
|
||||
}
|
||||
|
||||
TEST(OnceFlag, waitForTimeout)
|
||||
{
|
||||
OnceFlag startedFlag;
|
||||
OnceFlag startedAckFlag;
|
||||
OnceFlag stoppedFlag;
|
||||
|
||||
std::thread t([&] {
|
||||
startedFlag.set();
|
||||
startedAckFlag.wait();
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds{100});
|
||||
stoppedFlag.set();
|
||||
});
|
||||
|
||||
startedFlag.wait();
|
||||
startedAckFlag.set();
|
||||
|
||||
ASSERT_FALSE(stoppedFlag.waitFor(std::chrono::milliseconds{25}));
|
||||
stoppedFlag.wait();
|
||||
|
||||
t.join();
|
||||
}
|
||||
Reference in New Issue
Block a user