diff --git a/FreeRTOS/Test/CMock/config/portmacro.h b/FreeRTOS/Test/CMock/config/portmacro.h index dcf0adeb3d0..c20bab70e9f 100644 --- a/FreeRTOS/Test/CMock/config/portmacro.h +++ b/FreeRTOS/Test/CMock/config/portmacro.h @@ -123,38 +123,30 @@ typedef unsigned long UBaseType_t; /*-----------------------------------------------------------*/ #define portSAVE_CONTEXT() -#define portYIELD() vFakePortYield() -#define portYIELD_WITHIN_API() vFakePortYieldWithinAPI() -#define portYIELD_FROM_ISR() vFakePortYieldFromISR() +#define portYIELD() vFakePortYield() +#define portYIELD_WITHIN_API() vFakePortYieldWithinAPI() +#define portYIELD_FROM_ISR() vFakePortYieldFromISR() /* Critical section handling. */ -#define portDISABLE_INTERRUPTS() vFakePortDisableInterrupts() -#define portENABLE_INTERRUPTS() vFakePortEnableInterrupts() +#define portDISABLE_INTERRUPTS() vFakePortDisableInterrupts() +#define portENABLE_INTERRUPTS() vFakePortEnableInterrupts() #define portCLEAR_INTERRUPT_MASK_FROM_ISR( x ) \ vFakePortClearInterruptMaskFromISR( x ) #define portSET_INTERRUPT_MASK_FROM_ISR() \ ulFakePortSetInterruptMaskFromISR() -#define portSET_INTERRUPT_MASK() ulFakePortSetInterruptMask() -#define portCLEAR_INTERRUPT_MASK( x ) vFakePortClearInterruptMask( x ) +#define portSET_INTERRUPT_MASK() ulFakePortSetInterruptMask() +#define portCLEAR_INTERRUPT_MASK( x ) vFakePortClearInterruptMask( x ) #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() \ vFakePortAssertIfInterruptPriorityInvalid() -#define portENTER_CRITICAL() vFakePortEnterCriticalSection() -#define portEXIT_CRITICAL() vFakePortExitCriticalSection() +#define portENTER_CRITICAL() vFakePortEnterCriticalSection() +#define portEXIT_CRITICAL() vFakePortExitCriticalSection() #define portPRE_TASK_DELETE_HOOK( pvTaskToDelete, pxPendYield ) \ vPortCurrentTaskDying( ( pvTaskToDelete ), ( pxPendYield ) ) -#define portSETUP_TCB( pxTCB ) portSetupTCB_CB( pxTCB ); -#define portASSERT_IF_IN_ISR() vFakePortAssertIfISR(); - - -static uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap ) -{ - uint8_t ucReturn; - - ucReturn = __builtin_clz( ulBitmap ); - return ucReturn; -} +#define portSETUP_TCB( pxTCB ) portSetupTCB_CB( pxTCB ); +#define portASSERT_IF_IN_ISR() vFakePortAssertIfISR(); +#define ucPortCountLeadingZeros( ulBitmap ) ( ( uint8_t ) __builtin_clz( ulBitmap ) ) #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) \ ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) diff --git a/FreeRTOS/Test/CMock/event_groups/event_groups_utest.c b/FreeRTOS/Test/CMock/event_groups/event_groups_utest.c index ff91acea842..fdadd46993c 100644 --- a/FreeRTOS/Test/CMock/event_groups/event_groups_utest.c +++ b/FreeRTOS/Test/CMock/event_groups/event_groups_utest.c @@ -37,6 +37,7 @@ /* Test includes. */ #include "unity.h" #include "unity_memory.h" +#include "CException.h" /* Mock includes. */ #include "mock_task.h" @@ -48,10 +49,37 @@ /* =========================== DEFINES CONSTANTS ========================== */ -#define BIT_0 ( 1 << 0 ) -#define BIT_2 ( 1 << 2 ) -#define BIT_4 ( 1 << 4 ) -#define ALL_SYNC_BITS ( BIT_0 | BIT_2 | BIT_4 ) +#define BIT_0 ( 1 << 0 ) +#define BIT_2 ( 1 << 2 ) +#define BIT_4 ( 1 << 4 ) +#define ALL_SYNC_BITS ( BIT_0 | BIT_2 | BIT_4 ) + +/** + * @brief CException code for when a configASSERT should be intercepted. + */ +#define configASSERT_E 0xAA101 + +/** + * @brief Expect a configASSERT from the function called. + * Break out of the called function when this occurs. + * @details Use this macro when the call passed in as a parameter is expected + * to cause invalid memory access. + */ +#define EXPECT_ASSERT_BREAK( call ) \ + do \ + { \ + shouldAbortOnAssertion = true; \ + CEXCEPTION_T e = CEXCEPTION_NONE; \ + Try \ + { \ + call; \ + TEST_FAIL_MESSAGE( "Expected Assert!" ); \ + } \ + Catch( e ) \ + { \ + TEST_ASSERT_EQUAL( configASSERT_E, e ); \ + } \ + } while( 0 ) /* =========================== GLOBAL VARIABLES =========================== */ @@ -64,6 +92,16 @@ static List_t * pxListTemp = &xListTemp; static ListItem_t xListItemDummy = { 0 }; static ListItem_t * pxListItem_HasTaskBlockOnBit0 = &xListItemDummy; +/** + * @brief Global counter for the number of assertions in code. + */ +static int assertionFailed = 0; + +/** + * @brief Flag which denotes if test need to abort on assertion. + */ +static BaseType_t shouldAbortOnAssertion; + /* =========================== EXTERN VARIABLES =========================== */ /* ========================== CALLBACK FUNCTIONS =========================== */ @@ -77,6 +115,22 @@ void vPortFree( void * pv ) return unity_free( pv ); } +static void vFakeAssertStub( bool x, + char * file, + int line, + int cmock_num_calls ) +{ + if( !x ) + { + assertionFailed++; + + if( shouldAbortOnAssertion == pdTRUE ) + { + Throw( configASSERT_E ); + } + } +} + /* ============================ Unity Fixtures ============================ */ /*! called before each testcase */ void setUp( void ) @@ -91,12 +145,14 @@ void setUp( void ) pxListItem_HasTaskBlockOnBit0->xItemValue = BIT_0; - vFakeAssert_Ignore(); + vFakeAssert_StubWithCallback( vFakeAssertStub ); vFakePortEnterCriticalSection_Ignore(); vFakePortExitCriticalSection_Ignore(); ulFakePortSetInterruptMaskFromISR_IgnoreAndReturn( 0U ); vFakePortClearInterruptMaskFromISR_Ignore(); + vTaskSuspendAll_Ignore(); + /* Track calls to malloc / free */ UnityMalloc_StartTest(); } @@ -105,6 +161,8 @@ void setUp( void ) void tearDown( void ) { UnityMalloc_EndTest(); + mock_fake_assert_Verify(); + mock_fake_assert_Destroy(); } /*! called at the beginning of the whole suite */ @@ -118,6 +176,12 @@ int suiteTearDown( int numFailures ) return numFailures; } +static void validate_and_clear_assertions( void ) +{ + TEST_ASSERT_EQUAL( 1, assertionFailed ); + assertionFailed = 0; +} + /* =========================== Static Functions =========================== */ @@ -134,7 +198,6 @@ void test_xEventGroupDynamicCreateAndDelete_Success( void ) vListInitialise_IgnoreArg_pxList(); vListInitialise_ReturnThruPtr_pxList( pxListTemp ); /* Expectation of Function: vEventGroupDelete */ - vTaskSuspendAll_Ignore(); listCURRENT_LIST_LENGTH_ExpectAnyArgsAndReturn( 1 ); vTaskRemoveFromUnorderedEventList_Ignore(); listCURRENT_LIST_LENGTH_ExpectAnyArgsAndReturn( 0 ); @@ -175,7 +238,6 @@ void test_xEventGroupStaticCreate_Success( void ) vListInitialise_Ignore(); /* Expectation of Function: vEventGroupDelete */ - vTaskSuspendAll_Ignore(); listCURRENT_LIST_LENGTH_ExpectAnyArgsAndReturn( 1 ); vTaskRemoveFromUnorderedEventList_Ignore(); listCURRENT_LIST_LENGTH_ExpectAnyArgsAndReturn( 0 ); @@ -221,7 +283,6 @@ void test_xEventGroupSetBits_NoTaskBlockedOnBits_Success( void ) /* Expectation of Function: xEventGroupSetBits */ listGET_END_MARKER_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); - vTaskSuspendAll_Ignore(); listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); listGET_LIST_ITEM_VALUE_IgnoreAndReturn( 0 ); xTaskResumeAll_IgnoreAndReturn( 1 ); @@ -251,7 +312,6 @@ void test_xEventGroupSetBits_WithTaskBlockedOnBits_Success( void ) /* Expectation of Function: xEventGroupSetBits */ listGET_END_MARKER_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); - vTaskSuspendAll_Ignore(); listGET_NEXT_ExpectAnyArgsAndReturn( pxListItem_HasTaskBlockOnBit0 ); listGET_LIST_ITEM_VALUE_IgnoreAndReturn( BIT_0 ); listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); @@ -283,7 +343,6 @@ void test_vEventGroupSetBitsCallback_Success( void ) /* Expectation of Function: xEventGroupSetBits */ listGET_END_MARKER_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); - vTaskSuspendAll_Ignore(); listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); listGET_LIST_ITEM_VALUE_IgnoreAndReturn( 0 ); xTaskResumeAll_IgnoreAndReturn( 1 ); @@ -314,7 +373,6 @@ void test_xEventGroupGetBits_Success( void ) /* Expectation of Function: xEventGroupSetBits */ listGET_END_MARKER_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); - vTaskSuspendAll_Ignore(); listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); listGET_LIST_ITEM_VALUE_IgnoreAndReturn( 0 ); xTaskResumeAll_IgnoreAndReturn( 1 ); @@ -372,7 +430,6 @@ void test_xEventGroupClearBits_Success( void ) /* Expectation of Function: xEventGroupSetBits */ listGET_END_MARKER_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); - vTaskSuspendAll_Ignore(); listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); listGET_LIST_ITEM_VALUE_IgnoreAndReturn( 0 ); xTaskResumeAll_IgnoreAndReturn( 1 ); @@ -406,7 +463,6 @@ void test_vEventGroupClearBitsCallback_Success( void ) /* Expectation of Function: xEventGroupSetBits */ listGET_END_MARKER_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); - vTaskSuspendAll_Ignore(); listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); listGET_LIST_ITEM_VALUE_IgnoreAndReturn( 0 ); xTaskResumeAll_IgnoreAndReturn( 1 ); @@ -437,7 +493,6 @@ void test_xEventGroupWaitBits_WhenNoBitWasSet_WaitForBoth_ClearBit_Success( void vListInitialise_ReturnThruPtr_pxList( pxListTemp ); /* Expectation of Function: xEventGroupWaitBits */ - vTaskSuspendAll_Ignore(); xTaskGetSchedulerState_IgnoreAndReturn( taskSCHEDULER_SUSPENDED ); vTaskPlaceOnUnorderedEventList_Ignore(); xTaskResumeAll_IgnoreAndReturn( 1 ); @@ -475,7 +530,6 @@ void test_xEventGroupWaitBits_WhenNoBitWasSet_NonBlock_WaitForEither_NoClear_Suc vListInitialise_ReturnThruPtr_pxList( pxListTemp ); /* Expectation of Function: xEventGroupWaitBits */ - vTaskSuspendAll_Ignore(); xTaskGetSchedulerState_IgnoreAndReturn( taskSCHEDULER_SUSPENDED ); vTaskPlaceOnUnorderedEventList_Ignore(); xTaskResumeAll_IgnoreAndReturn( 1 ); @@ -513,7 +567,6 @@ void test_xEventGroupWaitBits_WhenBitWasSet_WaitForEither_NoClear_Success( void /* Expectation of Function: xEventGroupSetBits */ listGET_END_MARKER_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); - vTaskSuspendAll_Ignore(); listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); listGET_LIST_ITEM_VALUE_IgnoreAndReturn( 0 ); xTaskResumeAll_IgnoreAndReturn( 1 ); @@ -557,7 +610,6 @@ void test_xEventGroupWaitBits_WhenBitWasSet_WaitForBoth_WithClear_Success( void /* Expectation of Function: xEventGroupSetBits x2 */ listGET_END_MARKER_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); - vTaskSuspendAll_Ignore(); listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); listGET_LIST_ITEM_VALUE_IgnoreAndReturn( 0 ); xTaskResumeAll_IgnoreAndReturn( 1 ); @@ -607,7 +659,6 @@ void test_xEventGroupSync_SetBits_BlockWait_NotSynced_Success( void ) /* Expectation of Function: xEventGroupSetBits */ listGET_END_MARKER_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); - vTaskSuspendAll_Ignore(); listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); xTaskResumeAll_IgnoreAndReturn( 1 ); listGET_LIST_ITEM_VALUE_IgnoreAndReturn( 0 ); @@ -644,7 +695,6 @@ void test_xEventGroupSync_NoSetBit_NonBlockWait_NotSynced_Success( void ) /* Expectation of Function: xEventGroupSetBits x2 */ listGET_END_MARKER_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); - vTaskSuspendAll_Ignore(); listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); xTaskResumeAll_IgnoreAndReturn( 1 ); listGET_LIST_ITEM_VALUE_IgnoreAndReturn( 0 ); @@ -685,7 +735,6 @@ void test_xEventGroupSync_SetBits_BlockWait_Synced_Success( void ) /* Expectation of Function: xEventGroupSetBits x2 */ listGET_END_MARKER_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); - vTaskSuspendAll_Ignore(); listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) NULL ); xTaskResumeAll_IgnoreAndReturn( 1 ); listGET_LIST_ITEM_VALUE_IgnoreAndReturn( 0 ); @@ -791,3 +840,104 @@ void test_xEventGroupSetBitsFromISR_Success( void ) /* API to Test */ ( void ) xEventGroupSetBitsFromISR( NULL, BIT_0, &xHigherPriorityTaskWoken ); } + +/*! + * @brief validate xEventGroupGetStaticBuffer with a null xEventGroup argument. + * @details Test that xEventGroupGetStaticBuffer asserts when xEventGroupGetStaticBuffer is called with a null EventGroupHandle_t + * @coverage xEventGroupGetStaticBuffer + */ +void test_xEventGroupGetStaticBuffer_null_xEventGroup( void ) +{ + StaticEventGroup_t * pxEventGroupBufferRet = NULL; + + EXPECT_ASSERT_BREAK( xEventGroupGetStaticBuffer( NULL, &pxEventGroupBufferRet ) ); + TEST_ASSERT_EQUAL( NULL, pxEventGroupBufferRet ); +} + +/*! + * @brief validate xEventGroupGetStaticBuffer with a null ppxEventGroupBuffer argument. + * @details Test that xEventGroupGetStaticBuffer asserts when xEventGroupGetStaticBuffer is called with a null ppxEventGroupBuffer argument. + * @coverage xEventGroupGetStaticBuffer + */ +void test_xEventGroupGetStaticBuffer_null_ppxEventGroupBuffer( void ) +{ + EventGroupHandle_t xEventGroupHandle = NULL; + StaticEventGroup_t xCreatedEventGroup = { 0 }; + + /* Expectation of Function: xEventGroupCreate */ + vListInitialise_Expect( 0 ); + vListInitialise_IgnoreArg_pxList(); + vListInitialise_ReturnThruPtr_pxList( pxListTemp ); + + xEventGroupHandle = xEventGroupCreateStatic( &xCreatedEventGroup ); + + EXPECT_ASSERT_BREAK( xEventGroupGetStaticBuffer( xEventGroupHandle, NULL ) ); + + /* Expectation of Function: vEventGroupDelete */ + listCURRENT_LIST_LENGTH_ExpectAnyArgsAndReturn( 1 ); + vTaskRemoveFromUnorderedEventList_Ignore(); + listCURRENT_LIST_LENGTH_ExpectAnyArgsAndReturn( 0 ); + xTaskResumeAll_IgnoreAndReturn( 1 ); + + vEventGroupDelete( xEventGroupHandle ); +} + +/*! + * @brief validate xEventGroupGetStaticBuffer on a statically created event group + * @details Test xEventGroupGetStaticBuffer returns the buffer of a statically created event group + * @coverage xEventGroupGetStaticBuffer + */ +void test_xEventGroupGetStaticBuffer_static( void ) +{ + EventGroupHandle_t xEventGroupHandle = NULL; + StaticEventGroup_t xCreatedEventGroup = { 0 }; + StaticEventGroup_t * pxEventGroupBufferRet = NULL; + + /* Expectation of Function: xEventGroupCreate */ + vListInitialise_Expect( 0 ); + vListInitialise_IgnoreArg_pxList(); + vListInitialise_ReturnThruPtr_pxList( pxListTemp ); + + xEventGroupHandle = xEventGroupCreateStatic( &xCreatedEventGroup ); + + TEST_ASSERT_EQUAL( pdTRUE, xEventGroupGetStaticBuffer( xEventGroupHandle, &pxEventGroupBufferRet ) ); + TEST_ASSERT_EQUAL( &xCreatedEventGroup, pxEventGroupBufferRet ); + + /* Expectation of Function: vEventGroupDelete */ + listCURRENT_LIST_LENGTH_ExpectAnyArgsAndReturn( 1 ); + vTaskRemoveFromUnorderedEventList_Ignore(); + listCURRENT_LIST_LENGTH_ExpectAnyArgsAndReturn( 0 ); + xTaskResumeAll_IgnoreAndReturn( 1 ); + + vEventGroupDelete( xEventGroupHandle ); +} + +/*! + * @brief validate xEventGroupGetStaticBuffer on a dynamically created event group + * @details Test xEventGroupGetStaticBuffer returns an error when called on a dynamically created event group + * @coverage xEventGroupGetStaticBuffer + */ +void test_xEventGroupGetStaticBuffer_dynamic( void ) +{ + EventGroupHandle_t xEventGroupHandle = NULL; + StaticEventGroup_t * pxEventGroupBufferRet = NULL; + + /* Expectation of Function: xEventGroupCreate */ + vListInitialise_Expect( 0 ); + vListInitialise_IgnoreArg_pxList(); + vListInitialise_ReturnThruPtr_pxList( pxListTemp ); + + xEventGroupHandle = xEventGroupCreate(); + + TEST_ASSERT_EQUAL( pdFALSE, xEventGroupGetStaticBuffer( xEventGroupHandle, &pxEventGroupBufferRet ) ); + TEST_ASSERT_EQUAL( NULL, pxEventGroupBufferRet ); + + + /* Expectation of Function: vEventGroupDelete */ + listCURRENT_LIST_LENGTH_ExpectAnyArgsAndReturn( 1 ); + vTaskRemoveFromUnorderedEventList_Ignore(); + listCURRENT_LIST_LENGTH_ExpectAnyArgsAndReturn( 0 ); + xTaskResumeAll_IgnoreAndReturn( 1 ); + + vEventGroupDelete( xEventGroupHandle ); +} diff --git a/FreeRTOS/Test/CMock/message_buffer/message_buffer/message_buffer_utest.c b/FreeRTOS/Test/CMock/message_buffer/message_buffer/message_buffer_utest.c index cc353503fec..1b7166dc8f1 100644 --- a/FreeRTOS/Test/CMock/message_buffer/message_buffer/message_buffer_utest.c +++ b/FreeRTOS/Test/CMock/message_buffer/message_buffer/message_buffer_utest.c @@ -798,3 +798,110 @@ void test_xMessageBufferReceiveFromISR_success( void ) vStreamBufferDelete( xMessageBuffer ); } + +/** + * @brief validate xMessageBufferGetStaticBuffers with a null xMessageBuffer argument + * @details Test that xMessageBufferGetStaticBuffers asserts when a null MessageBufferHandle_t is given. + */ +void test_xMessageBufferGetStaticBuffers_null_xMessageBuffer( void ) +{ + uint8_t * pucMessageBufferStorageAreaRet = NULL; + StaticMessageBuffer_t * pxStaticMessageBuffer = NULL; + + EXPECT_ASSERT_BREAK( xMessageBufferGetStaticBuffers( NULL, &pucMessageBufferStorageAreaRet, &pxStaticMessageBuffer ) ); + + validate_and_clear_assertions(); + + /* Check that pucMessageBufferStorageAreaRet and pxStaticMessageBuffer have not been modified */ + TEST_ASSERT_EQUAL( NULL, pucMessageBufferStorageAreaRet ); + TEST_ASSERT_EQUAL( NULL, pxStaticMessageBuffer ); +} + +/** + * @brief validate xMessageBufferGetStaticBuffers with a null ppxStaticMessageBuffer argument + * @details Test that xMessageBufferGetStaticBuffers asserts when a null ppxStaticMessageBuffer is given. + */ +void test_xMessageBufferGetStaticBuffers_null_ppxStaticMessageBuffer( void ) +{ + MessageBufferHandle_t xMessageBuffer = NULL; + StaticMessageBuffer_t messageBufferStruct; + uint8_t messageBufferArray[ TEST_MESSAGE_BUFFER_SIZE + 1 ] = { 0 }; + + uint8_t * pucMessageBufferStorageAreaRet = NULL; + + xMessageBuffer = xMessageBufferCreateStatic( sizeof( messageBufferArray ), messageBufferArray, &messageBufferStruct ); + + EXPECT_ASSERT_BREAK( xMessageBufferGetStaticBuffers( xMessageBuffer, &pucMessageBufferStorageAreaRet, NULL ) ); + + validate_and_clear_assertions(); + + /* Check that pucMessageBufferStorageAreaRet has not been modified */ + TEST_ASSERT_EQUAL( NULL, pucMessageBufferStorageAreaRet ); + + vMessageBufferDelete( xMessageBuffer ); +} + +/** + * @brief validate xMessageBufferGetStaticBuffers with a null ppucMessageBufferStorageArea argument + * @details Test that xMessageBufferGetStaticBuffers asserts when a null ppucMessageBufferStorageArea is given. + */ +void test_xMessageBufferGetStaticBuffers_null_ppucMessageBufferStorageArea( void ) +{ + MessageBufferHandle_t xMessageBuffer = NULL; + StaticMessageBuffer_t messageBufferStruct; + uint8_t messageBufferArray[ TEST_MESSAGE_BUFFER_SIZE + 1 ] = { 0 }; + + StaticMessageBuffer_t * pxStaticMessageBuffer = NULL; + + xMessageBuffer = xMessageBufferCreateStatic( sizeof( messageBufferArray ), messageBufferArray, &messageBufferStruct ); + + EXPECT_ASSERT_BREAK( xMessageBufferGetStaticBuffers( xMessageBuffer, NULL, &pxStaticMessageBuffer ) ); + + validate_and_clear_assertions(); + + /* Check that pxStaticMessageBuffer has not been modified */ + TEST_ASSERT_EQUAL( NULL, pxStaticMessageBuffer ); + + vMessageBufferDelete( xMessageBuffer ); +} + +/** + * @brief validate xMessageBufferGetStaticBuffers on a statically created message buffer + * @details Test xMessageBufferGetStaticBuffers returns the buffers of a statically created message buffer + */ +void test_xMessageBufferGetStaticBuffers_static( void ) +{ + MessageBufferHandle_t xMessageBuffer = NULL; + StaticMessageBuffer_t messageBufferStruct; + uint8_t messageBufferArray[ TEST_MESSAGE_BUFFER_SIZE + 1 ] = { 0 }; + + uint8_t * pucMessageBufferStorageAreaRet = NULL; + StaticMessageBuffer_t * pxStaticMessageBuffer = NULL; + + xMessageBuffer = xMessageBufferCreateStatic( sizeof( messageBufferArray ), messageBufferArray, &messageBufferStruct ); + + TEST_ASSERT_EQUAL( pdTRUE, xMessageBufferGetStaticBuffers( xMessageBuffer, &pucMessageBufferStorageAreaRet, &pxStaticMessageBuffer ) ); + TEST_ASSERT_EQUAL( messageBufferArray, pucMessageBufferStorageAreaRet ); + TEST_ASSERT_EQUAL( &messageBufferStruct, pxStaticMessageBuffer ); + + vMessageBufferDelete( xMessageBuffer ); +} + +/** + * @brief validate xMessageBufferGetStaticBuffers on a dynamically created message buffer + * @details Test xMessageBufferGetStaticBuffers returns an error when called on a dynamically created message buffer + */ +void test_xMessageBufferGetStaticBuffers_dynamic( void ) +{ + MessageBufferHandle_t xMessageBuffer = NULL; + uint8_t * pucMessageBufferStorageAreaRet = NULL; + StaticMessageBuffer_t * pxStaticMessageBuffer = NULL; + + xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); + + TEST_ASSERT_EQUAL( pdFALSE, xMessageBufferGetStaticBuffers( xMessageBuffer, &pucMessageBufferStorageAreaRet, &pxStaticMessageBuffer ) ); + TEST_ASSERT_EQUAL( NULL, pucMessageBufferStorageAreaRet ); + TEST_ASSERT_EQUAL( NULL, pxStaticMessageBuffer ); + + vMessageBufferDelete( xMessageBuffer ); +} diff --git a/FreeRTOS/Test/CMock/queue/generic/Makefile b/FreeRTOS/Test/CMock/queue/generic/Makefile index a46ad250d58..91d3b8b6188 100644 --- a/FreeRTOS/Test/CMock/queue/generic/Makefile +++ b/FreeRTOS/Test/CMock/queue/generic/Makefile @@ -26,6 +26,7 @@ SUITE_UT_SRC += queue_receive_blocking_utest.c SUITE_UT_SRC += queue_send_nonblocking_utest.c SUITE_UT_SRC += queue_send_blocking_utest.c SUITE_UT_SRC += queue_status_utest.c +SUITE_UT_SRC += queue_get_static_buffers_utest.c # SUITE_SUPPORT_SRC: .c files used for testing that do not contain test cases. # Paths are relative to PROJECT_DIR diff --git a/FreeRTOS/Test/CMock/queue/generic/queue_get_static_buffers_utest.c b/FreeRTOS/Test/CMock/queue/generic/queue_get_static_buffers_utest.c new file mode 100644 index 00000000000..52c40b8e06f --- /dev/null +++ b/FreeRTOS/Test/CMock/queue/generic/queue_get_static_buffers_utest.c @@ -0,0 +1,159 @@ +/* + * FreeRTOS V202212.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ +/*! @file queue_status_utest.c */ + +/* C runtime includes. */ +#include +#include +#include + +#include "../queue_utest_common.h" + +/* Queue includes */ +#include "FreeRTOS.h" +#include "FreeRTOSConfig.h" +#include "queue.h" + +/* ============================ GLOBAL VARIABLES =========================== */ + +/* ========================== CALLBACK FUNCTIONS =========================== */ + +/* ============================= Unity Fixtures ============================= */ + +void setUp( void ) +{ + commonSetUp(); +} + +void tearDown( void ) +{ + commonTearDown(); +} + +void suiteSetUp() +{ + commonSuiteSetUp(); +} + +int suiteTearDown( int numFailures ) +{ + return commonSuiteTearDown( numFailures ); +} + +/* ========================== Helper functions =========================== */ + +/* ============================= Test Cases ============================== */ + +/** + * @brief Test xQueueGetStaticBuffers with an invalid QueueHandle + * @coverage xQueueGetStaticBuffers xQueueGenericGetStaticBuffers + */ +void test_macro_xQueueGetStaticBuffers_invalid_handle( void ) +{ + uint8_t * pucQueueStorageRet = NULL; + StaticQueue_t * pxStaticQueueRet = NULL; + + EXPECT_ASSERT_BREAK( xQueueGetStaticBuffers( NULL, &pucQueueStorageRet, &pxStaticQueueRet ) ); + TEST_ASSERT_EQUAL( NULL, pucQueueStorageRet ); + TEST_ASSERT_EQUAL( NULL, pxStaticQueueRet ); +} + +/** + * @brief Test xQueueGetStaticBuffers with a null ppxStaticQueue argument + * @coverage xQueueGetStaticBuffers xQueueGenericGetStaticBuffers + */ +void test_macro_xQueueGetStaticBuffers_null_ppxStaticQueue( void ) +{ + uint32_t queueStorage[ 5 ]; + StaticQueue_t queueBuffer; + uint8_t * pucQueueStorageRet = NULL; + StaticQueue_t * pxStaticQueueRet = NULL; + + QueueHandle_t xQueue = xQueueCreateStatic( 5, sizeof( uint32_t ), ( void * ) queueStorage, &queueBuffer ); + + EXPECT_ASSERT_BREAK( xQueueGetStaticBuffers( xQueue, &pucQueueStorageRet, NULL ) ); + + TEST_ASSERT_EQUAL( NULL, pucQueueStorageRet ); + TEST_ASSERT_EQUAL( NULL, pxStaticQueueRet ); +} + +/** + * @brief Test xQueueGetStaticBuffers with a null ppucQueueStorage argument + * @coverage xQueueGetStaticBuffers xQueueGenericGetStaticBuffers + */ +void test_macro_xQueueGetStaticBuffers_null_ppucQueueStorage( void ) +{ + uint32_t queueStorage[ 5 ]; + StaticQueue_t queueBuffer; + StaticQueue_t * pxStaticQueueRet = NULL; + + QueueHandle_t xQueue = xQueueCreateStatic( 5, sizeof( uint32_t ), ( void * ) queueStorage, &queueBuffer ); + + TEST_ASSERT_EQUAL( pdTRUE, xQueueGetStaticBuffers( xQueue, NULL, &pxStaticQueueRet ) ); + TEST_ASSERT_EQUAL( &queueBuffer, pxStaticQueueRet ); +} + +/** + * @brief xQueueGetStaticBuffers with a statically allocated queue. + * @details Test xQueueGetStaticBuffers returns the buffers of a statically allocated queue + * @coverage xQueueGetStaticBuffers xQueueGenericGetStaticBuffers + */ +void test_macro_xQueueGetStaticBuffers_static( void ) +{ + uint32_t queueStorage[ 5 ]; + StaticQueue_t queueBuffer; + uint8_t * pucQueueStorageRet = NULL; + StaticQueue_t * pxStaticQueueRet = NULL; + + QueueHandle_t xQueue = xQueueCreateStatic( 5, sizeof( uint32_t ), ( void * ) queueStorage, &queueBuffer ); + + TEST_ASSERT_EQUAL( pdTRUE, xQueueGetStaticBuffers( xQueue, &pucQueueStorageRet, &pxStaticQueueRet ) ); + TEST_ASSERT_EQUAL( queueStorage, ( uint32_t * ) pucQueueStorageRet ); + TEST_ASSERT_EQUAL( &queueBuffer, pxStaticQueueRet ); + + vQueueDelete( xQueue ); +} + +/** + * @brief xQueueGetStaticBuffers with a dynamically allocated queue. + * @details Test xQueueGetStaticBuffers returns an error when called on a dynamically allocated queue. + * @coverage xQueueGetStaticBuffers xQueueGenericGetStaticBuffers + */ +void test_macro_xQueueGetStaticBuffers_dynamic( void ) +{ + #if configSUPPORT_DYNAMIC_ALLOCATION == 1 + uint8_t * pucQueueStorageRet = NULL; + StaticQueue_t * pxStaticQueueRet = NULL; + + QueueHandle_t xQueue = xQueueCreate( 5, sizeof( uint32_t ) ); + + TEST_ASSERT_EQUAL( pdFALSE, xQueueGetStaticBuffers( xQueue, &pucQueueStorageRet, &pxStaticQueueRet ) ); + TEST_ASSERT_EQUAL( NULL, pucQueueStorageRet ); + TEST_ASSERT_EQUAL( NULL, pxStaticQueueRet ); + + vQueueDelete( xQueue ); + #endif /* configSUPPORT_DYNAMIC_ALLOCATION == 1 */ +} diff --git a/FreeRTOS/Test/CMock/queue/semaphore/Makefile b/FreeRTOS/Test/CMock/queue/semaphore/Makefile index 56fb180adb5..cf635ba249b 100644 --- a/FreeRTOS/Test/CMock/queue/semaphore/Makefile +++ b/FreeRTOS/Test/CMock/queue/semaphore/Makefile @@ -22,6 +22,7 @@ SUITE_UT_SRC += counting_semaphore_utest.c SUITE_UT_SRC += semaphore_common_utest.c SUITE_UT_SRC += mutex_utest.c SUITE_UT_SRC += recursive_mutex_utest.c +SUITE_UT_SRC += semaphore_get_static_buffer_utest.c # SUITE_SUPPORT_SRC: .c files used for testing that do not contain test cases. # Paths are relative to PROJECT_DIR diff --git a/FreeRTOS/Test/CMock/queue/semaphore/semaphore_get_static_buffer_utest.c b/FreeRTOS/Test/CMock/queue/semaphore/semaphore_get_static_buffer_utest.c new file mode 100644 index 00000000000..04b1509a2d4 --- /dev/null +++ b/FreeRTOS/Test/CMock/queue/semaphore/semaphore_get_static_buffer_utest.c @@ -0,0 +1,130 @@ +/* + * FreeRTOS V202212.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ +/*! @file semaphore_common_utest.c */ + +#include "../queue_utest_common.h" + +/* Queue includes */ +#include "FreeRTOS.h" +#include "FreeRTOSConfig.h" +#include "semphr.h" + + +/* ============================ GLOBAL VARIABLES =========================== */ + +/* ========================== CALLBACK FUNCTIONS =========================== */ + +/* ============================= Unity Fixtures ============================= */ + +void setUp( void ) +{ + commonSetUp(); +} + +void tearDown( void ) +{ + commonTearDown(); +} + +void suiteSetUp() +{ + commonSuiteSetUp(); +} + +int suiteTearDown( int numFailures ) +{ + return commonSuiteTearDown( numFailures ); +} + +/* =========================== Helper functions ============================ */ + +/* ============================== Test Cases =============================== */ + +/** + * @brief Test xSemaphoreGetStaticBuffer with an invalid SemaphoreHandle + * @coverage xSemaphoreGetStaticBuffer xQueueGenericGetStaticBuffers + */ +void test_macro_xSemaphoreGetStaticBuffer_null_handle( void ) +{ + StaticSemaphore_t * pxSemaphoreBufferRet = NULL; + + EXPECT_ASSERT_BREAK( xSemaphoreGetStaticBuffer( NULL, &pxSemaphoreBufferRet ) ); + + TEST_ASSERT_EQUAL( NULL, pxSemaphoreBufferRet ); +} + +/** + * @brief Test xSemaphoreGetStaticBuffer with a null ppxSemaphoreBuffer argument + * @coverage xSemaphoreGetStaticBuffer xQueueGenericGetStaticBuffers + */ +void test_macro_xSemaphoreGetStaticBuffer_null_ppxSemaphoreBuffer( void ) +{ + SemaphoreHandle_t xSemaphore = NULL; + StaticSemaphore_t xSemaphoreBuffer; + + xSemaphore = xSemaphoreCreateBinaryStatic( &xSemaphoreBuffer ); + + EXPECT_ASSERT_BREAK( xSemaphoreGetStaticBuffer( xSemaphore, NULL ) ); + + vSemaphoreDelete( xSemaphore ); +} + +/** + * @brief Test xSemaphoreGetStaticBuffer with a static Semaphore + * @details Test that xSemaphoreGetStaticBuffer returns the buffer of a statically allocated Semaphore + * @coverage xSemaphoreGetStaticBuffer xQueueGenericGetStaticBuffers + */ +void test_macro_xSemaphoreGetStaticBuffer_static( void ) +{ + SemaphoreHandle_t xSemaphore = NULL; + StaticSemaphore_t xSemaphoreBuffer; + StaticSemaphore_t * pxSemaphoreBufferRet = NULL; + + xSemaphore = xSemaphoreCreateBinaryStatic( &xSemaphoreBuffer ); + + TEST_ASSERT_EQUAL( pdTRUE, xSemaphoreGetStaticBuffer( xSemaphore, &pxSemaphoreBufferRet ) ); + TEST_ASSERT_EQUAL( &xSemaphoreBuffer, pxSemaphoreBufferRet ); + + vSemaphoreDelete( xSemaphore ); +} + +/** + * @brief Test xSemaphoreGetStaticBuffer with a dynamic Semaphore + * @details Test that xSemaphoreGetStaticBuffer returns an error when called on a dynamically allocated Semaphore + * @coverage xSemaphoreGetStaticBuffer xQueueGenericGetStaticBuffers + */ +void test_macro_xSemaphoreGetStaticBuffer_dynamic( void ) +{ + #if configSUPPORT_DYNAMIC_ALLOCATION == 1 + StaticSemaphore_t * pxSemaphoreBufferRet = NULL; + SemaphoreHandle_t xSemaphore = xSemaphoreCreateBinary(); + + TEST_ASSERT_EQUAL( pdFALSE, xSemaphoreGetStaticBuffer( xSemaphore, &pxSemaphoreBufferRet ) ); + TEST_ASSERT_EQUAL( NULL, pxSemaphoreBufferRet ); + + vSemaphoreDelete( xSemaphore ); + #endif /* configSUPPORT_DYNAMIC_ALLOCATION == 1 */ +} diff --git a/FreeRTOS/Test/CMock/queue/static/Makefile b/FreeRTOS/Test/CMock/queue/static/Makefile index b6ad9c42fd6..df490d0c24d 100644 --- a/FreeRTOS/Test/CMock/queue/static/Makefile +++ b/FreeRTOS/Test/CMock/queue/static/Makefile @@ -18,6 +18,7 @@ PROJECT_HEADER_DEPS += FreeRTOS.h # SUITE_UT_SRC: .c files that contain test cases (must end in _utest.c) SUITE_UT_SRC += queue_create_static_utest.c SUITE_UT_SRC += queue_delete_static_utest.c +SUITE_UT_SRC += queue_get_static_buffers_utest.c # SUITE_SUPPORT_SRC: .c files used for testing that do not contain test cases. # Paths are relative to PROJECT_DIR diff --git a/FreeRTOS/Test/CMock/queue/static/queue_get_static_buffers_utest.c b/FreeRTOS/Test/CMock/queue/static/queue_get_static_buffers_utest.c new file mode 120000 index 00000000000..2a829783295 --- /dev/null +++ b/FreeRTOS/Test/CMock/queue/static/queue_get_static_buffers_utest.c @@ -0,0 +1 @@ +../generic/queue_get_static_buffers_utest.c \ No newline at end of file diff --git a/FreeRTOS/Test/CMock/stream_buffer/api/stream_buffer_api_utest.c b/FreeRTOS/Test/CMock/stream_buffer/api/stream_buffer_api_utest.c index 7b650a30549..c077cb18870 100644 --- a/FreeRTOS/Test/CMock/stream_buffer/api/stream_buffer_api_utest.c +++ b/FreeRTOS/Test/CMock/stream_buffer/api/stream_buffer_api_utest.c @@ -1455,3 +1455,115 @@ void test_xStreamBufferSend_WrapOver( void ) vStreamBufferDelete( xStreamBuffer ); } + +/** + * @brief validate xStreamBufferGetStaticBuffers with a null xStreamBuffer argument + * @details Test that xStreamBufferGetStaticBuffers asserts when a null StreamBufferHandle_t is given. + */ +void test_xStreamBufferGetStaticBuffers_null_xStreamBuffer( void ) +{ + uint8_t * pucStreamBufferStorageAreaRet = NULL; + StaticStreamBuffer_t * pxStaticStreamBufferRet = NULL; + + EXPECT_ASSERT_BREAK( xStreamBufferGetStaticBuffers( NULL, &pucStreamBufferStorageAreaRet, &pxStaticStreamBufferRet ) ); + + validate_and_clear_assertions(); + + /* Assert that pucStreamBufferStorageAreaRet and pxStaticStreamBufferRet were not modified */ + TEST_ASSERT_EQUAL( NULL, pucStreamBufferStorageAreaRet ); + TEST_ASSERT_EQUAL( NULL, pxStaticStreamBufferRet ); +} + +/** + * @brief Test xStreamBufferGetStaticBuffers with a null ppxStaticStreamBuffer argument + * @details Test that xStreamBufferGetStaticBuffers asserts when a null ppxStaticStreamBuffer is given. + */ +void test_xStreamBufferGetStaticBuffers_null_ppxStaticStreamBuffer( void ) +{ + StreamBufferHandle_t xStreamBuffer = NULL; + StaticStreamBuffer_t streamBufferStruct; + + /* The size of stream buffer array should be one greater than the required size of stream buffer. */ + uint8_t streamBufferArray[ TEST_STREAM_BUFFER_SIZE + 1 ] = { 0 }; + + uint8_t * pucStreamBufferStorageAreaRet = NULL; + + xStreamBuffer = xStreamBufferCreateStatic( sizeof( streamBufferArray ), TEST_STREAM_BUFFER_TRIGGER_LEVEL, streamBufferArray, &streamBufferStruct ); + + EXPECT_ASSERT_BREAK( xStreamBufferGetStaticBuffers( xStreamBuffer, &pucStreamBufferStorageAreaRet, NULL ) ); + + validate_and_clear_assertions(); + + /* Assert that pucStreamBufferStorageAreaRet was not modified */ + TEST_ASSERT_EQUAL( NULL, pucStreamBufferStorageAreaRet ); + + vStreamBufferDelete( xStreamBuffer ); +} + +/** + * @brief Test xStreamBufferGetStaticBuffers with a null ppucStreamBufferStorageArea argument + * @details Test that xStreamBufferGetStaticBuffers asserts when a null ppucStreamBufferStorageArea is given. + */ +void test_xStreamBufferGetStaticBuffers_null_ppucStreamBufferStorageArea( void ) +{ + StreamBufferHandle_t xStreamBuffer = NULL; + StaticStreamBuffer_t streamBufferStruct; + + /* The size of stream buffer array should be one greater than the required size of stream buffer. */ + uint8_t streamBufferArray[ TEST_STREAM_BUFFER_SIZE + 1 ] = { 0 }; + StaticStreamBuffer_t * pxStaticStreamBufferRet = NULL; + + xStreamBuffer = xStreamBufferCreateStatic( sizeof( streamBufferArray ), TEST_STREAM_BUFFER_TRIGGER_LEVEL, streamBufferArray, &streamBufferStruct ); + + EXPECT_ASSERT_BREAK( xStreamBufferGetStaticBuffers( xStreamBuffer, NULL, &pxStaticStreamBufferRet ) ); + + validate_and_clear_assertions(); + + /* Assert that pxStaticStreamBufferRet was not modified */ + TEST_ASSERT_EQUAL( NULL, pxStaticStreamBufferRet ); + + vStreamBufferDelete( xStreamBuffer ); +} + +/** + * @brief validate xStreamBufferGetStaticBuffers on a statically created stream buffer + * @details Test xStreamBufferGetStaticBuffers returns the buffers of a statically created stream buffer + */ +void test_xStreamBufferGetStaticBuffers_static( void ) +{ + StreamBufferHandle_t xStreamBuffer = NULL; + StaticStreamBuffer_t streamBufferStruct; + + /* The size of stream buffer array should be one greater than the required size of stream buffer. */ + uint8_t streamBufferArray[ TEST_STREAM_BUFFER_SIZE + 1 ] = { 0 }; + uint8_t * pucStreamBufferStorageAreaRet = NULL; + StaticStreamBuffer_t * pxStaticStreamBufferRet = NULL; + + xStreamBuffer = xStreamBufferCreateStatic( sizeof( streamBufferArray ), TEST_STREAM_BUFFER_TRIGGER_LEVEL, streamBufferArray, &streamBufferStruct ); + + TEST_ASSERT_EQUAL( pdTRUE, xStreamBufferGetStaticBuffers( xStreamBuffer, &pucStreamBufferStorageAreaRet, &pxStaticStreamBufferRet ) ); + TEST_ASSERT_EQUAL( streamBufferArray, pucStreamBufferStorageAreaRet ); + TEST_ASSERT_EQUAL( &streamBufferStruct, pxStaticStreamBufferRet ); + + vStreamBufferDelete( xStreamBuffer ); +} + +/** + * @brief validate xStreamBufferGetStaticBuffers on a dynamically created stream buffer + * @details Test xStreamBufferGetStaticBuffers returns an error when called on a dynamically created stream buffer + */ +void test_xStreamBufferGetStaticBuffers_dynamic( void ) +{ + StreamBufferHandle_t xStreamBuffer = NULL; + uint8_t * pucStreamBufferStorageAreaRet = NULL; + StaticStreamBuffer_t * pxStaticStreamBufferRet = NULL; + + xStreamBuffer = xStreamBufferCreate( TEST_STREAM_BUFFER_SIZE, TEST_STREAM_BUFFER_TRIGGER_LEVEL ); + TEST_ASSERT_NOT_EQUAL( NULL, xStreamBuffer ); + + TEST_ASSERT_EQUAL( pdFALSE, xStreamBufferGetStaticBuffers( xStreamBuffer, &pucStreamBufferStorageAreaRet, &pxStaticStreamBufferRet ) ); + TEST_ASSERT_EQUAL( NULL, pucStreamBufferStorageAreaRet ); + TEST_ASSERT_EQUAL( NULL, pxStaticStreamBufferRet ); + + vStreamBufferDelete( xStreamBuffer ); +} diff --git a/FreeRTOS/Test/CMock/tasks/global_vars.h b/FreeRTOS/Test/CMock/tasks/global_vars.h index db5a6a9db0b..cfc64901148 100644 --- a/FreeRTOS/Test/CMock/tasks/global_vars.h +++ b/FreeRTOS/Test/CMock/tasks/global_vars.h @@ -71,22 +71,11 @@ typedef struct tskTaskControlBlock /* The old naming convention is used to #endif #if ( configGENERATE_RUN_TIME_STATS == 1 ) - uint32_t ulRunTimeCounter; /*< Stores the amount of time the task has spent in the Running state. */ + configRUN_TIME_COUNTER_TYPE ulRunTimeCounter; /*< Stores the amount of time the task has spent in the Running state. */ #endif - #if ( configUSE_NEWLIB_REENTRANT == 1 ) - - /* Allocate a Newlib reent structure that is specific to this task. - * Note Newlib support has been included by popular demand, but is not - * used by the FreeRTOS maintainers themselves. FreeRTOS is not - * responsible for resulting newlib operation. User must be familiar with - * newlib and must provide system-wide implementations of the necessary - * stubs. Be warned that (at the time of writing) the current newlib design - * implements a system-wide malloc() that must be provided with locks. - * - * See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html - * for additional information. */ - struct _reent xNewLib_reent; + #if ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) + configTLS_BLOCK_TYPE xTLSBlock; /**< Memory block used as Thread Local Storage (TLS) Block for the task. */ #endif #if ( configUSE_TASK_NOTIFICATIONS == 1 ) diff --git a/FreeRTOS/Test/CMock/tasks/tasks_1_utest.c b/FreeRTOS/Test/CMock/tasks/tasks_1_utest.c index ed2757eb729..90e3f2d2e51 100644 --- a/FreeRTOS/Test/CMock/tasks/tasks_1_utest.c +++ b/FreeRTOS/Test/CMock/tasks/tasks_1_utest.c @@ -5440,3 +5440,212 @@ void test_ulTaskGenericNotifyValueClear_success_null_handle() TEST_ASSERT_EQUAL( 2, task_to_notify->ulNotifiedValue[ uxIndexToClear ] ); } /* ---------- end testing configUSE_TASK_NOTIFICATIONS --------------- */ + +/* ---------------------- testing xTaskGetStaticBuffers ----------------------*/ + +/** + * @brief Test xTaskGetStaticBuffers with a static task + * @details Test xTaskGetStaticBuffers returns the buffers of a statically allocated task + * @coverage xTaskGetStaticBuffers + */ +void test_xTaskGetStaticBuffers_static_task( void ) +{ + StackType_t puxStackBuffer[ 300 ]; + StaticTask_t * pxTaskBuffer = malloc( sizeof( TCB_t ) ); + TaskFunction_t pxTaskCode = NULL; + const char * const pcName = { __FUNCTION__ }; + const uint32_t ulStackDepth = 300; + void * const pvParameters = NULL; + UBaseType_t uxPriority = 3; + TaskHandle_t xTaskHandle = NULL; + StackType_t * puxStackBufferRet = NULL; + StaticTask_t * pxTaskBufferRet = NULL; + + memset( puxStackBuffer, 0xa5U, ulStackDepth * sizeof( StackType_t ) ); + + vListInitialiseItem_ExpectAnyArgs(); + vListInitialiseItem_ExpectAnyArgs(); + + /* set owner */ + listSET_LIST_ITEM_VALUE_ExpectAnyArgs(); + /* set owner */ + pxPortInitialiseStack_ExpectAnyArgsAndReturn( puxStackBuffer ); + + for( int i = ( UBaseType_t ) 0U; i < ( UBaseType_t ) configMAX_PRIORITIES; i++ ) + { + vListInitialise_ExpectAnyArgs(); + } + + /* Delayed Task List 1 */ + vListInitialise_ExpectAnyArgs(); + /* Delayed Task List 2 */ + vListInitialise_ExpectAnyArgs(); + /* Pending Ready List */ + vListInitialise_ExpectAnyArgs(); + /* INCLUDE_vTaskDelete */ + vListInitialise_ExpectAnyArgs(); + /* INCLUDE_vTaskSuspend */ + vListInitialise_ExpectAnyArgs(); + + listINSERT_END_ExpectAnyArgs(); + + xTaskHandle = xTaskCreateStatic( pxTaskCode, + pcName, + ulStackDepth, + pvParameters, + uxPriority, + puxStackBuffer, + pxTaskBuffer ); + + + TEST_ASSERT_EQUAL( pdTRUE, xTaskGetStaticBuffers( xTaskHandle, &puxStackBufferRet, &pxTaskBufferRet ) ); + TEST_ASSERT_EQUAL( &puxStackBuffer, puxStackBufferRet ); + TEST_ASSERT_EQUAL( pxTaskBuffer, pxTaskBufferRet ); + + free( pxTaskBuffer ); +} + +/** + * @brief Test xTaskGetStaticBuffers with a dynamically allocated TCB but a statically allocated stack. + * @details Test xTaskGetStaticBuffers returns the buffers of a statically allocated task + * @coverage xTaskGetStaticBuffers + */ +void test_xTaskGetStaticBuffers_static_stack_dynamic_tcb( void ) +{ + StackType_t puxStackBuffer[ 300 ]; + StaticTask_t * pxTaskBuffer = malloc( sizeof( TCB_t ) ); + TaskFunction_t pxTaskCode = NULL; + const char * const pcName = { __FUNCTION__ }; + const uint32_t ulStackDepth = 300; + void * const pvParameters = NULL; + UBaseType_t uxPriority = 3; + TaskHandle_t xTaskHandle = NULL; + StackType_t * puxStackBufferRet = NULL; + StaticTask_t * pxTaskBufferRet = NULL; + + memset( puxStackBuffer, 0xa5U, ulStackDepth * sizeof( StackType_t ) ); + + vListInitialiseItem_ExpectAnyArgs(); + vListInitialiseItem_ExpectAnyArgs(); + + /* set owner */ + listSET_LIST_ITEM_VALUE_ExpectAnyArgs(); + /* set owner */ + pxPortInitialiseStack_ExpectAnyArgsAndReturn( puxStackBuffer ); + + for( int i = ( UBaseType_t ) 0U; i < ( UBaseType_t ) configMAX_PRIORITIES; i++ ) + { + vListInitialise_ExpectAnyArgs(); + } + + /* Delayed Task List 1 */ + vListInitialise_ExpectAnyArgs(); + /* Delayed Task List 2 */ + vListInitialise_ExpectAnyArgs(); + /* Pending Ready List */ + vListInitialise_ExpectAnyArgs(); + /* INCLUDE_vTaskDelete */ + vListInitialise_ExpectAnyArgs(); + /* INCLUDE_vTaskSuspend */ + vListInitialise_ExpectAnyArgs(); + + listINSERT_END_ExpectAnyArgs(); + + xTaskHandle = xTaskCreateStatic( pxTaskCode, + pcName, + ulStackDepth, + pvParameters, + uxPriority, + puxStackBuffer, + pxTaskBuffer ); + + /* Workaround since the portUSING_MPU_WRAPPERS == 1 config is not tested */ + ( ( TCB_t * ) xTaskHandle )->ucStaticallyAllocated = 1; + + TEST_ASSERT_EQUAL( pdTRUE, xTaskGetStaticBuffers( xTaskHandle, &puxStackBufferRet, &pxTaskBufferRet ) ); + TEST_ASSERT_EQUAL( &puxStackBuffer, puxStackBufferRet ); + TEST_ASSERT_EQUAL( NULL, pxTaskBufferRet ); + + free( pxTaskBuffer ); +} + +/** + * @brief Test xTaskGetStaticBuffers with a static task as the current task and a null task handle argument. + * @details Test xTaskGetStaticBuffers returns the buffers of a statically allocated task + * @coverage xTaskGetStaticBuffers + */ +void test_xTaskGetStaticBuffers_static_task_null_handle( void ) +{ + StackType_t puxStackBuffer[ 300 ]; + StaticTask_t * pxTaskBuffer = malloc( sizeof( TCB_t ) ); + TaskFunction_t pxTaskCode = NULL; + const char * const pcName = { __FUNCTION__ }; + const uint32_t ulStackDepth = 300; + void * const pvParameters = NULL; + UBaseType_t uxPriority = 3; + TaskHandle_t xTaskHandle = NULL; + StackType_t * puxStackBufferRet = NULL; + StaticTask_t * pxTaskBufferRet = NULL; + + memset( puxStackBuffer, 0xa5U, ulStackDepth * sizeof( StackType_t ) ); + + vListInitialiseItem_ExpectAnyArgs(); + vListInitialiseItem_ExpectAnyArgs(); + + /* set owner */ + listSET_LIST_ITEM_VALUE_ExpectAnyArgs(); + /* set owner */ + pxPortInitialiseStack_ExpectAnyArgsAndReturn( puxStackBuffer ); + + for( int i = ( UBaseType_t ) 0U; i < ( UBaseType_t ) configMAX_PRIORITIES; i++ ) + { + vListInitialise_ExpectAnyArgs(); + } + + /* Delayed Task List 1 */ + vListInitialise_ExpectAnyArgs(); + /* Delayed Task List 2 */ + vListInitialise_ExpectAnyArgs(); + /* Pending Ready List */ + vListInitialise_ExpectAnyArgs(); + /* INCLUDE_vTaskDelete */ + vListInitialise_ExpectAnyArgs(); + /* INCLUDE_vTaskSuspend */ + vListInitialise_ExpectAnyArgs(); + + listINSERT_END_ExpectAnyArgs(); + + xTaskHandle = xTaskCreateStatic( pxTaskCode, + pcName, + ulStackDepth, + pvParameters, + uxPriority, + puxStackBuffer, + pxTaskBuffer ); + + pxCurrentTCB = ( TCB_t * ) xTaskHandle; + + TEST_ASSERT_EQUAL( pdTRUE, xTaskGetStaticBuffers( NULL, &puxStackBufferRet, &pxTaskBufferRet ) ); + TEST_ASSERT_EQUAL( &puxStackBuffer, puxStackBufferRet ); + TEST_ASSERT_EQUAL( pxTaskBuffer, pxTaskBufferRet ); + + free( pxTaskBuffer ); +} + +/** + * @brief Test xTaskGetStaticBuffers with a dynamic task + * @details Test xTaskGetStaticBuffers returns an error when called on a dynamically allocated task + * @coverage xTaskGetStaticBuffers + */ +void test_xTaskGetStaticBuffers_dynamic_task( void ) +{ + StackType_t * puxStackBufferRet = NULL; + StaticTask_t * pxTaskBufferRet = NULL; + TaskHandle_t taskHandle = create_task(); + + TEST_ASSERT_EQUAL( pdFALSE, xTaskGetStaticBuffers( taskHandle, &puxStackBufferRet, &pxTaskBufferRet ) ); + TEST_ASSERT_EQUAL( NULL, puxStackBufferRet ); + TEST_ASSERT_EQUAL( NULL, pxTaskBufferRet ); +} + +/* -------------------- end testing xTaskGetStaticBuffers --------------------*/ diff --git a/FreeRTOS/Test/CMock/timers/FreeRTOSConfig_1.h b/FreeRTOS/Test/CMock/timers/FreeRTOSConfig_1.h index 41a6047706b..bad96bbce7b 100644 --- a/FreeRTOS/Test/CMock/timers/FreeRTOSConfig_1.h +++ b/FreeRTOS/Test/CMock/timers/FreeRTOSConfig_1.h @@ -72,7 +72,7 @@ #define configUSE_TASK_NOTIFICATIONS 1 #define configTASK_NOTIFICATION_ARRAY_ENTRIES 5 #define configSUPPORT_STATIC_ALLOCATION 1 -#define configSUPPORT_DYNAMIC_ALLOCATION 0 +#define configSUPPORT_DYNAMIC_ALLOCATION 1 #define configINITIAL_TICK_COUNT ( ( TickType_t ) 0 ) /* For test. */ #define configSTREAM_BUFFER_TRIGGER_LEVEL_TEST_MARGIN 1 /* As there are a lot of tasks running. */ diff --git a/FreeRTOS/Test/CMock/timers/timers_1_utest.c b/FreeRTOS/Test/CMock/timers/timers_1_utest.c index 04d74e757f3..e78ce6768df 100644 --- a/FreeRTOS/Test/CMock/timers/timers_1_utest.c +++ b/FreeRTOS/Test/CMock/timers/timers_1_utest.c @@ -1784,3 +1784,63 @@ void test_timer_function_success_wrap_timer( void ) /* Validations */ TEST_ASSERT_EQUAL( 1, *retVal ); } + +void test_xTimerGetStaticBuffer_static( void ) +{ + TimerHandle_t ret_timer_create; + UBaseType_t pvTimerID; + StaticTimer_t pxTimerBuffer[ sizeof( StaticTimer_t ) ]; + StaticTimer_t * pxTimerBufferRet = NULL; + + /* Setup */ + /* Expectations */ + /* prvInitialiseNewTimer */ + /* prvCheckForValidListAndQueue */ + vListInitialise_ExpectAnyArgs(); + vListInitialise_ExpectAnyArgs(); + xQueueGenericCreateStatic_ExpectAnyArgsAndReturn( NULL ); + /* Back prvInitialiseNewTimer */ + vListInitialiseItem_ExpectAnyArgs(); + + /* API Call */ + ret_timer_create = xTimerCreateStatic( "ut_timer_task", + pdMS_TO_TICKS( 1000 ), + pdTRUE, + ( void * ) &pvTimerID, + xCallback_Test, + pxTimerBuffer ); + + TEST_ASSERT_EQUAL( pdTRUE, xTimerGetStaticBuffer( ret_timer_create, &pxTimerBufferRet ) ); + TEST_ASSERT_EQUAL( pxTimerBuffer, pxTimerBufferRet ); +} + +void test_xTimerGetStaticBuffer_dynamic( void ) +{ + TimerHandle_t xTimer = NULL; + UBaseType_t pvTimerID = 0; + Timer_t pxNewTimer = { 0 }; + StaticTimer_t * pxTimerBufferRet = NULL; + + pvPortMalloc_ExpectAndReturn( sizeof( Timer_t ), &pxNewTimer ); + + /* Setup */ + /* Expectations */ + /* prvInitialiseNewTimer */ + /* prvCheckForValidListAndQueue */ + vListInitialise_ExpectAnyArgs(); + vListInitialise_ExpectAnyArgs(); + xQueueGenericCreateStatic_ExpectAnyArgsAndReturn( NULL ); + /* Back prvInitialiseNewTimer */ + vListInitialiseItem_ExpectAnyArgs(); + + + /* API Call */ + xTimer = xTimerCreate( "ut_timer_task", + pdMS_TO_TICKS( 1000 ), + pdTRUE, + ( void * ) &pvTimerID, + xCallback_Test ); + + TEST_ASSERT_EQUAL( pdFALSE, xTimerGetStaticBuffer( xTimer, &pxTimerBufferRet ) ); + TEST_ASSERT_EQUAL( NULL, pxTimerBufferRet ); +}