3 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
5 * Permission is hereby granted, free of charge, to any person obtaining a copy of
6 * this software and associated documentation files (the "Software"), to deal in
7 * the Software without restriction, including without limitation the rights to
8 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9 * the Software, and to permit persons to whom the Software is furnished to do so,
10 * subject to the following conditions:
12 * The above copyright notice and this permission notice shall be included in all
13 * copies or substantial portions of the Software.
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 * https://www.FreeRTOS.org
23 * https://github.com/FreeRTOS
26 /*! @file queue_send_nonblocking_utest.c */
28 /* C runtime includes. */
33 #include "../queue_utest_common.h"
37 #include "FreeRTOSConfig.h"
39 #include "mock_fake_port.h"
41 /* =============================== CONSTANTS =============================== */
43 /* ============================ GLOBAL VARIABLES =========================== */
45 /* ========================== CALLBACK FUNCTIONS =========================== */
47 /* ============================= Unity Fixtures ============================= */
64 int suiteTearDown( int numFailures )
66 return commonSuiteTearDown( numFailures );
69 /* ========================== Helper functions =========================== */
71 /* ============================= Test Cases ============================== */
74 * @brief Test xQueueSend with an invalid QueueHandle
75 * @coverage xQueueGenericSend
77 void test_macro_xQueueSend_invalid_handle( void )
79 EXPECT_ASSERT_BREAK( xQueueSend( NULL, NULL, 0 ) );
83 * @brief xQueueSend with an empty queue
84 * @coverage xQueueGenericSend
86 void test_macro_xQueueSend_success( void )
88 QueueHandle_t xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
90 uint32_t testval = getNextMonotonicTestValue();
92 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
94 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue, &testval, 0 ) );
96 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
98 uint32_t checkVal = INVALID_UINT32;
100 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceive( xQueue, &checkVal, 0 ) );
102 TEST_ASSERT_EQUAL( testval, checkVal );
104 vQueueDelete( xQueue );
108 * @brief xQueueSend with a full queue
109 * @details verify that the correct value is returned after a failed send operation.
110 * @coverage xQueueGenericSend
112 void test_macro_xQueueSend_fail_full( void )
114 QueueHandle_t xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
116 uint32_t testVal1 = getNextMonotonicTestValue();
118 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
120 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue, &testVal1, 0 ) );
122 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
124 uint32_t testVal2 = getNextMonotonicTestValue();
126 TEST_ASSERT_EQUAL( errQUEUE_FULL, xQueueSend( xQueue, &testVal2, 0 ) );
128 uint32_t checkVal = INVALID_UINT32;
130 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceive( xQueue, &checkVal, 0 ) );
131 TEST_ASSERT_EQUAL( testVal1, checkVal );
133 vQueueDelete( xQueue );
137 * @brief Test xQueueSend with uxQueueLength=1, uxItemSize=0
138 * @details xQueueSend should return pdTRUE because the queue is empty.
139 * This queue is eqivalent to a binary semaphore.
140 * @coverage xQueueGenericSend
142 void test_macro_xQueueSend_oneQueueLength_zeroItemSize( void )
144 QueueHandle_t xQueue = xQueueCreate( 1, 0 );
146 uint8_t testVal = getNextMonotonicTestValue();
148 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
150 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue, &testVal, 0 ) );
152 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
154 vQueueDelete( xQueue );
158 * @brief Test xQueueSend with uxQueueLength=1, uxItemSize=0 and null item.
159 * @details xQueueSend should return pdTRUE because the queue is empty.
160 * This queue is eqivalent to a binary semaphore.
161 * @coverage xQueueGenericSend
163 void test_macro_xQueueSend_oneQueueLength_zeroItemSize_null( void )
165 QueueHandle_t xQueue = xQueueCreate( 1, 0 );
167 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
169 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue, NULL, 0 ) );
171 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
173 vQueueDelete( xQueue );
177 * @brief Test xQueueSend with uxQueueLength=1, uxItemSize=1
178 * @details xQueueSend should return pdTRUE because the queue is empty.
179 * @coverage xQueueGenericSend
181 void test_macro_xQueueSend_oneQueueLength_oneItemSize( void )
183 QueueHandle_t xQueue = xQueueCreate( 1, 1 );
185 uint8_t testVal = getNextMonotonicTestValue();
187 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
189 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue, &testVal, 0 ) );
191 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
193 vQueueDelete( xQueue );
197 * @brief Test xQueueSend with uxQueueLength=1, uxItemSize=1 and null item.
198 * @details xQueueSend should configASSERT because of the null item pointer.
199 * @coverage xQueueGenericSend
201 void test_macro_xQueueSend_oneQueueLength_oneItemSize_null( void )
203 QueueHandle_t xQueue = xQueueCreate( 1, 1 );
205 EXPECT_ASSERT_BREAK( xQueueSend( xQueue, NULL, 0 ) );
207 vQueueDelete( xQueue );
211 * @brief Test xQueueSend with an equal priority task waiting.
212 * @coverage xQueueGenericSend
214 void test_macro_xQueueSend_task_waiting_equal_priority_success( void )
216 QueueHandle_t xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
218 /* Insert an item into the event list. */
219 td_task_setFakeTaskPriority( DEFAULT_PRIORITY );
220 td_task_addFakeTaskWaitingToReceiveFromQueue( xQueue );
222 uint32_t testVal = getNextMonotonicTestValue();
224 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
226 /* Add item to queue*/
227 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue, &testVal, 0 ) );
229 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
231 TEST_ASSERT_EQUAL( 0, td_task_getYieldCount() );
233 uint32_t checkVal = INVALID_UINT32;
235 ( void ) xQueueReceive( xQueue, &checkVal, 0 );
236 TEST_ASSERT_EQUAL( testVal, checkVal );
238 vQueueDelete( xQueue );
242 * @brief Test xQueueSend with a higher priority task waiting.
243 * @coverage xQueueGenericSend
245 void test_macro_xQueueSend_task_waiting_higher_priority_success( void )
247 QueueHandle_t xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
249 /* Insert an item into the event list */
250 td_task_setFakeTaskPriority( DEFAULT_PRIORITY + 1 );
251 td_task_addFakeTaskWaitingToReceiveFromQueue( xQueue );
253 uint32_t testVal = getNextMonotonicTestValue();
255 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
257 /* Add item to queue*/
258 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue, &testVal, 0 ) );
260 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
262 TEST_ASSERT_EQUAL( 1, td_task_getYieldCount() );
264 TEST_ASSERT_EQUAL( 1, td_task_getCount_vPortYieldWithinAPI() );
266 /* Check that vTaskMissedYield was not called */
267 TEST_ASSERT_EQUAL( 0, td_task_getCount_vTaskMissedYield() );
269 uint32_t checkVal = INVALID_UINT32;
271 ( void ) xQueueReceive( xQueue, &checkVal, 0 );
272 TEST_ASSERT_EQUAL( testVal, checkVal );
274 vQueueDelete( xQueue );
278 * @brief Test xQueueSend with a lower priority task waiting.
279 * @coverage xQueueGenericSend
281 void test_macro_xQueueSend_task_waiting_lower_priority_success( void )
283 QueueHandle_t xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
285 /* Insert an item into the event list. */
286 td_task_setFakeTaskPriority( DEFAULT_PRIORITY - 1 );
287 td_task_addFakeTaskWaitingToReceiveFromQueue( xQueue );
289 uint32_t testVal = getNextMonotonicTestValue();
291 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
293 /* Add item to queue*/
294 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue, &testVal, 0 ) );
296 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
298 TEST_ASSERT_EQUAL( 0, td_task_getYieldCount() );
300 uint32_t checkVal = INVALID_UINT32;
302 ( void ) xQueueReceive( xQueue, &checkVal, 0 );
303 TEST_ASSERT_EQUAL( testVal, checkVal );
305 vQueueDelete( xQueue );
309 * @brief Test xQueueSend with taskSCHEDULER_SUSPENDED and timeout=0
310 * @details This should not cause xQueueSend to configASSERT because
311 * xQueueSend is non-blocking when timeout=0.
312 * @coverage xQueueGenericSend
314 void test_macro_xQueueSend_nonblocking_suspended_noassert( void )
316 QueueHandle_t xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
318 uint32_t testVal = getNextMonotonicTestValue();
320 td_task_setSchedulerState( taskSCHEDULER_SUSPENDED );
322 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
324 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue, &testVal, 0 ) );
326 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
328 td_task_setSchedulerState( taskSCHEDULER_RUNNING );
330 vQueueDelete( xQueue );
334 * @brief Test xQueueSendFromISR with an invalid (null) QueueHandle
335 * @coverage xQueueGenericSendFromISR
337 void test_macro_xQueueSendFromISR_invalid_handle( void )
339 uint32_t testVal = INVALID_UINT32;
341 EXPECT_ASSERT_BREAK( xQueueSendFromISR( NULL, &testVal, NULL ) );
345 * @brief xQueueSendFromISR with an empty queue
346 * @coverage xQueueGenericSendFromISR
348 void test_macro_xQueueSendFromISR_success( void )
350 QueueHandle_t xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
352 uint32_t testval = getNextMonotonicTestValue();
354 vFakePortAssertIfInterruptPriorityInvalid_Expect();
356 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
358 TEST_ASSERT_EQUAL( pdTRUE, xQueueSendFromISR( xQueue, &testval, NULL ) );
360 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
362 uint32_t checkVal = INVALID_UINT32;
364 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceive( xQueue, &checkVal, 0 ) );
366 TEST_ASSERT_EQUAL( testval, checkVal );
367 vQueueDelete( xQueue );
371 * @brief xQueueSendFromISR with a full queue
372 * @details verify that the correct value is returned after a failed send operation.
373 * @coverage xQueueGenericSendFromISR
375 void test_macro_xQueueSendFromISR_fail( void )
377 QueueHandle_t xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
379 uint32_t testVal1 = getNextMonotonicTestValue();
381 vFakePortAssertIfInterruptPriorityInvalid_Expect();
383 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
385 TEST_ASSERT_EQUAL( pdTRUE, xQueueSendFromISR( xQueue, &testVal1, NULL ) );
387 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
389 uint32_t testVal2 = getNextMonotonicTestValue();
391 vFakePortAssertIfInterruptPriorityInvalid_Expect();
392 TEST_ASSERT_EQUAL( errQUEUE_FULL, xQueueSendFromISR( xQueue, &testVal2, NULL ) );
394 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
396 uint32_t checkVal = INVALID_UINT32;
398 ( void ) xQueueReceive( xQueue, &checkVal, 0 );
399 TEST_ASSERT_EQUAL( testVal1, checkVal );
400 vQueueDelete( xQueue );
404 * @brief Test xQueueSendFromISR with uxQueueLength=1, uxItemSize=0
405 * @details xQueueSendFromISR should return pdTRUE because the queue is empty.
406 * This queue is eqivalent to a binary semaphore.
407 * @coverage xQueueGenericSendFromISR
409 void test_macro_xQueueSendFromISR_oneQueueLength_zeroItemSize( void )
411 QueueHandle_t xQueue = xQueueCreate( 1, 0 );
413 uint8_t testVal = getNextMonotonicTestValue();
415 vFakePortAssertIfInterruptPriorityInvalid_Expect();
417 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
419 TEST_ASSERT_EQUAL( pdTRUE, xQueueSendFromISR( xQueue, &testVal, 0 ) );
421 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
423 vQueueDelete( xQueue );
427 * @brief Test xQueueSendFromISR with uxQueueLength=1, uxItemSize=0 and null item.
428 * @details xQueueSendFromISR should return pdTRUE because the queue is empty.
429 * This queue is eqivalent to a binary semaphore.
430 * @coverage xQueueGenericSendFromISR
432 void test_macro_xQueueSendFromISR_oneQueueLength_zeroItemSize_null( void )
434 QueueHandle_t xQueue = xQueueCreate( 1, 0 );
436 vFakePortAssertIfInterruptPriorityInvalid_Expect();
438 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
440 TEST_ASSERT_EQUAL( pdTRUE, xQueueSendFromISR( xQueue, NULL, 0 ) );
442 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
444 vQueueDelete( xQueue );
448 * @brief Test xQueueSendFromISR with uxQueueLength=1, uxItemSize=1
449 * @details xQueueSendFromISR should return pdTRUE because the queue is empty.
450 * @coverage xQueueGenericSendFromISR
452 void test_macro_xQueueSendFromISR_oneQueueLength_oneItemSize( void )
454 QueueHandle_t xQueue = xQueueCreate( 1, 1 );
456 uint8_t testVal = getNextMonotonicTestValue();
458 vFakePortAssertIfInterruptPriorityInvalid_Expect();
460 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
462 TEST_ASSERT_EQUAL( pdTRUE, xQueueSendFromISR( xQueue, &testVal, 0 ) );
464 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
466 vQueueDelete( xQueue );
470 * @brief Test xQueueSendFromISR with uxQueueLength=1, uxItemSize=1 and null item.
471 * @details xQueueSendFromISR should configASSERT because of the null item pointer.
472 * @coverage xQueueGenericSendFromISR
474 void test_macro_xQueueSendFromISR_oneQueueLength_oneItemSize_null( void )
476 QueueHandle_t xQueue = xQueueCreate( 1, 1 );
478 EXPECT_ASSERT_BREAK( xQueueSendFromISR( xQueue, NULL, 0 ) );
480 vQueueDelete( xQueue );
484 * @brief Test xQueueSendFromISR with a null pxHigherPriorityTaskWoken.
485 * @details Test xQueueSendFromISR with a NULL pxHigherPriorityTaskWoken
486 * in a case where xHigherPriorityTaskWoken would otherwise be written to
487 * and cause a null pointer dereference.
488 * @coverage xQueueGenericSendFromISR
490 void test_macro_xQueueSendFromISR_task_waiting_higher_priority_null_pxHigherPriorityTaskWoken( void )
492 QueueHandle_t xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
494 vFakePortAssertIfInterruptPriorityInvalid_Expect();
496 /* Insert an item into the event list. */
497 td_task_setFakeTaskPriority( DEFAULT_PRIORITY + 1 );
498 td_task_addFakeTaskWaitingToReceiveFromQueue( xQueue );
500 uint32_t testVal = getNextMonotonicTestValue();
502 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
504 /* Add item to queue*/
505 TEST_ASSERT_EQUAL( pdTRUE, xQueueSendFromISR( xQueue, &testVal, NULL ) );
507 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
509 TEST_ASSERT_EQUAL( pdTRUE, td_task_getYieldPending() );
511 uint32_t checkVal = INVALID_UINT32;
513 ( void ) xQueueReceive( xQueue, &checkVal, 0 );
514 TEST_ASSERT_EQUAL( testVal, checkVal );
516 vQueueDelete( xQueue );
520 * @brief Test xQueueSendFromISR with a higher priority task waiting
521 * @details Test xQueueSendFromISR with a higher priority task waiting and
522 * verifies that xHigherPriorityTaskWoken is set accordingly.
523 * @coverage xQueueGenericSendFromISR
525 void test_macro_xQueueSendFromISR_task_waiting_higher_priority_success( void )
527 QueueHandle_t xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
529 vFakePortAssertIfInterruptPriorityInvalid_Expect();
531 /* Insert an item into the event list. */
532 td_task_setFakeTaskPriority( DEFAULT_PRIORITY + 1 );
533 td_task_addFakeTaskWaitingToReceiveFromQueue( xQueue );
535 uint32_t testVal = getNextMonotonicTestValue();
537 BaseType_t xHigherPriorityTaskWoken = pdFALSE;
539 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
541 /* Add item to queue*/
542 TEST_ASSERT_EQUAL( pdTRUE, xQueueSendFromISR( xQueue, &testVal, &xHigherPriorityTaskWoken ) );
544 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
546 TEST_ASSERT_EQUAL( pdTRUE, xHigherPriorityTaskWoken );
548 TEST_ASSERT_EQUAL( pdTRUE, td_task_getYieldPending() );
550 uint32_t checkVal = INVALID_UINT32;
552 ( void ) xQueueReceive( xQueue, &checkVal, 0 );
553 TEST_ASSERT_EQUAL( testVal, checkVal );
555 vQueueDelete( xQueue );
559 * @brief Test xQueueSendFromISR with a lower priority task waiting
560 * @details Test xQueueSendFromISR with a lower priority task waiting and
561 * verify that xHigherPriorityTaskWoken is not modified.
562 * @coverage xQueueGenericSendFromISR
564 void test_macro_xQueueSendFromISR_task_waiting_lower_priority_success( void )
566 QueueHandle_t xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
568 vFakePortAssertIfInterruptPriorityInvalid_Expect();
570 /* Insert an item into the event list. */
571 td_task_setFakeTaskPriority( DEFAULT_PRIORITY - 1 );
572 td_task_addFakeTaskWaitingToReceiveFromQueue( xQueue );
574 uint32_t testVal = getNextMonotonicTestValue();
576 BaseType_t xHigherPriorityTaskWoken = pdFALSE;
578 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
580 /* Add item to queue*/
581 TEST_ASSERT_EQUAL( pdTRUE, xQueueSendFromISR( xQueue, &testVal, &xHigherPriorityTaskWoken ) );
582 TEST_ASSERT_EQUAL( pdFALSE, xHigherPriorityTaskWoken );
584 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
586 uint32_t checkVal = INVALID_UINT32;
588 ( void ) xQueueReceive( xQueue, &checkVal, 0 );
589 TEST_ASSERT_EQUAL( testVal, checkVal );
591 vQueueDelete( xQueue );
595 * @brief Test xQueueSendFromISR on a queue that is locked
596 * @coverage xQueueGenericSendFromISR
598 void test_macro_xQueueSendFromISR_locked( void )
600 QueueHandle_t xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
602 /* Set private lock counters */
603 vSetQueueRxLock( xQueue, queueLOCKED_UNMODIFIED );
604 vSetQueueTxLock( xQueue, queueLOCKED_UNMODIFIED );
606 vFakePortAssertIfInterruptPriorityInvalid_Expect();
608 uint32_t testval = getNextMonotonicTestValue();
610 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
612 TEST_ASSERT_EQUAL( pdTRUE, xQueueSendFromISR( xQueue, &testval, NULL ) );
614 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
616 /* Verify that the cRxLock counter has not changed */
617 TEST_ASSERT_EQUAL( queueLOCKED_UNMODIFIED, cGetQueueRxLock( xQueue ) );
619 /* Verify that the cTxLock counter has been incremented */
620 TEST_ASSERT_EQUAL( queueLOCKED_UNMODIFIED + 1, cGetQueueTxLock( xQueue ) );
622 uint32_t checkVal = INVALID_UINT32;
624 ( void ) xQueueReceive( xQueue, &checkVal, 0 );
626 TEST_ASSERT_EQUAL( testval, checkVal );
627 vQueueDelete( xQueue );
631 * @brief Test xQueueSendFromISR on a queue that is locked and cRxLock overflows.
632 * @coverage xQueueGenericSendFromISR
634 void test_macro_xQueueSendFromISR_locked_overflow( void )
636 QueueHandle_t xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
638 /* Set private lock counters */
639 vSetQueueRxLock( xQueue, INT8_MAX );
640 vSetQueueTxLock( xQueue, INT8_MAX );
642 vFakePortAssertIfInterruptPriorityInvalid_Expect();
644 /* Expect an assertion since the cTxLock value has overflowed */
645 fakeAssertExpectFail();
647 uint32_t testval = getNextMonotonicTestValue();
649 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
651 TEST_ASSERT_EQUAL( pdTRUE, xQueueSendFromISR( xQueue, &testval, NULL ) );
653 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
655 /* Verify that the cRxLock counter has not changed */
656 TEST_ASSERT_EQUAL( INT8_MAX, cGetQueueRxLock( xQueue ) );
658 /* Verify that the cTxLock counter has been incremented */
659 TEST_ASSERT_EQUAL( INT8_MIN, cGetQueueTxLock( xQueue ) );
661 TEST_ASSERT_EQUAL( true, fakeAssertGetFlagAndClear() );
663 uint32_t checkVal = INVALID_UINT32;
665 ( void ) xQueueReceive( xQueue, &checkVal, 0 );
667 TEST_ASSERT_EQUAL( testval, checkVal );
668 vQueueDelete( xQueue );
672 * @brief Test xQueueSendToFront with an invalid (NULL) handle
673 * @coverage xQueueGenericSend
675 void test_macro_xQueueSendToFront_invalid_handle( void )
677 uint32_t testVal = INVALID_UINT32;
679 EXPECT_ASSERT_BREAK( xQueueSendToFront( NULL, &testVal, 0 ) );
683 * @brief Test xQueueSendToFront with a queue of length 6
684 * @coverage xQueueGenericSend
686 void test_macro_xQueueSendToFront( void )
688 QueueHandle_t xQueue = xQueueCreate( 6, sizeof( uint32_t ) );
690 /* Add 5 sequential items to the queue */
691 for( int i = 1; i <= 5; i++ )
693 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue, &i, 0 ) );
696 TEST_ASSERT_EQUAL( 5, uxQueueMessagesWaiting( xQueue ) );
698 /* Add "random-ish" value to front of queue */
699 uint32_t testVal = getNextMonotonicTestValue();
701 TEST_ASSERT_EQUAL( pdTRUE, xQueueSendToFront( xQueue, &testVal, 0 ) );
703 TEST_ASSERT_EQUAL( 6, uxQueueMessagesWaiting( xQueue ) );
705 /* receive the value added to the front */
706 uint32_t testValCompare = 0;
708 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceive( xQueue, &testValCompare, 0 ) );
709 TEST_ASSERT_EQUAL( testVal, testValCompare );
711 /* verify the remaining items and remove from the queue */
712 for( uint32_t i = 1; i <= 5; i++ )
714 uint32_t testVal = INVALID_UINT32;
715 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceive( xQueue, &testVal, 0 ) );
716 TEST_ASSERT_EQUAL( i, testVal );
719 vQueueDelete( xQueue );
723 * @brief Test xQueueSendToFrontFromISR with a queue of length 6
724 * @coverage xQueueGenericSendFromISR
726 void test_macro_xQueueSendToFrontFromISR_invalid_handle( void )
728 uint32_t testVal = INVALID_UINT32;
730 EXPECT_ASSERT_BREAK( xQueueSendToFrontFromISR( NULL, &testVal, 0 ) );
734 * @brief Test xQueueSendToFrontFromISR with a queue of length 6
735 * @coverage xQueueGenericSendFromISR
737 void test_macro_xQueueSendToFrontFromISR( void )
739 QueueHandle_t xQueue = xQueueCreate( 6, sizeof( uint32_t ) );
741 /* Add 5 sequential items to the queue */
742 for( int i = 1; i <= 5; i++ )
744 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue, &i, 0 ) );
747 vFakePortAssertIfInterruptPriorityInvalid_Expect();
749 /* Add "random-ish" value to front of queue */
750 uint32_t testVal = getNextMonotonicTestValue();
752 TEST_ASSERT_EQUAL( 5, uxQueueMessagesWaiting( xQueue ) );
754 TEST_ASSERT_EQUAL( pdTRUE, xQueueSendToFrontFromISR( xQueue, &testVal, 0 ) );
756 TEST_ASSERT_EQUAL( 6, uxQueueMessagesWaiting( xQueue ) );
758 /* receive the value added to the front */
759 uint32_t testValCompare = 0;
761 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceive( xQueue, &testValCompare, 0 ) );
762 TEST_ASSERT_EQUAL( testVal, testValCompare );
764 /* verify the remaining items and remove from the queue */
765 for( uint32_t i = 1; i <= 5; i++ )
767 uint32_t testVal = INVALID_UINT32;
768 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceive( xQueue, &testVal, 0 ) );
769 TEST_ASSERT_EQUAL( i, testVal );
772 vQueueDelete( xQueue );
776 * @brief Test xQueueSendToBack with an invalid (NULL) handle
777 * @coverage xQueueGenericSend
779 void test_macro_xQueueSendToBack_invalid_handle( void )
781 uint32_t testVal = INVALID_UINT32;
783 EXPECT_ASSERT_BREAK( xQueueSendToBack( NULL, &testVal, 0 ) );
787 * @brief Test xQueueSendToBack with a queue of length 6
788 * @coverage xQueueGenericSend
790 void test_macro_xQueueSendToBack( void )
792 QueueHandle_t xQueue = xQueueCreate( 6, sizeof( uint32_t ) );
794 /* Add 5 sequential items to the queue */
795 for( int i = 1; i <= 5; i++ )
797 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue, &i, 0 ) );
800 TEST_ASSERT_EQUAL( 5, uxQueueMessagesWaiting( xQueue ) );
802 /* Add "random-ish" value to end of queue */
803 uint32_t testVal = getNextMonotonicTestValue();
805 TEST_ASSERT_EQUAL( pdTRUE, xQueueSendToBack( xQueue, &testVal, 0 ) );
807 TEST_ASSERT_EQUAL( 6, uxQueueMessagesWaiting( xQueue ) );
809 /* verify the first 5 items and remove from the queue */
810 for( uint32_t i = 1; i <= 5; i++ )
812 uint32_t testVal = INVALID_UINT32;
813 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceive( xQueue, &testVal, 0 ) );
814 TEST_ASSERT_EQUAL( i, testVal );
817 /* receive the value added to the front */
818 uint32_t testValCompare = 0;
820 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceive( xQueue, &testValCompare, 0 ) );
821 TEST_ASSERT_EQUAL( getLastMonotonicTestValue(), testValCompare );
823 vQueueDelete( xQueue );
827 * @brief Test xQueueSendToBackFromISR with an invalid (NULL) handle.
828 * @coverage xQueueGenericSendFromISR
830 void test_macro_xQueueSendToBackFromISR_invalid_handle( void )
832 uint32_t testVal = INVALID_UINT32;
834 EXPECT_ASSERT_BREAK( xQueueSendToBackFromISR( NULL, &testVal, 0 ) );
838 * @brief Test xQueueSendToBackFromISR with a queue of length 6
839 * @coverage xQueueGenericSendFromISR
841 void test_macro_xQueueSendToBackFromISR( void )
843 QueueHandle_t xQueue = xQueueCreate( 6, sizeof( uint32_t ) );
845 /* Add 5 sequential items to the queue */
846 for( int i = 1; i <= 5; i++ )
848 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue, &i, 0 ) );
851 /* Add "random-ish" value to end of queue */
852 uint32_t testVal = getNextMonotonicTestValue();
854 TEST_ASSERT_EQUAL( 5, uxQueueMessagesWaiting( xQueue ) );
856 vFakePortAssertIfInterruptPriorityInvalid_Expect();
857 TEST_ASSERT_EQUAL( pdTRUE, xQueueSendToBackFromISR( xQueue, &testVal, 0 ) );
859 TEST_ASSERT_EQUAL( 6, uxQueueMessagesWaiting( xQueue ) );
861 /* verify the first 5 items and remove from the queue */
862 for( uint32_t i = 1; i <= 5; i++ )
864 uint32_t testVal = INVALID_UINT32;
865 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceive( xQueue, &testVal, 0 ) );
866 TEST_ASSERT_EQUAL( i, testVal );
869 /* receive the value added to the front */
870 uint32_t testValCompare = 0;
872 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceive( xQueue, &testValCompare, 0 ) );
873 TEST_ASSERT_EQUAL( testVal, testValCompare );
875 vQueueDelete( xQueue );
879 * @brief Test xQueueOverwrite with an invalid (NULL) queue handle.
880 * @coverage xQueueGenericSend
882 void test_macro_xQueueOverwrite_invalid_handle( void )
884 uint32_t testVal = INVALID_UINT32;
886 EXPECT_ASSERT_BREAK( xQueueOverwrite( NULL, &testVal ) );
890 * @brief Test xQueueOverwrite on an empty queue of length 1
891 * @details Test xQueueOverwrite with an empty queue, equivalent to xQueueSend.
892 * @coverage xQueueGenericSend
894 void test_macro_xQueueOverwrite_empty_queue_1_add_success( void )
896 QueueHandle_t xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
898 /* Send a new value to the queue using xQueueOverwrite */
899 uint32_t testVal1 = getNextMonotonicTestValue();
901 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
903 TEST_ASSERT_EQUAL( pdTRUE, xQueueOverwrite( xQueue, &testVal1 ) );
905 /* Check that the queue is now full */
906 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
908 /* Receive from the queue and verify the received value */
909 uint32_t checkVal1 = INVALID_UINT32;
911 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceive( xQueue, &checkVal1, 0 ) );
912 TEST_ASSERT_EQUAL( testVal1, checkVal1 );
914 vQueueDelete( xQueue );
918 * @brief Test xQueueOverwrite on a full queue of size (1,4)
919 * @details Test xQueueOverwrite with a full queue containing one item.
920 * @coverage xQueueGenericSend
922 void test_macro_xQueueOverwrite_overwrite_success( void )
924 QueueHandle_t xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
926 uint32_t testVal1 = getNextMonotonicTestValue();
928 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
930 /* send a random value to the queue */
931 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue, &testVal1, 0 ) );
933 /* Check that the queue now has a single message waiting */
934 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
936 /* Peek from the queue and verify that the returned value matches testVal1 */
937 uint32_t checkVal1 = 0;
939 TEST_ASSERT_EQUAL( pdTRUE, xQueuePeek( xQueue, &checkVal1, 0 ) );
940 TEST_ASSERT_EQUAL( testVal1, checkVal1 );
941 TEST_ASSERT_NOT_EQUAL( 0, checkVal1 );
943 /* Overwrite testVal1 with testVal2 in the queue */
944 uint32_t testVal2 = getNextMonotonicTestValue();
946 TEST_ASSERT_EQUAL( pdTRUE, xQueueOverwrite( xQueue, &testVal2 ) );
948 /* Receive from the queue */
949 uint32_t checkVal2 = 0;
951 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceive( xQueue, &checkVal2, 0 ) );
953 /* Validate that checkVal2 was received from the queue */
954 TEST_ASSERT_EQUAL( testVal2, checkVal2 );
955 TEST_ASSERT_NOT_EQUAL( 0, checkVal2 );
956 TEST_ASSERT_NOT_EQUAL( testVal1, checkVal2 );
958 vQueueDelete( xQueue );
962 * @brief Test xQueueOverwrite on a full queue of size (2,4)
963 * @details Test xQueueOverwrite with a full queue containing one item.
964 * @note Operation of xQueueOverwrite on queues larger than 1 in length is undefined.
965 * The behavior in this test is undefined.
966 * @coverage xQueueGenericSend
968 void test_macro_xQueueOverwrite_full_assert_undefined( void )
970 QueueHandle_t xQueue = xQueueCreate( 2, sizeof( uint32_t ) );
972 uint32_t testVal1 = getNextMonotonicTestValue();
974 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
976 /* Expect that xQueueOverwrite will assert due to uxQueueLength > 1 */
977 fakeAssertExpectFail();
978 TEST_ASSERT_EQUAL( pdTRUE, xQueueOverwrite( xQueue, &testVal1 ) );
980 /* Check that xQueueOverwrite called configASSERT */
981 TEST_ASSERT_EQUAL( true, fakeAssertGetFlagAndClear() );
983 /* Check that the queue now has a single message waiting */
984 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
986 /* Overwrite testVal1 with testVal2 in the queue */
987 uint32_t testVal2 = getNextMonotonicTestValue();
989 /* Expect that xQueueOverwrite will assert due to uxQueueLength > 1 */
990 fakeAssertExpectFail();
991 TEST_ASSERT_EQUAL( pdTRUE, xQueueOverwrite( xQueue, &testVal2 ) );
992 /* Check that xQueueOverwrite called configASSERT */
993 TEST_ASSERT_EQUAL( true, fakeAssertGetFlagAndClear() );
995 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
997 /* Receive from the queue */
998 uint32_t checkVal2 = 0;
1000 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceive( xQueue, &checkVal2, 0 ) );
1002 /* Validate that checkVal2 was received from the queue */
1003 TEST_ASSERT_EQUAL( testVal2, checkVal2 );
1004 TEST_ASSERT_NOT_EQUAL( 0, checkVal2 );
1006 vQueueDelete( xQueue );
1010 * @brief Test xQueueOverwriteFromISR with an invalid (NULL) queue handle.
1011 * @coverage xQueueGenericSendFromISR
1013 void test_macro_xQueueOverwriteFromISR_invalid_handle( void )
1015 uint32_t testVal = INVALID_UINT32;
1017 EXPECT_ASSERT_BREAK( xQueueOverwriteFromISR( NULL, &testVal, NULL ) );
1021 * @brief Test xQueueOverwriteFromISR on an empty queue of length 1
1022 * @details Test xQueueOverwriteFromISR with an empty queue, equivalent to xQueueSend.
1023 * @coverage xQueueGenericSendFromISR
1025 void test_macro_xQueueOverwriteFromISR_empty_queue_1_add_success( void )
1027 QueueHandle_t xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
1029 vFakePortAssertIfInterruptPriorityInvalid_Expect();
1031 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
1033 /* Send a new value to the queue using xQueueOverwriteFromISR */
1034 uint32_t testVal1 = getNextMonotonicTestValue();
1036 TEST_ASSERT_EQUAL( pdTRUE, xQueueOverwriteFromISR( xQueue, &testVal1, NULL ) );
1038 /* Check that the queue is now full */
1039 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
1041 /* Receive from the queue and verify the received value */
1042 uint32_t checkVal1 = INVALID_UINT32;
1044 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceive( xQueue, &checkVal1, 0 ) );
1045 TEST_ASSERT_EQUAL( testVal1, checkVal1 );
1047 vQueueDelete( xQueue );
1051 * @brief Test xQueueOverwriteFromISR on a full queue of size (1,4)
1052 * @details Test xQueueOverwriteFromISR with a full queue containing one item.
1053 * @coverage xQueueGenericSendFromISR
1055 void test_macro_xQueueOverwriteFromISR_overwrite_success( void )
1057 QueueHandle_t xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
1059 uint32_t testVal1 = getNextMonotonicTestValue();
1061 /* send a random value to the queue */
1062 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue, &testVal1, 0 ) );
1064 /* Check that the queue now has a single message waiting */
1065 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
1067 /* Peek from the queue and verify that the returned value matches testVal1 */
1068 uint32_t checkVal1 = 0;
1070 TEST_ASSERT_EQUAL( pdTRUE, xQueuePeek( xQueue, &checkVal1, 0 ) );
1071 TEST_ASSERT_EQUAL( testVal1, checkVal1 );
1072 TEST_ASSERT_NOT_EQUAL( 0, checkVal1 );
1074 vFakePortAssertIfInterruptPriorityInvalid_Expect();
1076 /* Overwrite testVal1 with testVal2 in the queue */
1077 uint32_t testVal2 = getNextMonotonicTestValue();
1079 TEST_ASSERT_EQUAL( pdTRUE, xQueueOverwriteFromISR( xQueue, &testVal2, NULL ) );
1081 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
1083 /* Receive from the queue */
1084 uint32_t checkVal2 = 0;
1086 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceive( xQueue, &checkVal2, 0 ) );
1088 /* Validate that checkVal2 was received from the queue */
1089 TEST_ASSERT_EQUAL( testVal2, checkVal2 );
1090 TEST_ASSERT_NOT_EQUAL( 0, checkVal2 );
1091 TEST_ASSERT_NOT_EQUAL( testVal1, checkVal2 );
1093 /* Verify that the queue is empty */
1094 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
1096 vQueueDelete( xQueue );
1100 * @brief Test xQueueOverwriteFromISR on a full queue of size (2,4)
1101 * @details Test xQueueOverwriteFromISR with a full queue containing one item.
1102 * @note Operation of xQueueOverwriteFromISR on queues larger than 1 in length is undefined.
1103 * The behavior in this test is undefined.
1104 * @coverage xQueueGenericSendFromISR
1106 void test_macro_xQueueOverwriteFromISR_full_assert_undefined( void )
1108 QueueHandle_t xQueue = xQueueCreate( 2, sizeof( uint32_t ) );
1110 vFakePortAssertIfInterruptPriorityInvalid_Expect();
1112 uint32_t testVal1 = getNextMonotonicTestValue();
1114 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
1116 /* Expect that xQueueOverwriteFromISR will assert due to uxQueueLength > 1 */
1117 fakeAssertExpectFail();
1118 TEST_ASSERT_EQUAL( pdTRUE, xQueueOverwriteFromISR( xQueue, &testVal1, NULL ) );
1120 /* Check that xQueueOverwriteFromISR called configASSERT */
1121 TEST_ASSERT_EQUAL( true, fakeAssertGetFlagAndClear() );
1123 /* Check that the queue now has a single message waiting */
1124 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
1126 vFakePortAssertIfInterruptPriorityInvalid_Expect();
1128 /* Overwrite testVal1 with testVal2 in the queue */
1129 uint32_t testVal2 = getNextMonotonicTestValue();
1131 /* Expect that xQueueOverwriteFromISR will assert due to uxQueueLength > 1 */
1132 fakeAssertExpectFail();
1133 TEST_ASSERT_EQUAL( pdTRUE, xQueueOverwriteFromISR( xQueue, &testVal2, NULL ) );
1134 /* Check that xQueueOverwriteFromISR called configASSERT */
1135 TEST_ASSERT_EQUAL( true, fakeAssertGetFlagAndClear() );
1137 TEST_ASSERT_EQUAL( 1, uxQueueMessagesWaiting( xQueue ) );
1139 /* Receive from the queue */
1140 uint32_t checkVal2 = 0;
1142 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceive( xQueue, &checkVal2, 0 ) );
1144 /* Validate that checkVal2 was received from the queue */
1145 TEST_ASSERT_EQUAL( testVal2, checkVal2 );
1146 TEST_ASSERT_NOT_EQUAL( 0, checkVal2 );
1148 vQueueDelete( xQueue );