Skip to content

Commit 7c24a01

Browse files
committed
[utestcase] 添加 message queue 测试用例
1 parent 553b57e commit 7c24a01

File tree

4 files changed

+201
-0
lines changed

4 files changed

+201
-0
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
CONFIG_UTEST_SEMAPHORE_TC=y
22
CONFIG_UTEST_EVENT_TC=y
3+
CONFIG_UTEST_MESSAGEQUEUE_TC=y
34
# dependencies
45
CONFIG_RT_USING_SEMAPHORE=y
56
CONFIG_RT_USING_EVENT=y
7+
CONFIG_RT_USING_MESSAGEQUEUE=y

examples/utest/testcases/kernel/Kconfig

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,8 @@ config UTEST_TIMER_TC
2323
bool "timer test"
2424
default n
2525

26+
config UTEST_MESSAGEQUEUE_TC
27+
bool "message queue test"
28+
default n
29+
2630
endmenu

examples/utest/testcases/kernel/SConscript

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ if GetDepend(['UTEST_EVENT_TC']):
2020
if GetDepend(['UTEST_TIMER_TC']):
2121
src += ['timer_tc.c']
2222

23+
if GetDepend(['UTEST_MESSAGEQUEUE_TC']):
24+
src += ['messagequeue_tc.c']
25+
2326
CPPPATH = [cwd]
2427

2528
group = DefineGroup('utestcases', src, depend = [], CPPPATH = CPPPATH)
Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
/*
2+
* Copyright (c) 2006-2021, RT-Thread Development Team
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*
6+
* Change Logs:
7+
* Date Author Notes
8+
* 2021-08-28 Sherman the first version
9+
*/
10+
11+
#include <rtthread.h>
12+
#include "utest.h"
13+
14+
#define MSG_SIZE 4
15+
#define MAX_MSGS 5
16+
17+
static struct rt_messagequeue static_mq;
18+
static rt_uint8_t mq_buf[(MSG_SIZE + 4) * MAX_MSGS];
19+
20+
static struct rt_thread mq_send_thread;
21+
static struct rt_thread mq_recv_thread;
22+
static rt_uint8_t mq_send_stack[512];
23+
static rt_uint8_t mq_recv_stack[512];
24+
25+
static struct rt_event finish_e;
26+
#define MQSEND_FINISH 0x01
27+
#define MQRECV_FINIHS 0x02
28+
29+
#ifdef RT_USING_HEAP
30+
static rt_mq_t dynamic_mq;
31+
#endif /* RT_USING_HEAP */
32+
33+
static void test_mq_init(void)
34+
{
35+
rt_err_t ret;
36+
ret = rt_mq_init(&static_mq,"testmq1", mq_buf, MSG_SIZE, sizeof(mq_buf), RT_IPC_FLAG_FIFO);
37+
uassert_true(ret == RT_EOK);
38+
}
39+
40+
static void test_mq_create(void)
41+
{
42+
#ifdef RT_USING_HEAP
43+
dynamic_mq = rt_mq_create("testmq2", MSG_SIZE, MAX_MSGS, RT_IPC_FLAG_FIFO);
44+
uassert_true(dynamic_mq != RT_NULL);
45+
#endif /* RT_USING_HEAP */
46+
}
47+
48+
static void mq_send_case(rt_mq_t testmq)
49+
{
50+
rt_uint32_t send_buf[MAX_MSGS+1] = {0};
51+
rt_err_t ret = RT_EOK;
52+
53+
for (int var = 0; var < MAX_MSGS; ++var)
54+
{
55+
send_buf[var] = var + 1;
56+
ret = rt_mq_send_wait(testmq, &send_buf[var], sizeof(send_buf[0]), RT_WAITING_FOREVER);
57+
uassert_true(ret == RT_EOK);
58+
}
59+
send_buf[MAX_MSGS] = MAX_MSGS + 1;
60+
ret = rt_mq_send(testmq, &send_buf[MAX_MSGS], sizeof(send_buf[0]));
61+
uassert_true(ret == -RT_EFULL);
62+
63+
ret = rt_mq_send_wait(testmq, &send_buf[MAX_MSGS], sizeof(send_buf[0]), RT_WAITING_FOREVER);
64+
uassert_true(ret == RT_EOK);
65+
66+
while (testmq->entry != 0)
67+
{
68+
rt_thread_delay(100);
69+
}
70+
71+
ret = rt_mq_send(testmq, &send_buf[1], sizeof(send_buf[0]));
72+
uassert_true(ret == RT_EOK);
73+
74+
ret = rt_mq_send(testmq, &send_buf[2], sizeof(send_buf[0]));
75+
uassert_true(ret == RT_EOK);
76+
77+
ret = rt_mq_urgent(testmq, &send_buf[0], sizeof(send_buf[0]));
78+
uassert_true(ret == RT_EOK);
79+
80+
while (testmq->entry != 0)
81+
{
82+
rt_thread_delay(100);
83+
}
84+
85+
ret = rt_mq_send(testmq, &send_buf[1], sizeof(send_buf[0]));
86+
uassert_true(ret == RT_EOK);
87+
ret = rt_mq_control(testmq, RT_IPC_CMD_RESET, RT_NULL);
88+
uassert_true(ret == RT_EOK);
89+
uassert_true(testmq->entry == 0);
90+
}
91+
92+
static void mq_send_entry(void *param)
93+
{
94+
mq_send_case(&static_mq);
95+
96+
#ifdef RT_USING_HEAP
97+
if(dynamic_mq != RT_NULL)
98+
{
99+
mq_send_case(dynamic_mq);
100+
}
101+
#endif /* RT_USING_HEAP */
102+
103+
rt_event_send(&finish_e, MQSEND_FINISH);
104+
}
105+
106+
static void mq_recv_case(rt_mq_t testmq)
107+
{
108+
rt_uint32_t recv_buf[MAX_MSGS+1] = {0};
109+
rt_err_t ret = RT_EOK;
110+
111+
for (int var = 0; var < MAX_MSGS + 1; ++var)
112+
{
113+
ret = rt_mq_recv(testmq, &recv_buf[var], sizeof(recv_buf[0]), RT_WAITING_FOREVER);
114+
uassert_true(ret == RT_EOK);
115+
uassert_true(recv_buf[var] == (var + 1));
116+
}
117+
118+
for (int var = 0; var < 3; ++var)
119+
{
120+
ret = rt_mq_recv(testmq, &recv_buf[var], sizeof(recv_buf[0]), RT_WAITING_FOREVER);
121+
uassert_true(ret == RT_EOK);
122+
uassert_true(recv_buf[var] == (var + 1));
123+
}
124+
}
125+
126+
static void mq_recv_entry(void *param)
127+
{
128+
mq_recv_case(&static_mq);
129+
130+
#ifdef RT_USING_HEAP
131+
if(dynamic_mq != RT_NULL)
132+
{
133+
mq_recv_case(dynamic_mq);
134+
}
135+
#endif /* RT_USING_HEAP */
136+
rt_event_send(&finish_e, MQRECV_FINIHS);
137+
}
138+
139+
static void test_mq_testcase(void)
140+
{
141+
rt_thread_startup(&mq_send_thread);
142+
rt_thread_startup(&mq_recv_thread);
143+
144+
rt_event_recv(&finish_e, MQSEND_FINISH | MQRECV_FINIHS, RT_EVENT_FLAG_AND, RT_WAITING_FOREVER, RT_NULL);
145+
}
146+
147+
static void test_mq_detach(void)
148+
{
149+
rt_err_t ret = rt_mq_detach(&static_mq);
150+
uassert_true(ret == RT_EOK);
151+
}
152+
153+
static void test_mq_delete(void)
154+
{
155+
#ifdef RT_USING_HEAP
156+
rt_err_t ret = rt_mq_delete(dynamic_mq);
157+
uassert_true(ret == RT_EOK);
158+
#endif /* RT_USING_HEAP */
159+
}
160+
161+
static rt_err_t utest_tc_init(void)
162+
{
163+
rt_err_t ret ;
164+
ret = rt_thread_init(&mq_send_thread, "mq_send", mq_send_entry, RT_NULL, mq_send_stack, sizeof(mq_send_stack), 22, 20);
165+
if(ret != RT_EOK)
166+
return -RT_ERROR;
167+
168+
ret = rt_thread_init(&mq_recv_thread, "mq_recv", mq_recv_entry, RT_NULL, mq_recv_stack, sizeof(mq_recv_stack), 23, 20);
169+
if(ret != RT_EOK)
170+
return -RT_ERROR;
171+
172+
ret = rt_event_init(&finish_e, "finish", RT_IPC_FLAG_FIFO);
173+
if(ret != RT_EOK)
174+
return -RT_ERROR;
175+
176+
return RT_EOK;
177+
}
178+
179+
static rt_err_t utest_tc_cleanup(void)
180+
{
181+
return RT_EOK;
182+
}
183+
184+
static void testcase(void)
185+
{
186+
UTEST_UNIT_RUN(test_mq_init);
187+
UTEST_UNIT_RUN(test_mq_create);
188+
UTEST_UNIT_RUN(test_mq_testcase);
189+
UTEST_UNIT_RUN(test_mq_detach);
190+
UTEST_UNIT_RUN(test_mq_delete);
191+
}
192+
UTEST_TC_EXPORT(testcase, "testcases.kernel.messagequeue_tc", utest_tc_init, utest_tc_cleanup, 1000);

0 commit comments

Comments
 (0)