瀏覽代碼

LibPthread: Add first test cases for RWlock

Rodrigo Tobar 3 年之前
父節點
當前提交
a8fae3d2c8
共有 2 個文件被更改,包括 91 次插入0 次删除
  1. 1 0
      Tests/LibPthread/CMakeLists.txt
  2. 90 0
      Tests/LibPthread/TestLibPthreadRWLocks.cpp

+ 1 - 0
Tests/LibPthread/CMakeLists.txt

@@ -1,5 +1,6 @@
 set(TEST_SOURCES
     TestLibPthreadSpinLocks.cpp
+    TestLibPthreadRWLocks.cpp
 )
 
 foreach(source IN LISTS TEST_SOURCES)

+ 90 - 0
Tests/LibPthread/TestLibPthreadRWLocks.cpp

@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2021, Rodrigo Tobar <rtobarc@gmail.com>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <LibPthread/pthread.h>
+#include <LibTest/TestCase.h>
+
+TEST_CASE(rwlock_init)
+{
+    pthread_rwlock_t lock;
+    auto result = pthread_rwlock_init(&lock, nullptr);
+    EXPECT_EQ(0, result);
+}
+
+TEST_CASE(rwlock_rdlock)
+{
+    pthread_rwlock_t lock;
+    auto result = pthread_rwlock_init(&lock, nullptr);
+    EXPECT_EQ(0, result);
+
+    result = pthread_rwlock_rdlock(&lock);
+    EXPECT_EQ(0, result);
+    result = pthread_rwlock_unlock(&lock);
+    EXPECT_EQ(0, result);
+
+    result = pthread_rwlock_rdlock(&lock);
+    EXPECT_EQ(0, result);
+    result = pthread_rwlock_rdlock(&lock);
+    EXPECT_EQ(0, result);
+    result = pthread_rwlock_unlock(&lock);
+    EXPECT_EQ(0, result);
+    result = pthread_rwlock_unlock(&lock);
+    EXPECT_EQ(0, result);
+}
+
+TEST_CASE(rwlock_wrlock)
+{
+    pthread_rwlock_t lock;
+    auto result = pthread_rwlock_init(&lock, nullptr);
+    EXPECT_EQ(0, result);
+
+    result = pthread_rwlock_wrlock(&lock);
+    EXPECT_EQ(0, result);
+    result = pthread_rwlock_unlock(&lock);
+    EXPECT_EQ(0, result);
+}
+
+TEST_CASE(rwlock_rwr_sequence)
+{
+    pthread_rwlock_t lock;
+    auto result = pthread_rwlock_init(&lock, nullptr);
+    EXPECT_EQ(0, result);
+
+    result = pthread_rwlock_rdlock(&lock);
+    EXPECT_EQ(0, result);
+    result = pthread_rwlock_unlock(&lock);
+    EXPECT_EQ(0, result);
+
+    result = pthread_rwlock_wrlock(&lock);
+    EXPECT_EQ(0, result);
+    result = pthread_rwlock_unlock(&lock);
+    EXPECT_EQ(0, result);
+
+    result = pthread_rwlock_rdlock(&lock);
+    EXPECT_EQ(0, result);
+    result = pthread_rwlock_unlock(&lock);
+    EXPECT_EQ(0, result);
+}
+
+TEST_CASE(rwlock_wrlock_init_in_once)
+{
+    static pthread_rwlock_t lock;
+    static pthread_once_t once1 = PTHREAD_ONCE_INIT;
+    static pthread_once_t once2 = PTHREAD_ONCE_INIT;
+    static pthread_once_t once3 = PTHREAD_ONCE_INIT;
+    pthread_once(&once1, []() {
+        pthread_once(&once2, []() {
+            pthread_once(&once3, []() {
+                auto result = pthread_rwlock_init(&lock, nullptr);
+                EXPECT_EQ(0, result);
+            });
+        });
+    });
+    auto result = pthread_rwlock_wrlock(&lock);
+    EXPECT_EQ(0, result);
+    result = pthread_rwlock_unlock(&lock);
+    EXPECT_EQ(0, result);
+}