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_set_utest.c */
28 /* C runtime includes. */
33 #include "../queue_utest_common.h"
37 #include "FreeRTOSConfig.h"
39 #include "mock_fake_port.h"
41 /* ============================ GLOBAL VARIABLES =========================== */
43 /* ========================== CALLBACK FUNCTIONS =========================== */
45 /* ============================= Unity Fixtures ============================= */
62 int suiteTearDown( int numFailures )
64 return commonSuiteTearDown( numFailures );
67 /* ========================== Helper functions =========================== */
69 /* ========================== Test Cases =========================== */
72 * @brief Test xQueueCreateSet when calls to malloc fail.
73 * @coverage xQueueCreateSet
75 void test_xQueueCreateSet_malloc_fail( void )
77 UnityMalloc_MakeMallocFailAfterCount( 0 );
79 QueueSetHandle_t xQueueSet = INVALID_PTR;
81 xQueueSet = xQueueCreateSet( 1 );
83 TEST_ASSERT_EQUAL( NULL, xQueueSet );
87 * @brief Test xQueueCreateSet with uxEventQueueLength=0
88 * @coverage xQueueCreateSet
90 void test_xQueueCreateSet_zeroLength( void )
92 /* Expect that xQueueCreateSet will assert because a length of 0 is invalid */
93 fakeAssertExpectFail();
95 QueueSetHandle_t xQueueSet = xQueueCreateSet( 0 );
97 /* validate returned QueueSet handle */
98 TEST_ASSERT_EQUAL( NULL, xQueueSet );
100 /* verify that configASSERT was called */
101 TEST_ASSERT_EQUAL( true, fakeAssertGetFlagAndClear() );
102 TEST_ASSERT_EQUAL( 0, getLastMallocSize() );
106 * @brief Test xQueueCreateSet with uxEventQueueLength=1
107 * @coverage xQueueCreateSet
109 void test_xQueueCreateSet_oneLength( void )
111 QueueSetHandle_t xQueueSet = xQueueCreateSet( 1 );
113 /* validate returned QueueSet handle */
114 TEST_ASSERT_NOT_EQUAL( NULL, xQueueSet );
116 TEST_ASSERT_EQUAL( QUEUE_T_SIZE + sizeof( void * ), getLastMallocSize() );
118 /* Veify that QueueSet is not full */
119 TEST_ASSERT_EQUAL( 1, uxQueueSpacesAvailable( xQueueSet ) );
121 /* Veify that QueueSet is empty */
122 TEST_ASSERT_EQUAL( 0, uxQueueMessagesWaiting( xQueueSet ) );
124 vQueueDelete( xQueueSet );
128 * @brief Test xQueueAddToSet with the same queue twice
129 * @coverage xQueueAddToSet
131 void test_xQueueAddToSet_AlreadyInSameSet( void )
133 QueueSetHandle_t xQueueSet = xQueueCreateSet( 2 );
135 QueueHandle_t xQueue = xQueueCreate( 1, 0 );
137 TEST_ASSERT_EQUAL( pdTRUE, xQueueAddToSet( xQueue, xQueueSet ) );
139 TEST_ASSERT_EQUAL( pdFALSE, xQueueAddToSet( xQueue, xQueueSet ) );
141 ( void ) xQueueRemoveFromSet( xQueue, xQueueSet );
142 vQueueDelete( xQueueSet );
143 vQueueDelete( xQueue );
147 * @brief Test xQueueAddToSet with a queue that is already a member of a different QueueSet.
148 * @coverage xQueueAddToSet
150 void test_xQueueAddToSet_AlreadyInDifferentSet( void )
152 QueueSetHandle_t xQueueSet1 = xQueueCreateSet( 1 );
154 QueueSetHandle_t xQueueSet2 = xQueueCreateSet( 1 );
156 QueueHandle_t xQueue = xQueueCreate( 1, 0 );
158 TEST_ASSERT_EQUAL( pdTRUE, xQueueAddToSet( xQueue, xQueueSet1 ) );
160 TEST_ASSERT_EQUAL( pdFALSE, xQueueAddToSet( xQueue, xQueueSet2 ) );
162 ( void ) xQueueRemoveFromSet( xQueue, xQueueSet1 );
163 vQueueDelete( xQueueSet1 );
164 vQueueDelete( xQueueSet2 );
165 vQueueDelete( xQueue );
169 * @brief Test xQueueAddToSet with a queue that was previously a member of a different QueueSet, which was deleted.
170 * @coverage xQueueAddToSet
172 void test_xQueueAddToSet_PreviouslyInDifferentSet( void )
174 QueueSetHandle_t xQueueSet1 = xQueueCreateSet( 1 );
175 QueueSetHandle_t xQueueSet2 = xQueueCreateSet( 1 );
177 QueueHandle_t xQueue = xQueueCreate( 1, 0 );
179 TEST_ASSERT_EQUAL( pdTRUE, xQueueAddToSet( xQueue, xQueueSet1 ) );
181 ( void ) xQueueRemoveFromSet( xQueue, xQueueSet1 );
182 vQueueDelete( xQueueSet1 );
184 TEST_ASSERT_EQUAL( pdTRUE, xQueueAddToSet( xQueue, xQueueSet2 ) );
186 ( void ) xQueueRemoveFromSet( xQueue, xQueueSet2 );
187 vQueueDelete( xQueue );
188 vQueueDelete( xQueueSet2 );
192 * @brief Test xQueueAddToSet with a queue that is not empty.
193 * @coverage xQueueAddToSet
195 void test_xQueueAddToSet_QueueNotEmpty( void )
197 QueueSetHandle_t xQueueSet = xQueueCreateSet( 1 );
199 QueueHandle_t xQueue = xQueueCreate( 1, 0 );
201 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue, NULL, 0 ) );
203 TEST_ASSERT_EQUAL( pdFALSE, xQueueAddToSet( xQueue, xQueueSet ) );
205 ( void ) xQueueRemoveFromSet( xQueue, xQueueSet );
206 vQueueDelete( xQueueSet );
207 vQueueDelete( xQueue );
211 * @brief Test xQueueSelectFromSet with multiple queues in a set.
212 * @coverage xQueueSelectFromSet
214 void test_xQueueSelectFromSet( void )
216 QueueSetHandle_t xQueueSet = xQueueCreateSet( 3 );
218 QueueHandle_t xQueue1 = xQueueCreate( 1, sizeof( uint32_t ) );
219 QueueHandle_t xQueue2 = xQueueCreate( 1, sizeof( uint32_t ) );
220 QueueHandle_t xQueue3 = xQueueCreate( 1, sizeof( uint32_t ) );
222 TEST_ASSERT_EQUAL( pdTRUE, xQueueAddToSet( xQueue1, xQueueSet ) );
223 TEST_ASSERT_EQUAL( pdTRUE, xQueueAddToSet( xQueue2, xQueueSet ) );
224 TEST_ASSERT_EQUAL( pdTRUE, xQueueAddToSet( xQueue3, xQueueSet ) );
226 uint32_t testVal1 = 1;
228 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue1, &testVal1, 0 ) );
230 uint32_t testVal2 = 2;
232 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue2, &testVal2, 0 ) );
234 uint32_t testVal3 = 3;
236 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue3, &testVal3, 0 ) );
238 QueueHandle_t xQueueTemp = xQueueSelectFromSet( xQueueSet, 0 );
240 TEST_ASSERT_EQUAL( xQueueTemp, xQueue1 );
242 uint32_t checkVal1 = 0;
244 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceive( xQueueTemp, &checkVal1, 0 ) );
245 TEST_ASSERT_EQUAL( testVal1, checkVal1 );
247 xQueueTemp = xQueueSelectFromSet( xQueueSet, 0 );
249 TEST_ASSERT_EQUAL( xQueueTemp, xQueue2 );
251 uint32_t checkVal2 = 0;
253 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceive( xQueueTemp, &checkVal2, 0 ) );
254 TEST_ASSERT_EQUAL( testVal2, checkVal2 );
256 xQueueTemp = xQueueSelectFromSet( xQueueSet, 0 );
258 TEST_ASSERT_EQUAL( xQueueTemp, xQueue3 );
260 uint32_t checkVal3 = 0;
262 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceive( xQueueTemp, &checkVal3, 0 ) );
263 TEST_ASSERT_EQUAL( testVal3, checkVal3 );
265 ( void ) xQueueRemoveFromSet( xQueue1, xQueueSet );
266 ( void ) xQueueRemoveFromSet( xQueue2, xQueueSet );
267 ( void ) xQueueRemoveFromSet( xQueue3, xQueueSet );
268 vQueueDelete( xQueueSet );
269 vQueueDelete( xQueue1 );
270 vQueueDelete( xQueue2 );
271 vQueueDelete( xQueue3 );
275 * @brief Test xQueueSelectFromSetFromISR with multiple queues in a set.
276 * @coverage xQueueSelectFromSetFromISR
278 void test_xQueueSelectFromSetFromISR( void )
280 QueueSetHandle_t xQueueSet = xQueueCreateSet( 3 );
282 QueueHandle_t xQueue1 = xQueueCreate( 1, sizeof( uint32_t ) );
283 QueueHandle_t xQueue2 = xQueueCreate( 1, sizeof( uint32_t ) );
284 QueueHandle_t xQueue3 = xQueueCreate( 1, sizeof( uint32_t ) );
286 TEST_ASSERT_EQUAL( pdTRUE, xQueueAddToSet( xQueue1, xQueueSet ) );
287 TEST_ASSERT_EQUAL( pdTRUE, xQueueAddToSet( xQueue2, xQueueSet ) );
288 TEST_ASSERT_EQUAL( pdTRUE, xQueueAddToSet( xQueue3, xQueueSet ) );
290 uint32_t testVal1 = 1;
292 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue1, &testVal1, 0 ) );
294 uint32_t testVal2 = 2;
296 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue2, &testVal2, 0 ) );
298 uint32_t testVal3 = 3;
300 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue3, &testVal3, 0 ) );
302 vFakePortAssertIfInterruptPriorityInvalid_Expect();
303 QueueHandle_t xQueueTemp = xQueueSelectFromSetFromISR( xQueueSet );
305 TEST_ASSERT_EQUAL( xQueueTemp, xQueue1 );
307 vFakePortAssertIfInterruptPriorityInvalid_Expect();
308 uint32_t checkVal1 = 0;
310 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceiveFromISR( xQueueTemp, &checkVal1, 0 ) );
311 TEST_ASSERT_EQUAL( testVal1, checkVal1 );
313 vFakePortAssertIfInterruptPriorityInvalid_Expect();
314 xQueueTemp = xQueueSelectFromSetFromISR( xQueueSet );
316 TEST_ASSERT_EQUAL( xQueueTemp, xQueue2 );
318 vFakePortAssertIfInterruptPriorityInvalid_Expect();
319 uint32_t checkVal2 = 0;
321 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceiveFromISR( xQueueTemp, &checkVal2, 0 ) );
322 TEST_ASSERT_EQUAL( testVal2, checkVal2 );
324 vFakePortAssertIfInterruptPriorityInvalid_Expect();
325 xQueueTemp = xQueueSelectFromSetFromISR( xQueueSet );
327 TEST_ASSERT_EQUAL( xQueueTemp, xQueue3 );
329 vFakePortAssertIfInterruptPriorityInvalid_Expect();
330 uint32_t checkVal3 = 0;
332 TEST_ASSERT_EQUAL( pdTRUE, xQueueReceiveFromISR( xQueueTemp, &checkVal3, 0 ) );
333 TEST_ASSERT_EQUAL( testVal3, checkVal3 );
335 ( void ) xQueueRemoveFromSet( xQueue1, xQueueSet );
336 ( void ) xQueueRemoveFromSet( xQueue2, xQueueSet );
337 ( void ) xQueueRemoveFromSet( xQueue3, xQueueSet );
338 vQueueDelete( xQueueSet );
339 vQueueDelete( xQueue1 );
340 vQueueDelete( xQueue2 );
341 vQueueDelete( xQueue3 );
345 * @brief Test xQueueRemoveFromSet where the queue to be removed
347 * @coverage xQueueRemoveFromSet
349 void test_xQueueRemoveFromSet_QueueNotEmpty( void )
351 QueueSetHandle_t xQueueSet = xQueueCreateSet( 1 );
353 QueueHandle_t xQueue = xQueueCreate( 1, 0 );
355 TEST_ASSERT_EQUAL( pdTRUE, xQueueAddToSet( xQueue, xQueueSet ) );
357 TEST_ASSERT_EQUAL( pdTRUE, xQueueSend( xQueue, NULL, 0 ) );
359 TEST_ASSERT_EQUAL( pdFALSE, xQueueRemoveFromSet( xQueue, xQueueSet ) );
361 vQueueDelete( xQueueSet );
362 vQueueDelete( xQueue );
366 * @brief Test xQueueRemoveFromSet where the queue to be removed
367 * is already in a different set.
368 * @coverage xQueueRemoveFromSet
370 void test_xQueueRemoveFromSet_QueueNotInSet( void )
372 QueueSetHandle_t xQueueSet1 = xQueueCreateSet( 1 );
373 QueueSetHandle_t xQueueSet2 = xQueueCreateSet( 1 );
375 QueueHandle_t xQueue = xQueueCreate( 1, 0 );
377 TEST_ASSERT_EQUAL( pdTRUE, xQueueAddToSet( xQueue, xQueueSet1 ) );
379 TEST_ASSERT_EQUAL( pdFALSE, xQueueRemoveFromSet( xQueue, xQueueSet2 ) );
381 TEST_ASSERT_EQUAL( pdTRUE, xQueueRemoveFromSet( xQueue, xQueueSet1 ) );
383 TEST_ASSERT_EQUAL( pdTRUE, xQueueAddToSet( xQueue, xQueueSet2 ) );
385 vQueueDelete( xQueueSet1 );
386 vQueueDelete( xQueueSet2 );
387 vQueueDelete( xQueue );
391 * @brief Test xQueueRemoveFromSet where the queue to be removed
392 * is in the given set.
393 * @coverage xQueueRemoveFromSet
395 void test_xQueueRemoveFromSet_QueueInSet( void )
397 QueueSetHandle_t xQueueSet1 = xQueueCreateSet( 1 );
398 QueueSetHandle_t xQueueSet2 = xQueueCreateSet( 1 );
400 QueueHandle_t xQueue = xQueueCreate( 1, 0 );
402 TEST_ASSERT_EQUAL( pdTRUE, xQueueAddToSet( xQueue, xQueueSet1 ) );
404 TEST_ASSERT_EQUAL( pdTRUE, xQueueRemoveFromSet( xQueue, xQueueSet1 ) );
406 TEST_ASSERT_EQUAL( pdTRUE, xQueueAddToSet( xQueue, xQueueSet2 ) );
408 vQueueDelete( xQueueSet1 );
409 vQueueDelete( xQueueSet2 );
410 vQueueDelete( xQueue );