summaryrefslogtreecommitdiff
path: root/examples/utest/testcases/kernel/messagequeue_tc.c
diff options
context:
space:
mode:
authorguo <[email protected]>2021-09-04 17:54:06 +0800
committerGitHub <[email protected]>2021-09-04 17:54:06 +0800
commit37ca52d6df2fff9d436c586f796f3a440439db04 (patch)
tree844da1b8f53e96c063fd786fa28c355fb4eb6a06 /examples/utest/testcases/kernel/messagequeue_tc.c
parent31061873aeac364ac8ddd685e1f3b91c4c2f5f41 (diff)
parent7c24a01979545c753f4ca58abdcba58e6a3095a7 (diff)
Merge pull request #4994 from ShermanShao/master
[add] 添加 message queue 测试用例
Diffstat (limited to 'examples/utest/testcases/kernel/messagequeue_tc.c')
-rw-r--r--examples/utest/testcases/kernel/messagequeue_tc.c192
1 files changed, 192 insertions, 0 deletions
diff --git a/examples/utest/testcases/kernel/messagequeue_tc.c b/examples/utest/testcases/kernel/messagequeue_tc.c
new file mode 100644
index 0000000000..335c591ab6
--- /dev/null
+++ b/examples/utest/testcases/kernel/messagequeue_tc.c
@@ -0,0 +1,192 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2021-08-28 Sherman the first version
+ */
+
+#include <rtthread.h>
+#include "utest.h"
+
+#define MSG_SIZE 4
+#define MAX_MSGS 5
+
+static struct rt_messagequeue static_mq;
+static rt_uint8_t mq_buf[(MSG_SIZE + 4) * MAX_MSGS];
+
+static struct rt_thread mq_send_thread;
+static struct rt_thread mq_recv_thread;
+static rt_uint8_t mq_send_stack[512];
+static rt_uint8_t mq_recv_stack[512];
+
+static struct rt_event finish_e;
+#define MQSEND_FINISH 0x01
+#define MQRECV_FINIHS 0x02
+
+#ifdef RT_USING_HEAP
+static rt_mq_t dynamic_mq;
+#endif /* RT_USING_HEAP */
+
+static void test_mq_init(void)
+{
+ rt_err_t ret;
+ ret = rt_mq_init(&static_mq,"testmq1", mq_buf, MSG_SIZE, sizeof(mq_buf), RT_IPC_FLAG_FIFO);
+ uassert_true(ret == RT_EOK);
+}
+
+static void test_mq_create(void)
+{
+#ifdef RT_USING_HEAP
+ dynamic_mq = rt_mq_create("testmq2", MSG_SIZE, MAX_MSGS, RT_IPC_FLAG_FIFO);
+ uassert_true(dynamic_mq != RT_NULL);
+#endif /* RT_USING_HEAP */
+}
+
+static void mq_send_case(rt_mq_t testmq)
+{
+ rt_uint32_t send_buf[MAX_MSGS+1] = {0};
+ rt_err_t ret = RT_EOK;
+
+ for (int var = 0; var < MAX_MSGS; ++var)
+ {
+ send_buf[var] = var + 1;
+ ret = rt_mq_send_wait(testmq, &send_buf[var], sizeof(send_buf[0]), RT_WAITING_FOREVER);
+ uassert_true(ret == RT_EOK);
+ }
+ send_buf[MAX_MSGS] = MAX_MSGS + 1;
+ ret = rt_mq_send(testmq, &send_buf[MAX_MSGS], sizeof(send_buf[0]));
+ uassert_true(ret == -RT_EFULL);
+
+ ret = rt_mq_send_wait(testmq, &send_buf[MAX_MSGS], sizeof(send_buf[0]), RT_WAITING_FOREVER);
+ uassert_true(ret == RT_EOK);
+
+ while (testmq->entry != 0)
+ {
+ rt_thread_delay(100);
+ }
+
+ ret = rt_mq_send(testmq, &send_buf[1], sizeof(send_buf[0]));
+ uassert_true(ret == RT_EOK);
+
+ ret = rt_mq_send(testmq, &send_buf[2], sizeof(send_buf[0]));
+ uassert_true(ret == RT_EOK);
+
+ ret = rt_mq_urgent(testmq, &send_buf[0], sizeof(send_buf[0]));
+ uassert_true(ret == RT_EOK);
+
+ while (testmq->entry != 0)
+ {
+ rt_thread_delay(100);
+ }
+
+ ret = rt_mq_send(testmq, &send_buf[1], sizeof(send_buf[0]));
+ uassert_true(ret == RT_EOK);
+ ret = rt_mq_control(testmq, RT_IPC_CMD_RESET, RT_NULL);
+ uassert_true(ret == RT_EOK);
+ uassert_true(testmq->entry == 0);
+}
+
+static void mq_send_entry(void *param)
+{
+ mq_send_case(&static_mq);
+
+#ifdef RT_USING_HEAP
+ if(dynamic_mq != RT_NULL)
+ {
+ mq_send_case(dynamic_mq);
+ }
+#endif /* RT_USING_HEAP */
+
+ rt_event_send(&finish_e, MQSEND_FINISH);
+}
+
+static void mq_recv_case(rt_mq_t testmq)
+{
+ rt_uint32_t recv_buf[MAX_MSGS+1] = {0};
+ rt_err_t ret = RT_EOK;
+
+ for (int var = 0; var < MAX_MSGS + 1; ++var)
+ {
+ ret = rt_mq_recv(testmq, &recv_buf[var], sizeof(recv_buf[0]), RT_WAITING_FOREVER);
+ uassert_true(ret == RT_EOK);
+ uassert_true(recv_buf[var] == (var + 1));
+ }
+
+ for (int var = 0; var < 3; ++var)
+ {
+ ret = rt_mq_recv(testmq, &recv_buf[var], sizeof(recv_buf[0]), RT_WAITING_FOREVER);
+ uassert_true(ret == RT_EOK);
+ uassert_true(recv_buf[var] == (var + 1));
+ }
+}
+
+static void mq_recv_entry(void *param)
+{
+ mq_recv_case(&static_mq);
+
+#ifdef RT_USING_HEAP
+ if(dynamic_mq != RT_NULL)
+ {
+ mq_recv_case(dynamic_mq);
+ }
+#endif /* RT_USING_HEAP */
+ rt_event_send(&finish_e, MQRECV_FINIHS);
+}
+
+static void test_mq_testcase(void)
+{
+ rt_thread_startup(&mq_send_thread);
+ rt_thread_startup(&mq_recv_thread);
+
+ rt_event_recv(&finish_e, MQSEND_FINISH | MQRECV_FINIHS, RT_EVENT_FLAG_AND, RT_WAITING_FOREVER, RT_NULL);
+}
+
+static void test_mq_detach(void)
+{
+ rt_err_t ret = rt_mq_detach(&static_mq);
+ uassert_true(ret == RT_EOK);
+}
+
+static void test_mq_delete(void)
+{
+#ifdef RT_USING_HEAP
+ rt_err_t ret = rt_mq_delete(dynamic_mq);
+ uassert_true(ret == RT_EOK);
+#endif /* RT_USING_HEAP */
+}
+
+static rt_err_t utest_tc_init(void)
+{
+ rt_err_t ret ;
+ ret = rt_thread_init(&mq_send_thread, "mq_send", mq_send_entry, RT_NULL, mq_send_stack, sizeof(mq_send_stack), 22, 20);
+ if(ret != RT_EOK)
+ return -RT_ERROR;
+
+ ret = rt_thread_init(&mq_recv_thread, "mq_recv", mq_recv_entry, RT_NULL, mq_recv_stack, sizeof(mq_recv_stack), 23, 20);
+ if(ret != RT_EOK)
+ return -RT_ERROR;
+
+ ret = rt_event_init(&finish_e, "finish", RT_IPC_FLAG_FIFO);
+ if(ret != RT_EOK)
+ return -RT_ERROR;
+
+ return RT_EOK;
+}
+
+static rt_err_t utest_tc_cleanup(void)
+{
+ return RT_EOK;
+}
+
+static void testcase(void)
+{
+ UTEST_UNIT_RUN(test_mq_init);
+ UTEST_UNIT_RUN(test_mq_create);
+ UTEST_UNIT_RUN(test_mq_testcase);
+ UTEST_UNIT_RUN(test_mq_detach);
+ UTEST_UNIT_RUN(test_mq_delete);
+}
+UTEST_TC_EXPORT(testcase, "testcases.kernel.messagequeue_tc", utest_tc_init, utest_tc_cleanup, 1000);