summaryrefslogtreecommitdiff
path: root/source/tests/thread.test.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/tests/thread.test.c')
-rw-r--r--source/tests/thread.test.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/source/tests/thread.test.c b/source/tests/thread.test.c
new file mode 100644
index 0000000..50f7c04
--- /dev/null
+++ b/source/tests/thread.test.c
@@ -0,0 +1,91 @@
+#include "../kit/thread.h"
+
+#define KIT_TEST_FILE thread
+#include "../kit_test/test.h"
+
+static int test_nothing(void *_) {
+ return 0;
+}
+
+static int test_run(void *data) {
+ int *n = (int *) data;
+ return *n + 20;
+}
+
+static int test_exit(void *data) {
+ int *n = (int *) data;
+
+ *n = 1;
+ thrd_exit(3);
+ *n = 2;
+ return 4;
+}
+
+static int test_yield(void *data) {
+ thrd_yield();
+ return 0;
+}
+
+static int test_sleep(void *data) {
+ struct timespec t = { .tv_sec = 0, .tv_nsec = 10000000 };
+ thrd_sleep(&t, NULL);
+ return 0;
+}
+
+TEST("thread run") {
+ thrd_t t;
+ int data = 22;
+ int result;
+ REQUIRE(thrd_create(&t, test_run, &data) == thrd_success);
+ REQUIRE(thrd_join(t, &result) == thrd_success);
+ REQUIRE(result == 42);
+}
+
+TEST("thread stack size") {
+ thrd_t foo;
+ REQUIRE(thrd_create_with_stack(&foo, test_nothing, NULL, 30000) ==
+ thrd_success);
+ REQUIRE(thrd_join(foo, NULL) == thrd_success);
+}
+
+TEST("thread equal") {
+ thrd_t foo, bar;
+ REQUIRE(thrd_create(&foo, test_nothing, NULL) == thrd_success);
+ REQUIRE(thrd_create(&bar, test_nothing, NULL) == thrd_success);
+ REQUIRE(thrd_equal(foo, foo));
+ REQUIRE(!thrd_equal(foo, bar));
+ REQUIRE(!thrd_equal(foo, thrd_current()));
+ REQUIRE(thrd_join(foo, NULL) == thrd_success);
+ REQUIRE(thrd_join(bar, NULL) == thrd_success);
+}
+
+TEST("thread exit") {
+ thrd_t foo;
+ int data;
+ int result;
+ REQUIRE(thrd_create(&foo, test_exit, &data) == thrd_success);
+ REQUIRE(thrd_join(foo, &result) == thrd_success);
+ REQUIRE(data == 1);
+ REQUIRE(result == 3);
+}
+
+TEST("thread yield") {
+ thrd_t foo;
+ REQUIRE(thrd_create(&foo, test_yield, NULL) == thrd_success);
+ REQUIRE(thrd_join(foo, NULL) == thrd_success);
+}
+
+TEST("thread sleep") {
+ thrd_t foo;
+ REQUIRE(thrd_create(&foo, test_sleep, NULL) == thrd_success);
+ REQUIRE(thrd_join(foo, NULL) == thrd_success);
+}
+
+TEST("thread detach") {
+ thrd_t foo;
+ REQUIRE(thrd_create(&foo, test_nothing, NULL) == thrd_success);
+ REQUIRE(thrd_detach(foo) == thrd_success);
+
+ struct timespec t = { .tv_sec = 0, .tv_nsec = 10000000 };
+ thrd_sleep(&t, NULL);
+}