From 5f80c8b54d011580383810597aa68565ddfb8f3c Mon Sep 17 00:00:00 2001 From: Mitya Selivanov <0x7fffff@guattari.ru> Date: Thu, 18 Aug 2022 06:50:13 +0400 Subject: [test] thread, mutex, condition variable --- source/test/unittests/mutex.test.c | 74 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 source/test/unittests/mutex.test.c (limited to 'source/test/unittests/mutex.test.c') diff --git a/source/test/unittests/mutex.test.c b/source/test/unittests/mutex.test.c new file mode 100644 index 0000000..c0153e7 --- /dev/null +++ b/source/test/unittests/mutex.test.c @@ -0,0 +1,74 @@ +#include "../../kit/threads.h" + +#define KIT_TEST_FILE mutex +#include "../../kit_test/test.h" + +enum { THREAD_COUNT = 200 }; + +typedef struct { + mtx_t lock; + int value; +} test_data_t; + +static int test_run(void *data) { + test_data_t *x = (test_data_t *) data; + for (int i = 0; i < 1000; i++) { + mtx_lock(&x->lock); + + x->value += i; + thrd_yield(); + x->value -= i + 42; + thrd_yield(); + x->value += i + 20; + thrd_yield(); + x->value += 22 - i; + + mtx_unlock(&x->lock); + } + return 0; +} + +int test_lock_for_2_sec(void *data) { + mtx_t *m = (mtx_t *) data; + mtx_lock(m); + + struct timespec sec = { .tv_sec = 2, .tv_nsec = 0 }; + thrd_sleep(&sec, NULL); + + mtx_unlock(m); +} + +TEST("mutex lock") { + test_data_t data; + thrd_t pool[THREAD_COUNT]; + data.value = 42; + REQUIRE(mtx_init(&data.lock, mtx_plain) == thrd_success); + + for (ptrdiff_t i = 0; i < THREAD_COUNT; i++) + thrd_create(pool + i, test_run, &data); + for (ptrdiff_t i = 0; i < THREAD_COUNT; i++) + thrd_join(pool[i], NULL); + + mtx_destroy(&data.lock); + REQUIRE(data.value == 42); +} + +TEST("mutex try lock") { + mtx_t m; + REQUIRE(mtx_init(&m, mtx_plain) == thrd_success); + + thrd_t t; + REQUIRE(thrd_create(&t, test_lock_for_2_sec, &m) == thrd_success); + + struct timespec sec = { .tv_sec = 1, .tv_nsec = 0 }; + REQUIRE(thrd_sleep(&sec, NULL) == thrd_success); + + REQUIRE(mtx_trylock(&m) == thrd_busy); + + REQUIRE(thrd_join(t, NULL) == thrd_success); + + REQUIRE(mtx_trylock(&m) == thrd_success); + REQUIRE(mtx_unlock(&m) == thrd_success); + + mtx_destroy(&m); +} -- cgit v1.2.3