Skip to content

Commit 4f61e65

Browse files
TaiJuWunashif
authored andcommitted
test: add config to test msgq put front featrue
Add a config `CONFIG_TEST_MSGQ_PUT_FRONT` in mesgq_test to enable message queue put front feature. Also, add `test_msgq_pending` to test message queue behavior when the caller is going to put and put front. Signed-off-by: TaiJu Wu <[email protected]>
1 parent d361ec9 commit 4f61e65

File tree

3 files changed

+96
-15
lines changed

3 files changed

+96
-15
lines changed

tests/kernel/msgq/msgq_api/Kconfig

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Copyright (c) 2024
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
config TEST_MSGQ_PUT_FRONT
5+
bool "Test message queue put front feature"
6+
default n
7+
8+
# Include Zephyr's Kconfig.
9+
source "Kconfig"

tests/kernel/msgq/msgq_api/src/test_msgq_contexts.c

Lines changed: 79 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ struct k_thread tdata2;
2121
static ZTEST_BMEM char __aligned(4) tbuffer[MSG_SIZE * MSGQ_LEN];
2222
static ZTEST_DMEM char __aligned(4) tbuffer1[MSG_SIZE];
2323
static ZTEST_DMEM uint32_t data[MSGQ_LEN] = { MSG0, MSG1 };
24+
static ZTEST_DMEM uint32_t msg3 = 0x2345;
2425
struct k_sem end_sema;
2526

2627
static void put_msgq(struct k_msgq *pmsgq)
@@ -29,16 +30,16 @@ static void put_msgq(struct k_msgq *pmsgq)
2930
uint32_t read_data;
3031

3132
for (int i = 0; i < MSGQ_LEN; i++) {
32-
ret = k_msgq_put(pmsgq, (void *)&data[i], K_NO_WAIT);
33+
ret = IS_ENABLED(CONFIG_TEST_MSGQ_PUT_FRONT) ?
34+
k_msgq_put_front(pmsgq, (void *) &data[i]) :
35+
k_msgq_put(pmsgq, (void *)&data[i], K_NO_WAIT);
3336
zassert_equal(ret, 0);
3437

35-
/**TESTPOINT: Check if k_msgq_peek reads msgq
36-
* in FIFO manner.
37-
* Everytime msg is enqueued, msg read should
38-
* always be the first message
38+
/**TESTPOINT: Check if k_msgq_peek reads msgq.
3939
*/
4040
zassert_equal(k_msgq_peek(pmsgq, &read_data), 0);
41-
zassert_equal(read_data, data[0]);
41+
zassert_equal(read_data, IS_ENABLED(CONFIG_TEST_MSGQ_PUT_FRONT) ?
42+
data[i] : data[0]);
4243

4344
/**TESTPOINT: msgq free get*/
4445
zassert_equal(k_msgq_num_free_get(pmsgq),
@@ -58,7 +59,8 @@ static void get_msgq(struct k_msgq *pmsgq)
5859

5960
ret = k_msgq_get(pmsgq, &rx_data, K_FOREVER);
6061
zassert_equal(ret, 0);
61-
zassert_equal(rx_data, data[i]);
62+
zassert_equal(rx_data,
63+
IS_ENABLED(CONFIG_TEST_MSGQ_PUT_FRONT) ? data[MSGQ_LEN - i - 1] : data[i]);
6264

6365
/**TESTPOINT: Check if msg read is the msg deleted*/
6466
zassert_equal(read_data, rx_data);
@@ -138,7 +140,6 @@ static void msgq_thread_overflow(struct k_msgq *pmsgq)
138140
K_USER | K_INHERIT_PERMS, K_NO_WAIT);
139141

140142
ret = k_msgq_put(pmsgq, (void *)&data[1], K_FOREVER);
141-
142143
zassert_equal(ret, 0);
143144

144145
k_sem_take(&end_sema, K_FOREVER);
@@ -174,13 +175,19 @@ static void pend_thread_entry(void *p1, void *p2, void *p3)
174175
{
175176
int ret;
176177

177-
ret = k_msgq_put(p1, &data[1], TIMEOUT);
178-
zassert_equal(ret, 0);
178+
ret = IS_ENABLED(CONFIG_TEST_MSGQ_PUT_FRONT) ?
179+
k_msgq_put_front(p1, &data[1]) :
180+
k_msgq_put(p1, &data[1], TIMEOUT);
181+
zassert_equal(ret, IS_ENABLED(CONFIG_TEST_MSGQ_PUT_FRONT) ? -ENOMSG : 0);
179182
}
180183

181184
static void msgq_thread_data_passing(struct k_msgq *pmsgq)
182185
{
183-
while (k_msgq_put(pmsgq, &data[0], K_NO_WAIT) != 0) {
186+
while (
187+
IS_ENABLED(CONFIG_TEST_MSGQ_PUT_FRONT) ?
188+
k_msgq_put_front(pmsgq, &data[0]) != 0 :
189+
k_msgq_put(pmsgq, &data[0], K_NO_WAIT) != 0
190+
) {
184191
}
185192

186193
tids[0] = k_thread_create(&tdata2, tstack2, STACK_SIZE,
@@ -242,6 +249,21 @@ static void put_full_entry(void *p1, void *p2, void *p3)
242249
zassert_equal(ret, 0);
243250
}
244251

252+
static void prepend_full_entry(void *p1, void *p2, void *p3)
253+
{
254+
int ret;
255+
256+
/* make sure the queue is full */
257+
zassert_equal(k_msgq_num_free_get(p1), 0);
258+
zassert_equal(k_msgq_num_used_get(p1), 2);
259+
k_sem_give(&end_sema);
260+
261+
/* prepend a new message */
262+
ret = IS_ENABLED(CONFIG_TEST_MSGQ_PUT_FRONT) ? k_msgq_put_front(p1, &msg3) :
263+
k_msgq_put(p1, &msg3, K_FOREVER);
264+
zassert_equal(ret, IS_ENABLED(CONFIG_TEST_MSGQ_PUT_FRONT) ? -ENOMSG : 0);
265+
}
266+
245267
/**
246268
* @addtogroup kernel_message_queue_tests
247269
* @{
@@ -452,6 +474,52 @@ ZTEST(msgq_api_1cpu, test_msgq_full)
452474
k_thread_abort(tids[0]);
453475
}
454476

477+
/**
478+
* @brief Put a message to a full queue for behavior test
479+
*
480+
* @details
481+
* - Thread A put message to a full message queue and go to sleep
482+
* Thread B put a new message to the queue then pending on it.
483+
* - Thread A get all messages from message queue and check the behavior.
484+
*
485+
* @see k_msgq_put(), k_msgq_put_front()
486+
*/
487+
ZTEST(msgq_api_1cpu, test_msgq_thread_pending)
488+
{
489+
uint32_t rx_data;
490+
int pri = k_thread_priority_get(k_current_get()) - 1;
491+
int ret;
492+
493+
k_msgq_init(&msgq1, tbuffer, MSG_SIZE, 2);
494+
ret = k_sem_init(&end_sema, 0, 1);
495+
zassert_equal(ret, 0);
496+
497+
ret = IS_ENABLED(CONFIG_TEST_MSGQ_PUT_FRONT) ?
498+
k_msgq_put_front(&msgq1, &data[1]) :
499+
k_msgq_put(&msgq1, &data[0], K_NO_WAIT);
500+
zassert_equal(ret, 0);
501+
ret = IS_ENABLED(CONFIG_TEST_MSGQ_PUT_FRONT) ?
502+
k_msgq_put(&msgq1, &data[0], K_NO_WAIT) :
503+
k_msgq_put_front(&msgq1, &data[1]);
504+
zassert_equal(ret, 0);
505+
506+
k_tid_t tid = k_thread_create(&tdata2, tstack2, STACK_SIZE,
507+
prepend_full_entry, &msgq1, NULL,
508+
NULL, pri, 0, K_NO_WAIT);
509+
510+
/* that putting thread is being blocked now */
511+
k_sem_take(&end_sema, K_FOREVER);
512+
513+
ret = k_msgq_get(&msgq1, &rx_data, K_FOREVER);
514+
zassert_equal(ret, 0);
515+
zassert_equal(rx_data, data[1]);
516+
517+
ret = k_msgq_get(&msgq1, &rx_data, K_FOREVER);
518+
zassert_equal(ret, 0);
519+
zassert_equal(rx_data, data[0]);
520+
k_thread_abort(tid);
521+
}
522+
455523
/**
456524
* @}
457525
*/
Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
common:
2+
tags:
3+
- kernel
4+
- userspace
15
tests:
2-
kernel.message_queue:
3-
tags:
4-
- kernel
5-
- userspace
6+
kernel.message_queue: {}
7+
kernel.message_queue.put_front:
8+
extra_configs:
9+
- CONFIG_TEST_MSGQ_PUT_FRONT=y

0 commit comments

Comments
 (0)