summaryrefslogtreecommitdiff
path: root/libcr_ipc/tests
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2025-02-04 17:32:54 -0700
committerLuke T. Shumaker <lukeshu@lukeshu.com>2025-02-04 21:00:44 -0700
commit635539cd0da713729ec2852b3691dc9f73734e59 (patch)
tree2b8861092dd4315d187c8e38ea58f847bed59414 /libcr_ipc/tests
parent04978d7abe02e7f7e9092a44bb4d0ac3ec6ad366 (diff)
libcr_ipc: Fix rpc.h
Diffstat (limited to 'libcr_ipc/tests')
-rw-r--r--libcr_ipc/tests/test_rpc.c59
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..4aff5ca
--- /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 cr_caller(void *_ch) {
+ intrpc_t *ch = _ch;
+ cr_begin();
+
+ int resp = intrpc_send_req(ch, 1);
+ test_assert(resp == 2);
+
+ resp = intrpc_send_req(ch, 3);
+ test_assert(resp == 4);
+
+ cr_exit();
+}
+
+COROUTINE cr_worker1(void *_ch) {
+ intrpc_t *ch = _ch;
+ cr_begin();
+
+ intrpc_req_t req = intrpc_recv_req(ch);
+ test_assert(req.req == 1);
+ intrpc_send_resp(req, 2);
+
+ cr_exit();
+}
+
+COROUTINE cr_worker2(void *_ch) {
+ intrpc_t *ch = _ch;
+ cr_begin();
+
+ intrpc_req_t req = intrpc_recv_req(ch);
+ test_assert(req.req == 3);
+ intrpc_send_resp(req, 4);
+
+ cr_exit();
+}
+
+int main() {
+ intrpc_t ch = {0};
+ coroutine_add("worker1", cr_worker1, &ch);
+ coroutine_add("caller", cr_caller, &ch);
+ coroutine_add("worker2", cr_worker2, &ch);
+ coroutine_main();
+ return 0;
+}