diff options
Diffstat (limited to 'libcr_ipc/tests/test_rpc.c')
-rw-r--r-- | libcr_ipc/tests/test_rpc.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/libcr_ipc/tests/test_rpc.c b/libcr_ipc/tests/test_rpc.c new file mode 100644 index 0000000..1461450 --- /dev/null +++ b/libcr_ipc/tests/test_rpc.c @@ -0,0 +1,59 @@ +/* libcr_ipc/tests/test_rpc.c - Tests for <libcr_ipc/rpc.h> + * + * Copyright (C) 2025 Luke T. Shumaker <lukeshu@lukeshu.com> + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +#include <libcr/coroutine.h> +#include <libcr_ipc/rpc.h> + +#include "test.h" + +CR_RPC_DECLARE(intrpc, int, int); + +/* Test that the RPC is fair, have worker1 start waiting first, and + * ensure that it gets the first request. */ + +COROUTINE caller_cr(void *_ch) { + intrpc_t *ch = _ch; + cr_begin(); + + int resp = cr_rpc_send_req(ch, 1); + test_assert(resp == 2); + + resp = cr_rpc_send_req(ch, 3); + test_assert(resp == 4); + + cr_exit(); +} + +COROUTINE worker1_cr(void *_ch) { + intrpc_t *ch = _ch; + cr_begin(); + + intrpc_req_t req = cr_rpc_recv_req(ch); + test_assert(req.req == 1); + cr_rpc_send_resp(req, 2); + + cr_exit(); +} + +COROUTINE worker2_cr(void *_ch) { + intrpc_t *ch = _ch; + cr_begin(); + + intrpc_req_t req = cr_rpc_recv_req(ch); + test_assert(req.req == 3); + cr_rpc_send_resp(req, 4); + + cr_exit(); +} + +int main() { + intrpc_t ch = {0}; + coroutine_add("worker1", worker1_cr, &ch); + coroutine_add("caller", caller_cr, &ch); + coroutine_add("worker2", worker2_cr, &ch); + coroutine_main(); + return 0; +} |