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_status_utest.c */
28 /* C runtime includes. */
33 #include "../queue_utest_common.h"
37 #include "FreeRTOSConfig.h"
40 /* ============================ GLOBAL VARIABLES =========================== */
42 /* ========================== CALLBACK FUNCTIONS =========================== */
44 /* ============================= Unity Fixtures ============================= */
61 int suiteTearDown( int numFailures )
63 return commonSuiteTearDown( numFailures );
66 /* ========================== Helper functions =========================== */
68 /* ============================= Test Cases ============================== */
71 * @brief Test uxQueueMessagesWaiting with an invalid QueueHandle
72 * @coverage uxQueueMessagesWaiting
74 void test_uxQueueMessagesWaiting_invalid_handle( void )
76 EXPECT_ASSERT_BREAK( uxQueueMessagesWaiting( NULL ) );
80 * @brief Test uxQueueMessagesWaiting with a queue of size 5 x 4 bytes
81 * @details Test uxQueueMessagesWaiting with a typical queue when empty and occupied.
82 * @coverage uxQueueMessagesWaiting
84 void test_uxQueueMessagesWaiting_empty_occupied( void )
86 QueueHandle_t xQueue = xQueueCreate( 5, sizeof( uint32_t ) );
88 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueue ) );
90 for( uint32_t i = 0; i < 5; i++ )
92 xQueueSend( xQueue, &i, 0 );
93 TEST_ASSERT_EQUAL( i + 1, uxQueueMessagesWaiting( xQueue ) );
96 vQueueDelete( xQueue );
100 * @brief Test uxQueueMessagesWaitingFromISR with an invalid Queue Handle
101 * @coverage uxQueueMessagesWaitingFromISR
103 void test_uxQueueMessagesWaitingFromISR_invalid_handle( void )
105 EXPECT_ASSERT_BREAK( uxQueueMessagesWaitingFromISR( NULL ) );
109 * @brief Test uxQueueMessagesWaitingFromISR with a queue of size 5 x 4 bytes
110 * @details Test uxQueueMessagesWaitingFromISR with a typical queue when empty and occupied.
111 * @coverage uxQueueMessagesWaitingFromISR
113 void test_uxQueueMessagesWaitingFromISR_empty_occupied( void )
115 QueueHandle_t xQueue = xQueueCreate( 5, sizeof( uint32_t ) );
117 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaitingFromISR( xQueue ) );
119 for( uint32_t i = 0; i < 5; i++ )
121 xQueueSend( xQueue, &i, 0 );
122 TEST_ASSERT_EQUAL( i + 1, uxQueueMessagesWaitingFromISR( xQueue ) );
125 vQueueDelete( xQueue );
129 * @brief Test uxQueueSpacesAvailable with an invalid QueueHandle
130 * @coverage uxQueueSpacesAvailable
132 void test_uxQueueSpacesAvailable_invalid_handle( void )
134 EXPECT_ASSERT_BREAK( uxQueueSpacesAvailable( NULL ) );
138 * @brief Test uxQueueSpacesAvailable with a queue of size 5 x 4 bytes
139 * @details Test uxQueueSpacesAvailable with a typical queue when empty and occupied.
140 * @coverage uxQueueSpacesAvailable
142 void test_uxQueueSpacesAvailable_empty_occupied( void )
144 QueueHandle_t xQueue = xQueueCreate( 5, sizeof( uint32_t ) );
146 TEST_ASSERT_EQUAL( 5, uxQueueSpacesAvailable( xQueue ) );
148 for( uint32_t i = 0; i < 5; i++ )
150 xQueueSend( xQueue, &i, 0 );
151 TEST_ASSERT_EQUAL( 4 - i, uxQueueSpacesAvailable( xQueue ) );
154 vQueueDelete( xQueue );
159 * @brief Test xQueueIsQueueEmptyFromISR with an invalid QueueHandle
160 * @coverage xQueueIsQueueEmptyFromISR
162 void test_xQueueIsQueueEmptyFromISR_invalid_handle( void )
164 EXPECT_ASSERT_BREAK( xQueueIsQueueEmptyFromISR( NULL ) );
168 * @brief Test xQueueIsQueueEmptyFromISR with a queue of size 5 x 4 bytes
169 * @details Test xQueueIsQueueEmptyFromISR with a typical queue when empty and occupied.
170 * @coverage xQueueIsQueueEmptyFromISR
172 void test_xQueueIsQueueEmptyFromISR_empty_occupied( void )
174 QueueHandle_t xQueue = xQueueCreate( 5, sizeof( uint32_t ) );
176 TEST_ASSERT_EQUAL( pdTRUE, xQueueIsQueueEmptyFromISR( xQueue ) );
178 for( uint32_t i = 0; i < 5; i++ )
180 xQueueSend( xQueue, &i, 0 );
181 TEST_ASSERT_EQUAL( pdFALSE, xQueueIsQueueEmptyFromISR( xQueue ) );
184 vQueueDelete( xQueue );
188 * @brief Test xQueueIsQueueFullFromISR with an invalid QueueHandle
189 * @coverage xQueueIsQueueFullFromISR
191 void test_xQueueIsQueueFullFromISR_invalid_handle( void )
193 EXPECT_ASSERT_BREAK( xQueueIsQueueFullFromISR( NULL ) );
197 * @brief Test xQueueIsQueueFullFromISR with a queue of size 5 x 4 bytes
198 * @details Test xQueueIsQueueFullFromISR with a typical queue when empty and occupied.
199 * @coverage xQueueIsQueueFullFromISR
201 void test_xQueueIsQueueFullFromISR_empty_occupied( void )
203 QueueHandle_t xQueue = xQueueCreate( 5, sizeof( uint32_t ) );
205 for( uint32_t i = 0; i < 5; i++ )
207 TEST_ASSERT_EQUAL( pdFALSE, xQueueIsQueueFullFromISR( xQueue ) );
208 xQueueSend( xQueue, &i, 0 );
211 TEST_ASSERT_EQUAL( pdTRUE, xQueueIsQueueFullFromISR( xQueue ) );
213 vQueueDelete( xQueue );
217 * @brief Test vQueueWaitForMessageRestricted with an empty queue.
218 * @details Test vQueueWaitForMessageRestricted with various values for
219 * xTicksToWait and xWaitIndefinitely.
220 * @coverage vQueueWaitForMessageRestricted
222 void test_vQueueWaitForMessageRestricted_empty( void )
224 QueueHandle_t xQueue = xQueueCreate( 5, sizeof( uint32_t ) );
228 TickType_t xTicksToWait;
229 BaseType_t xWaitIndefinitely;
242 List_t * pxTasksWaitingToReceive = pxGetTasksWaitingToReceiveFromQueue( xQueue );
244 for( uint32_t i = 0; i < ( sizeof( xTestCaseArray ) / sizeof( xTestCaseArray[ 0 ] ) ); i++ )
246 vTaskPlaceOnEventListRestricted_Expect( pxTasksWaitingToReceive,
247 xTestCaseArray[ i ].xTicksToWait,
248 xTestCaseArray[ i ].xWaitIndefinitely );
249 /* call api function */
250 vQueueWaitForMessageRestricted( xQueue,
251 xTestCaseArray[ i ].xTicksToWait,
252 xTestCaseArray[ i ].xWaitIndefinitely );
255 vQueueDelete( xQueue );
259 * @brief Test vQueueWaitForMessageRestricted with an occupied queue.
260 * @details Test vQueueWaitForMessageRestricted with various values for
261 * xTicksToWait and xWaitIndefinitely.
262 * @coverage vQueueWaitForMessageRestricted
264 void test_vQueueWaitForMessageRestricted_occupied( void )
266 QueueHandle_t xQueue = xQueueCreate( 5, sizeof( uint32_t ) );
268 uint32_t testVal = getNextMonotonicTestValue();
270 xQueueSend( xQueue, &testVal, 0 );
274 TickType_t xTicksToWait;
275 BaseType_t xWaitIndefinitely;
288 for( uint32_t i = 0; i < ( sizeof( xTestCaseArray ) / sizeof( xTestCaseArray[ 0 ] ) ); i++ )
290 /* call api function */
291 vQueueWaitForMessageRestricted( xQueue,
292 xTestCaseArray[ i ].xTicksToWait,
293 xTestCaseArray[ i ].xWaitIndefinitely );
294 /* Do not expect a call to vTaskPlaceOnEventListRestricted */
297 vQueueDelete( xQueue );
301 * @brief Test vQueueWaitForMessageRestricted on an empty locked queue.
302 * @details This test case verifies a situation that should never occur ( vQueueWaitForMessageRestricted called on a locked queue ).
303 * @coverage vQueueWaitForMessageRestricted
305 void test_vQueueWaitForMessageRestricted_locked( void )
307 /* Create a new binary Queue */
308 QueueHandle_t xQueue = xQueueCreate( 1, sizeof( uint32_t ) );
310 /* Set private lock counters */
311 vSetQueueRxLock( xQueue, queueLOCKED_UNMODIFIED );
312 vSetQueueTxLock( xQueue, queueLOCKED_UNMODIFIED );
314 List_t * pxTasksWaitingToReceive = pxGetTasksWaitingToReceiveFromQueue( xQueue );
316 vTaskPlaceOnEventListRestricted_Expect( pxTasksWaitingToReceive,
320 /* Run vQueueWaitForMessageRestricted with the queue locked */
321 vQueueWaitForMessageRestricted( xQueue, 10, pdFALSE );
323 /* Verify that the queue is now unlocked */
324 TEST_ASSERT_EQUAL( queueUNLOCKED, cGetQueueRxLock( xQueue ) );
325 TEST_ASSERT_EQUAL( queueUNLOCKED, cGetQueueTxLock( xQueue ) );
327 vQueueDelete( xQueue );