Files
chatterino2/tests/src/OnceFlag.cpp

110 lines
2.5 KiB
C++

#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{200});
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();
ASSERT_TRUE(startedFlag.isSet());
startedAckFlag.set();
ASSERT_TRUE(startedAckFlag.isSet());
ASSERT_FALSE(stoppedFlag.waitFor(std::chrono::milliseconds{25}));
stoppedFlag.wait();
ASSERT_TRUE(stoppedFlag.isSet());
t.join();
}
TEST(OnceFlag, alreadySet)
{
OnceFlag flag;
flag.set();
ASSERT_TRUE(flag.isSet());
auto start = std::chrono::system_clock::now();
flag.wait();
auto stop = std::chrono::system_clock::now();
ASSERT_LT(stop - start, std::chrono::milliseconds{10});
start = std::chrono::system_clock::now();
ASSERT_TRUE(flag.waitFor(std::chrono::milliseconds{0}));
stop = std::chrono::system_clock::now();
ASSERT_LT(stop - start, std::chrono::milliseconds{10});
}