@@ -21,6 +21,7 @@ struct k_thread tdata2;
2121static ZTEST_BMEM char __aligned (4 ) tbuffer [MSG_SIZE * MSGQ_LEN ];
2222static ZTEST_DMEM char __aligned (4 ) tbuffer1 [MSG_SIZE ];
2323static ZTEST_DMEM uint32_t data [MSGQ_LEN ] = { MSG0 , MSG1 };
24+ static ZTEST_DMEM uint32_t msg3 = 0x2345 ;
2425struct k_sem end_sema ;
2526
2627static 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
181184static 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 */
0 commit comments