From 086316057b5dfd8f16288d35b0aa655e0b59947c Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Tue, 23 May 2023 12:31:13 -0400 Subject: [PATCH] LibThreading: Improve resiliancy of timed threading tests The threading tests currently wait for a very small amount of time for the expected test condition to be reached, e.g. 20ms. This changes the tests to *check* the condition every 20ms, but allow the test to run for up to 2s until the condition is reached. This should hopefully resolve the failures seen on CI. This also renames one of the tests to match what it actually does. The test itself was changed in commit 5b335e7, but the name was not updated to reflect that change. --- Tests/LibThreading/TestThread.cpp | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/Tests/LibThreading/TestThread.cpp b/Tests/LibThreading/TestThread.cpp index 1ffee96dc8e..c5a483c42b8 100644 --- a/Tests/LibThreading/TestThread.cpp +++ b/Tests/LibThreading/TestThread.cpp @@ -4,13 +4,30 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include #include #include #include +using namespace AK::TimeLiterals; + +static void sleep_until_thread_exits(Threading::Thread const& thread) +{ + static constexpr auto delay = 20_ms; + + for (auto i = 0; i < 100; ++i) { + if (thread.has_exited()) + return; + + usleep(delay.to_microseconds()); + } + + FAIL("Timed out waiting for thread to exit"); +} + TEST_CASE(threads_can_detach) { - int should_be_42 = 0; + Atomic should_be_42 = 0; auto thread = Threading::Thread::construct([&should_be_42]() { usleep(10 * 1000); @@ -19,12 +36,12 @@ TEST_CASE(threads_can_detach) }); thread->start(); thread->detach(); - usleep(20 * 1000); + sleep_until_thread_exits(*thread); EXPECT(should_be_42 == 42); } -TEST_CASE(joining_detached_thread_errors) +TEST_CASE(detached_threads_do_not_need_to_be_joined) { Atomic should_exit { false }; auto thread = Threading::Thread::construct([&]() { @@ -40,15 +57,16 @@ TEST_CASE(joining_detached_thread_errors) // FIXME: Dropping a running thread crashes because of the Function destructor. For now, force the detached thread to exit. should_exit.store(true); - usleep(20 * 1000); + sleep_until_thread_exits(*thread); } TEST_CASE(join_dead_thread) { auto thread = Threading::Thread::construct([&]() { return 0 /*nullptr*/; }); thread->start(); + // The thread should have exited by then. - usleep(40 * 1000); + sleep_until_thread_exits(*thread); auto join_result = TRY_OR_FAIL(thread->join()); EXPECT_EQ(join_result, static_cast(0));