/* libcr_ipc/tests/test_waitgroup.c - Tests for * * Copyright (C) 2025 Luke T. Shumaker * SPDX-License-Identifier: AGPL-3.0-or-later */ #include #include #include #include "test.h" cr_waitgroup_t wg = {}; int cnt = 0; COROUTINE cr1_worker(void *) { cr_begin(); cnt++; cr_waitgroup_done(&wg); cr_end(); } COROUTINE cr1_waiter(void *) { cr_begin(); cr_waitgroup_wait(&wg); test_assert(cnt == 10); cr_end(); } COROUTINE cr1_init(void *) { cr_begin(); cr_waitgroup_add(&wg, 10); coroutine_add("wait", cr1_waiter, NULL); for (int i = 0; i < 10; i++) coroutine_add("worker", cr1_worker, NULL); cr_end(); } COROUTINE cr2_waiter(void *) { cr_begin(); cr_waitgroup_wait(&wg); cr_waitgroup_add(&wg, 1); cr_end(); } COROUTINE cr2_init(void *) { cr_begin(); cr_waitgroup_add(&wg, 1); coroutine_add("waiter1", cr2_waiter, NULL); coroutine_add("waiter2", cr2_waiter, NULL); cr_yield(); cr_waitgroup_done(&wg); cr_end(); } char out[10] = {0}; size_t len = 0; COROUTINE cr3_waiter(void *_ch) { char ch = *(char *)_ch; cr_begin(); cr_waitgroup_wait(&wg); out[len++] = ch; cr_end(); } COROUTINE cr3_init(void *) { cr_begin(); char ch; cr_waitgroup_add(&wg, 1); ch = 'a'; coroutine_add("wait-a", cr3_waiter, &ch); ch = 'b'; coroutine_add("wait-b", cr3_waiter, &ch); cr_yield(); ch = 'c'; coroutine_add("wait-c", cr3_waiter, &ch); cr_waitgroup_done(&wg); cr_end(); } int main() { printf("== test 1 =========================================\n"); coroutine_add("init", cr1_init, NULL); coroutine_main(); printf("== test 2 =========================================\n"); coroutine_add("init", cr2_init, NULL); coroutine_main(); printf("== test 3 =========================================\n"); coroutine_add("init", cr3_init, NULL); coroutine_main(); test_assert(len == 3); test_assert(strcmp(out, "abc") == 0); return 0; }