diff options
Diffstat (limited to 'libcr_ipc/tests')
-rw-r--r-- | libcr_ipc/tests/config.h | 2 | ||||
-rw-r--r-- | libcr_ipc/tests/test_chan.c | 94 | ||||
-rw-r--r-- | libcr_ipc/tests/test_chan_compile.c | 13 | ||||
-rw-r--r-- | libcr_ipc/tests/test_mutex_compile.c | 11 | ||||
-rw-r--r-- | libcr_ipc/tests/test_rpc.c | 2 | ||||
-rw-r--r-- | libcr_ipc/tests/test_rpc_compile.c | 13 | ||||
-rw-r--r-- | libcr_ipc/tests/test_rwmutex.c | 2 | ||||
-rw-r--r-- | libcr_ipc/tests/test_rwmutex_compile.c | 11 | ||||
-rw-r--r-- | libcr_ipc/tests/test_select.c | 89 | ||||
-rw-r--r-- | libcr_ipc/tests/test_sema_compile.c | 11 |
10 files changed, 150 insertions, 98 deletions
diff --git a/libcr_ipc/tests/config.h b/libcr_ipc/tests/config.h index a648589..a16df1d 100644 --- a/libcr_ipc/tests/config.h +++ b/libcr_ipc/tests/config.h @@ -1,4 +1,4 @@ -/* config.h - Compile-time configuration for the libcr_ipc tests +/* libcr_ipc/tests/config.h - Compile-time configuration for the libcr_ipc tests * * Copyright (C) 2024-2025 Luke T. Shumaker <lukeshu@lukeshu.com> * SPDX-License-Identifier: AGPL-3.0-or-later diff --git a/libcr_ipc/tests/test_chan.c b/libcr_ipc/tests/test_chan.c index 4788dd4..ee1751f 100644 --- a/libcr_ipc/tests/test_chan.c +++ b/libcr_ipc/tests/test_chan.c @@ -11,7 +11,9 @@ CR_CHAN_DECLARE(intchan, int); -COROUTINE producer_cr(void *_ch) { +/* test 1 *********************************************************************/ + +COROUTINE test1_producer_cr(void *_ch) { intchan_t *ch = _ch; cr_begin(); @@ -22,11 +24,10 @@ COROUTINE producer_cr(void *_ch) { cr_chan_send(ch, 2); - cr_end(); } -COROUTINE consumer_cr(void *_ch) { +COROUTINE test1_consumer_cr(void *_ch) { int x; intchan_t *ch = _ch; cr_begin(); @@ -40,10 +41,91 @@ COROUTINE consumer_cr(void *_ch) { cr_end(); } +/* test 2 *********************************************************************/ + +intchan_t test2_ch[10] = {}; +intchan_t test2_fch = {}; + +COROUTINE test2_consumer_cr(void *) { + cr_begin(); + + struct cr_select_arg args[11]; + + bool chdone[10] = {}; + int arg2ch[10]; + for (;;) { + int ret_ch; + int i_arg = 0; + for (int i_ch = 0; i_ch < 10; i_ch++) { + if (!chdone[i_ch]) { + args[i_arg] = CR_SELECT_RECV(&test2_ch[i_ch], &ret_ch); + arg2ch[i_arg] = i_ch; + i_arg++; + } + } + if (!i_arg) + break; + args[i_arg] = CR_SELECT_DEFAULT; /* check that default doesn't trigger */ + test_assert(i_arg <= 10); + int ret_arg = cr_select_v(i_arg+1, args); + test_assert(ret_arg < i_arg); + test_assert(arg2ch[ret_arg] == ret_ch); + chdone[ret_ch] = true; + } + int ret_ch, ret_arg; + args[0] = CR_SELECT_RECV(&test2_ch[0], &ret_ch); + args[1] = CR_SELECT_DEFAULT; + ret_arg = cr_select_v(2, args); + test_assert(ret_arg == 1); + + int send = 567; + args[0] = CR_SELECT_SEND(&test2_fch, &send); + args[1] = CR_SELECT_DEFAULT; + ret_arg = cr_select_v(2, args); + test_assert(ret_arg == 0); + + send = 890; + ret_arg = cr_select_l(CR_SELECT_SEND(&test2_fch, &send), + CR_SELECT_DEFAULT); + test_assert(ret_arg == 1); + + cr_end(); +} + +COROUTINE test2_producer_cr(void *_n) { + int n = *(int *)_n; + cr_begin(); + + cr_chan_send(&test2_ch[n], n); + + cr_end(); +} + +COROUTINE test2_final_cr(void *) { + cr_begin(); + + int ret = cr_chan_recv(&test2_fch); + printf("ret=%d\n", ret); + test_assert(ret == 567); + + cr_end(); +} + +/******************************************************************************/ + int main() { - intchan_t ch = {0}; - coroutine_add("producer", producer_cr, &ch); - coroutine_add("consumer", consumer_cr, &ch); + printf("== test 1 =========================================\n"); + intchan_t ch = {}; + coroutine_add("producer", test1_producer_cr, &ch); + coroutine_add("consumer", test1_consumer_cr, &ch); coroutine_main(); + + printf("== test 2 =========================================\n"); + for (int i = 0; i < 10; i++) + coroutine_add("producer", test2_producer_cr, &i); + coroutine_add("consumer", test2_consumer_cr, NULL); + coroutine_add("final", test2_final_cr, NULL); + coroutine_main(); + return 0; } diff --git a/libcr_ipc/tests/test_chan_compile.c b/libcr_ipc/tests/test_chan_compile.c new file mode 100644 index 0000000..00f3bdc --- /dev/null +++ b/libcr_ipc/tests/test_chan_compile.c @@ -0,0 +1,13 @@ +/* libcr_ipc/tests/test_chan_compile.c - Test that <libcr_ipc/chan.h> compiles + * + * Copyright (C) 2025 Luke T. Shumaker <lukeshu@lukeshu.com> + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +#include <libcr_ipc/chan.h> + +CR_CHAN_DECLARE(intchan, int); + +int main() { + return 0; +} diff --git a/libcr_ipc/tests/test_mutex_compile.c b/libcr_ipc/tests/test_mutex_compile.c new file mode 100644 index 0000000..c119ee3 --- /dev/null +++ b/libcr_ipc/tests/test_mutex_compile.c @@ -0,0 +1,11 @@ +/* libcr_ipc/tests/test_mutex_compile.c - Test that <libcr_ipc/mutex.h> compiles + * + * Copyright (C) 2025 Luke T. Shumaker <lukeshu@lukeshu.com> + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +#include <libcr_ipc/mutex.h> + +int main() { + return 0; +} diff --git a/libcr_ipc/tests/test_rpc.c b/libcr_ipc/tests/test_rpc.c index 1461450..ee88f47 100644 --- a/libcr_ipc/tests/test_rpc.c +++ b/libcr_ipc/tests/test_rpc.c @@ -50,7 +50,7 @@ COROUTINE worker2_cr(void *_ch) { } int main() { - intrpc_t ch = {0}; + intrpc_t ch = {}; coroutine_add("worker1", worker1_cr, &ch); coroutine_add("caller", caller_cr, &ch); coroutine_add("worker2", worker2_cr, &ch); diff --git a/libcr_ipc/tests/test_rpc_compile.c b/libcr_ipc/tests/test_rpc_compile.c new file mode 100644 index 0000000..ed0e0c1 --- /dev/null +++ b/libcr_ipc/tests/test_rpc_compile.c @@ -0,0 +1,13 @@ +/* libcr_ipc/tests/test_rpc_compile.c - Test that <libcr_ipc/rpc.h> compiles + * + * Copyright (C) 2025 Luke T. Shumaker <lukeshu@lukeshu.com> + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +#include <libcr_ipc/rpc.h> + +CR_RPC_DECLARE(intrpc, int, int); + +int main() { + return 0; +} diff --git a/libcr_ipc/tests/test_rwmutex.c b/libcr_ipc/tests/test_rwmutex.c index 77e8c7c..e79e779 100644 --- a/libcr_ipc/tests/test_rwmutex.c +++ b/libcr_ipc/tests/test_rwmutex.c @@ -12,7 +12,7 @@ #include "test.h" cr_rwmutex_t mu = {}; -char out[10] = {0}; +char out[10] = {}; size_t len = 0; COROUTINE cr1_reader(void *_mu) { diff --git a/libcr_ipc/tests/test_rwmutex_compile.c b/libcr_ipc/tests/test_rwmutex_compile.c new file mode 100644 index 0000000..358a535 --- /dev/null +++ b/libcr_ipc/tests/test_rwmutex_compile.c @@ -0,0 +1,11 @@ +/* libcr_ipc/tests/test_rwmutex_compile.c - Test that <libcr_ipc/rwmutex.h> compiles + * + * Copyright (C) 2025 Luke T. Shumaker <lukeshu@lukeshu.com> + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +#include <libcr_ipc/rwmutex.h> + +int main() { + return 0; +} diff --git a/libcr_ipc/tests/test_select.c b/libcr_ipc/tests/test_select.c deleted file mode 100644 index 9b5d117..0000000 --- a/libcr_ipc/tests/test_select.c +++ /dev/null @@ -1,89 +0,0 @@ -/* libcr_ipc/tests/test_select.c - Tests for <libcr_ipc/select.h> - * - * Copyright (C) 2024-2025 Luke T. Shumaker <lukeshu@lukeshu.com> - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -#include <libcr/coroutine.h> -#include <libcr_ipc/chan.h> - -#include "test.h" - -CR_CHAN_DECLARE(intchan, int); - -intchan_t ch[10] = {0}; -intchan_t fch = {0}; - -COROUTINE consumer_cr(void *) { - cr_begin(); - - struct cr_select_arg args[11]; - - bool chdone[10] = {0}; - int arg2ch[10]; - for (;;) { - int ret_ch; - int i_arg = 0; - for (int i_ch = 0; i_ch < 10; i_ch++) { - if (!chdone[i_ch]) { - args[i_arg] = CR_SELECT_RECV(&ch[i_ch], &ret_ch); - arg2ch[i_arg] = i_ch; - i_arg++; - } - } - if (!i_arg) - break; - args[i_arg] = CR_SELECT_DEFAULT; /* check that default doesn't trigger */ - test_assert(i_arg <= 10); - int ret_arg = cr_select_v(i_arg+1, args); - test_assert(ret_arg < i_arg); - test_assert(arg2ch[ret_arg] == ret_ch); - chdone[ret_ch] = true; - } - int ret_ch, ret_arg; - args[0] = CR_SELECT_RECV(&ch[0], &ret_ch); - args[1] = CR_SELECT_DEFAULT; - ret_arg = cr_select_v(2, args); - test_assert(ret_arg == 1); - - int send = 567; - args[0] = CR_SELECT_SEND(&fch, &send); - args[1] = CR_SELECT_DEFAULT; - ret_arg = cr_select_v(2, args); - test_assert(ret_arg == 0); - - send = 890; - ret_arg = cr_select_l(CR_SELECT_SEND(&fch, &send), - CR_SELECT_DEFAULT); - test_assert(ret_arg == 1); - - cr_end(); -} - -COROUTINE producer_cr(void *_n) { - int n = *(int *)_n; - cr_begin(); - - cr_chan_send(&ch[n], n); - - cr_end(); -} - -COROUTINE final_cr(void *) { - cr_begin(); - - int ret = cr_chan_recv(&fch); - printf("ret=%d\n", ret); - test_assert(ret == 567); - - cr_end(); -} - -int main() { - for (int i = 0; i < 10; i++) - coroutine_add("producer", producer_cr, &i); - coroutine_add("consumer", consumer_cr, NULL); - coroutine_add("final", final_cr, NULL); - coroutine_main(); - return 0; -} diff --git a/libcr_ipc/tests/test_sema_compile.c b/libcr_ipc/tests/test_sema_compile.c new file mode 100644 index 0000000..8a635b2 --- /dev/null +++ b/libcr_ipc/tests/test_sema_compile.c @@ -0,0 +1,11 @@ +/* libcr_ipc/tests/test_sema_compile.c - Test that <libcr_ipc/sema.h> compiles + * + * Copyright (C) 2025 Luke T. Shumaker <lukeshu@lukeshu.com> + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +#include <libcr_ipc/sema.h> + +int main() { + return 0; +} |