浏览代码

Tests: Update thread tests and make them pass

The existing tests have only mildly changed, and there is another test
for joining dead non-detached threads.
kleines Filmröllchen 2 年之前
父节点
当前提交
5b335e7
共有 1 个文件被更改,包括 25 次插入6 次删除
  1. 25 6
      Tests/LibThreading/TestThread.cpp

+ 25 - 6
Tests/LibThreading/TestThread.cpp

@@ -8,9 +8,6 @@
 #include <LibThreading/Thread.h>
 #include <LibThreading/Thread.h>
 #include <unistd.h>
 #include <unistd.h>
 
 
-// FIXME: Enable these tests once they work reliably.
-
-#if 0
 TEST_CASE(threads_can_detach)
 TEST_CASE(threads_can_detach)
 {
 {
     int should_be_42 = 0;
     int should_be_42 = 0;
@@ -29,10 +26,32 @@ TEST_CASE(threads_can_detach)
 
 
 TEST_CASE(joining_detached_thread_errors)
 TEST_CASE(joining_detached_thread_errors)
 {
 {
-    auto thread = Threading::Thread::construct([]() { return 0; });
+    Atomic<bool> should_exit { false };
+    auto thread = Threading::Thread::construct([&]() {
+        while (!should_exit.load())
+            usleep(10 * 1000);
+        return 0;
+    });
     thread->start();
     thread->start();
     thread->detach();
     thread->detach();
 
 
-    EXPECT(thread->join().is_error());
+    // Because of how the crash test forks and removes the thread, we can't use that to verify that join() crashes. Instead, we check the join crash condition ourselves.
+    EXPECT(!thread->needs_to_be_joined());
+
+    // 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);
+}
+
+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);
+
+    auto join_result = thread->join<int*>();
+
+    EXPECT(!join_result.is_error());
+    EXPECT_EQ(join_result.value(), static_cast<int*>(0));
 }
 }
-#endif