From 88857ee150682d3005427fd3a1e8f9c6c07321a1 Mon Sep 17 00:00:00 2001 From: Gaurav-Aggarwal-AWS <33462878+aggarg@users.noreply.github.com> Date: Wed, 15 Dec 2021 22:28:51 -0800 Subject: Update FreeRTOS-Kernel submodule pointer to 10.4.6 (#740) * Bring FreeRTOS-Kernel submodule pointer to V10.4.6 Signed-off-by: Gaurav Aggarwal * Remove C89 flag from tests Signed-off-by: Gaurav Aggarwal * Revert "UT: Add streambuffer test to make PR #391 pass (#690)" This reverts commit a86178136d66296adf0d0612bc5f734f00c43637. --- FreeRTOS/Source | 2 +- FreeRTOS/Test/CMock/message_buffer/Makefile | 46 +- .../CMock/message_buffer/message_buffer/Makefile | 45 -- .../message_buffer/message_buffer_utest.c | 800 --------------------- .../CMock/message_buffer/message_buffer_utest.c | 800 +++++++++++++++++++++ .../message_buffer/size_mismatch/FreeRTOSConfig.h | 142 ---- .../CMock/message_buffer/size_mismatch/Makefile | 45 -- .../size_mismatch/message_buffer_utest.c | 223 ------ FreeRTOS/Test/CMock/testdir.mk | 2 +- manifest.yml | 2 +- 10 files changed, 840 insertions(+), 1267 deletions(-) delete mode 100644 FreeRTOS/Test/CMock/message_buffer/message_buffer/Makefile delete mode 100644 FreeRTOS/Test/CMock/message_buffer/message_buffer/message_buffer_utest.c create mode 100644 FreeRTOS/Test/CMock/message_buffer/message_buffer_utest.c delete mode 100644 FreeRTOS/Test/CMock/message_buffer/size_mismatch/FreeRTOSConfig.h delete mode 100644 FreeRTOS/Test/CMock/message_buffer/size_mismatch/Makefile delete mode 100644 FreeRTOS/Test/CMock/message_buffer/size_mismatch/message_buffer_utest.c diff --git a/FreeRTOS/Source b/FreeRTOS/Source index e13f99038..a4b28e351 160000 --- a/FreeRTOS/Source +++ b/FreeRTOS/Source @@ -1 +1 @@ -Subproject commit e13f9903850a57ed5cdf3fc330f5faf4d3096d1b +Subproject commit a4b28e35103d699edf074dfff4835921b481b301 diff --git a/FreeRTOS/Test/CMock/message_buffer/Makefile b/FreeRTOS/Test/CMock/message_buffer/Makefile index ff0c83ee3..a8dd6cccd 100644 --- a/FreeRTOS/Test/CMock/message_buffer/Makefile +++ b/FreeRTOS/Test/CMock/message_buffer/Makefile @@ -1,15 +1,43 @@ -# Indent with spaces +# indent with spaces .RECIPEPREFIX := $(.RECIPEPREFIX) $(.RECIPEPREFIX) + # Do not move this line below the include -MAKEFILE_ABSPATH := $(abspath $(lastword $(MAKEFILE_LIST))) +MAKEFILE_ABSPATH := $(abspath $(lastword $(MAKEFILE_LIST))) include ../makefile.in -# SUITES lists the suites contained in subdirectories of this directory -SUITES += size_mismatch -SUITES += message_buffer +# PROJECT_SRC lists the .c files under test +PROJECT_SRC := stream_buffer.c + +# PROJECT_DEPS_SRC list the .c file that are dependencies of PROJECT_SRC files +# Files in PROJECT_DEPS_SRC are excluded from coverage measurements +PROJECT_DEPS_SRC := + +# PROJECT_HEADER_DEPS: headers that should be excluded from coverage measurements. +PROJECT_HEADER_DEPS := FreeRTOS.h + +# SUITE_UT_SRC: .c files that contain test cases (must end in _utest.c) +SUITE_UT_SRC := message_buffer_utest.c + +# SUITE_SUPPORT_SRC: .c files used for testing that do not contain test cases. +# Paths are relative to PROJECT_DIR +SUITE_SUPPORT_SRC := + +# List the headers used by PROJECT_SRC that you would like to mock +MOCK_FILES_FP := $(KERNEL_DIR)/include/task.h +MOCK_FILES_FP += $(UT_ROOT_DIR)/config/fake_assert.h +MOCK_FILES_FP += $(UT_ROOT_DIR)/config/fake_port.h + +# List any addiitonal flags needed by the preprocessor +CPPFLAGS += -DportUSING_MPU_WRAPPERS=0 + +# List any addiitonal flags needed by the compiler +CFLAGS += + +# Try not to edit beyond this line unless necessary. + +# Project is determined based on path: $(UT_ROOT_DIR)/$(PROJECT) +PROJECT := $(lastword $(subst /, ,$(dir $(abspath $(MAKEFILE_ABSPATH))))) -# PROJECT and SUITE variables are determined based on path like so: -# $(UT_ROOT_DIR)/$(PROJECT)/$(SUITE) -PROJECT := $(lastword $(subst /, ,$(dir $(abspath $(MAKEFILE_ABSPATH))))) +export -include ../subdir.mk +include ../testdir.mk diff --git a/FreeRTOS/Test/CMock/message_buffer/message_buffer/Makefile b/FreeRTOS/Test/CMock/message_buffer/message_buffer/Makefile deleted file mode 100644 index 44f03aa94..000000000 --- a/FreeRTOS/Test/CMock/message_buffer/message_buffer/Makefile +++ /dev/null @@ -1,45 +0,0 @@ -# Indent with spaces -.RECIPEPREFIX := $(.RECIPEPREFIX) $(.RECIPEPREFIX) - -# Do not move this line below the include -MAKEFILE_ABSPATH := $(abspath $(lastword $(MAKEFILE_LIST))) -include ../../makefile.in - -# PROJECT_SRC lists the .c files under test -PROJECT_SRC += stream_buffer.c - -# PROJECT_DEPS_SRC list the .c file that are dependencies of PROJECT_SRC files -# Files in PROJECT_DEPS_SRC are excluded from coverage measurements -PROJECT_DEPS_SRC += list.c - -# PROJECT_HEADER_DEPS: headers that should be excluded from coverage measurements. -PROJECT_HEADER_DEPS += FreeRTOS.h - -# SUITE_UT_SRC: .c files that contain test cases (must end in _utest.c) -SUITE_UT_SRC += message_buffer_utest.c - -# SUITE_SUPPORT_SRC: .c files used for testing that do not contain test cases. -# Paths are relative to PROJECT_DIR -SUITE_SUPPORT_SRC += - -# List the headers used by PROJECT_SRC that you would like to mock -MOCK_FILES_FP += $(KERNEL_DIR)/include/task.h -MOCK_FILES_FP += $(UT_ROOT_DIR)/config/fake_assert.h -MOCK_FILES_FP += $(UT_ROOT_DIR)/config/fake_port.h - -# List any addiitonal flags needed by the preprocessor -CPPFLAGS += -DportUSING_MPU_WRAPPERS=0 - -# List any addiitonal flags needed by the compiler -CFLAGS += - -# Try not to edit beyond this line unless necessary. - -# Project / Suite are determined based on path: $(UT_ROOT_DIR)/$(PROJECT)/$(SUITE) -PROJECT := $(lastword $(subst /, ,$(dir $(abspath $(MAKEFILE_ABSPATH)/../)))) -SUITE := $(lastword $(subst /, ,$(dir $(MAKEFILE_ABSPATH)))) - -# Make variables available to included makefile -export - -include ../../testdir.mk 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 deleted file mode 100644 index 2df5d52ef..000000000 --- a/FreeRTOS/Test/CMock/message_buffer/message_buffer/message_buffer_utest.c +++ /dev/null @@ -1,800 +0,0 @@ -/* - * FreeRTOS V202111.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 message_buffer_utest.c */ - -/* C runtime includes. */ -#include -#include - -/* Message Buffer includes */ -#include "FreeRTOS.h" -#include "FreeRTOSConfig.h" -#include "message_buffer.h" - -/* Test includes. */ -#include "unity.h" -#include "unity_memory.h" -#include "CException.h" - -/* Mock includes. */ -#include "mock_task.h" -#include "mock_fake_assert.h" -#include "mock_fake_port.h" - -/** - * @brief Sample size in bytes of the message buffer used for test. - * Keep it short enough so that they can be allocated on stack. - */ -#define TEST_MESSAGE_BUFFER_SIZE ( 64U ) - -/** - * @brief Minimum size required to store the length of the message. - */ -#define TEST_MESSAGE_METADATA_SIZE ( sizeof( configMESSAGE_BUFFER_LENGTH_TYPE ) ) - -/** - * @brief Maximum size of a message that can be sent to a message buffer. - * Each message stores an associated length of the message as metadata. So maximum message - * size at any time is total length - size of the variable used to store length. - */ -#define TEST_MAX_MESSAGE_SIZE ( TEST_MESSAGE_BUFFER_SIZE - TEST_MESSAGE_METADATA_SIZE ) - -/** - * @brief Maximum unsigned long value so as to trigger an integer overflow. - */ -#define TEST_MESSAGE_BUFFER_MAX_UINT_SIZE ( ~( size_t ) ( 0UL ) ) - -/** - * @brief Ticks to wait from tests if the message buffer is full while sending data or - * below trigger level while receiving data. - */ -#define TEST_MESSAGE_BUFFER_WAIT_TICKS ( 1000U ) - -/** - * @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(); \ - } \ - Catch( e ) \ - { \ - TEST_ASSERT_EQUAL( configASSERT_E, e ); \ - } \ - } while( 0 ) - -/* ============================ GLOBAL VARIABLES =========================== */ - -/** - * @brief Global counter for the number of assertions in code. - */ -static int assertionFailed = 0; - -/** - * @brief Global counter to keep track of how many times a sender task was woken up by a task receiving from the stream buffer. - */ -static int senderTaskWoken = 0; - -/** - * @brief Global counter to keep track of how many times a receiver task was woken up by a task sending to the buffer. - */ -static int receiverTaskWoken = 0; - -/** - * @brief Dummy sender task handle to which the stream buffer receive APIs will send notification. - */ -static TaskHandle_t senderTask = ( TaskHandle_t ) ( 0xAABBCCDD ); - -/** - * @brief Dummy receiver task handle to which the stream buffer send APIs will send notifications. - */ -static TaskHandle_t receiverTask = ( TaskHandle_t ) ( 0xABCDEEFF ); - -/** - * @brief Global message buffer handle used for tests. - */ -static MessageBufferHandle_t xMessageBuffer; - -/** - * @brief Flag which denotes if test need to abort on assertion. - */ -static BaseType_t shouldAbortOnAssertion; - -/* ========================== CALLBACK FUNCTIONS =========================== */ - -void * pvPortMalloc( size_t xSize ) -{ - return unity_malloc( xSize ); -} -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 ); - } - } -} - -static BaseType_t senderTaskNotificationCallback( TaskHandle_t xTaskToNotify, - UBaseType_t uxIndexToNotify, - uint32_t ulValue, - eNotifyAction eAction, - uint32_t * pulPreviousNotificationValue, - int cmock_num_calls ) -{ - TEST_ASSERT_EQUAL( senderTask, xTaskToNotify ); - senderTaskWoken++; - return pdTRUE; -} - -static BaseType_t messageBufferReceiveFromISRCallback( UBaseType_t uxIndexToWaitOn, - uint32_t ulBitsToClearOnEntry, - uint32_t ulBitsToClearOnExit, - uint32_t * pulNotificationValue, - TickType_t xTicksToWait, - int cmock_num_calls ) -{ - uint8_t data[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; - size_t dataReceived = 0; - BaseType_t senderTaskWokenFromISR = pdFALSE; - - dataReceived = xMessageBufferReceiveFromISR( xMessageBuffer, data, TEST_MAX_MESSAGE_SIZE, &senderTaskWokenFromISR ); - TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, dataReceived ); - return pdTRUE; -} - -static BaseType_t messageBufferReceiveCallback( UBaseType_t uxIndexToWaitOn, - uint32_t ulBitsToClearOnEntry, - uint32_t ulBitsToClearOnExit, - uint32_t * pulNotificationValue, - TickType_t xTicksToWait, - int cmock_num_calls ) -{ - uint8_t data[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; - size_t dataReceived = 0; - - /* Read next message from message buffer to wake up sender task. */ - dataReceived = xMessageBufferReceive( xMessageBuffer, data, TEST_MAX_MESSAGE_SIZE, 0 ); - TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, dataReceived ); - return pdTRUE; -} - -static BaseType_t messageBufferSendFromISRCallback( UBaseType_t uxIndexToWaitOn, - uint32_t ulBitsToClearOnEntry, - uint32_t ulBitsToClearOnExit, - uint32_t * pulNotificationValue, - TickType_t xTicksToWait, - int cmock_num_calls ) -{ - BaseType_t receiverTaskWokenFromISR = pdFALSE; - uint8_t data[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; - size_t dataSent = 0; - - dataSent = xMessageBufferSendFromISR( xMessageBuffer, data, TEST_MAX_MESSAGE_SIZE, &receiverTaskWokenFromISR ); - TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, dataSent ); - return pdTRUE; -} - -static BaseType_t messageBufferSendCallback( UBaseType_t uxIndexToWaitOn, - uint32_t ulBitsToClearOnEntry, - uint32_t ulBitsToClearOnExit, - uint32_t * pulNotificationValue, - TickType_t xTicksToWait, - int cmock_num_calls ) -{ - uint8_t data[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; - size_t dataSent = 0; - - /* Send a single message of max message size to message buffer to wake up receiver Task. */ - dataSent = xMessageBufferSend( xMessageBuffer, data, TEST_MAX_MESSAGE_SIZE, 0 ); - TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, dataSent ); - return pdTRUE; -} - -static BaseType_t receiverTaskNotificationCallback( TaskHandle_t xTaskToNotify, - UBaseType_t uxIndexToNotify, - uint32_t ulValue, - eNotifyAction eAction, - uint32_t * pulPreviousNotificationValue, - int cmock_num_calls ) -{ - TEST_ASSERT_EQUAL( receiverTask, xTaskToNotify ); - receiverTaskWoken++; - return pdTRUE; -} - -/******************************************************************************* - * Unity fixtures - ******************************************************************************/ -void setUp( void ) -{ - assertionFailed = 0; - xMessageBuffer = NULL; - senderTaskWoken = 0; - receiverTaskWoken = 0; - shouldAbortOnAssertion = pdTRUE; - - mock_task_Init(); - mock_fake_assert_Init(); - mock_fake_port_Init(); - - vFakePortEnterCriticalSection_Ignore(); - vFakePortExitCriticalSection_Ignore(); - ulFakePortSetInterruptMaskFromISR_IgnoreAndReturn( 0U ); - vFakePortClearInterruptMaskFromISR_Ignore(); - vFakeAssert_StubWithCallback( vFakeAssertStub ); - /* Track calls to malloc / free */ - UnityMalloc_StartTest(); -} - -/*! called before each test case */ -void tearDown( void ) -{ - TEST_ASSERT_EQUAL_MESSAGE( 0, assertionFailed, "Assertion check failed in code." ); - UnityMalloc_EndTest(); - - mock_task_Verify(); - mock_task_Destroy(); - - mock_fake_assert_Verify(); - mock_fake_assert_Destroy(); - - mock_fake_port_Verify(); - mock_fake_port_Destroy(); -} - -/*! called at the beginning of the whole suite */ -void suiteSetUp() -{ -} - -/*! called at the end of the whole suite */ -int suiteTearDown( int numFailures ) -{ - return numFailures; -} - -static void validate_message_buffer_init_state( MessageBufferHandle_t xMessageBuffer, - size_t bufferSize ) -{ - TEST_ASSERT_TRUE( xMessageBufferIsEmpty( xMessageBuffer ) ); - TEST_ASSERT_FALSE( xMessageBufferIsFull( xMessageBuffer ) ); - TEST_ASSERT_EQUAL( bufferSize, xMessageBufferSpacesAvailable( xMessageBuffer ) ); - TEST_ASSERT_EQUAL( 0, xStreamBufferNextMessageLengthBytes( xMessageBuffer ) ); - TEST_ASSERT_EQUAL( 1, ucStreamBufferGetStreamBufferType( xMessageBuffer ) ); -} - -static void validate_and_clear_assertions( void ) -{ - TEST_ASSERT_EQUAL( 1, assertionFailed ); - assertionFailed = 0; -} - -/* ============================== Test Cases ============================== */ - -/** - * @brief Validates that message buffer of sample test size is created successfully. - */ -void test_xMessageBufferCreate_success( void ) -{ - xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); - TEST_ASSERT_NOT_EQUAL( NULL, xMessageBuffer ); - validate_message_buffer_init_state( xMessageBuffer, TEST_MESSAGE_BUFFER_SIZE ); - vMessageBufferDelete( xMessageBuffer ); -} - -/** - * @brief API should fail and return null if there is an integer overflow in message buffer size passed. - */ -void test_xMessageBufferCreate_integer_overflow( void ) -{ - xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_MAX_UINT_SIZE ); - TEST_ASSERT_EQUAL( NULL, xMessageBuffer ); -} - -/** - * @brief API should fail and return null if the malloc fails. - */ -void test_xMessageBufferCreate_malloc_fail( void ) -{ - UnityMalloc_MakeMallocFailAfterCount( 0 ); - xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); - TEST_ASSERT_NULL( xMessageBuffer ); -} - -/** - * @brief Should assert if a zero size is passed to create API. - */ -void test_xMessageBufferCreate_zero_size( void ) -{ - EXPECT_ASSERT_BREAK( ( void ) xMessageBufferCreate( 0 ) ); - - validate_and_clear_assertions(); -} - -/** - * @brief Should assert if the size passed is less than the minimum size required to store metadata size. - */ -void test_xMessageBufferCreate_invalid_size( void ) -{ - EXPECT_ASSERT_BREAK( ( void ) xMessageBufferCreate( TEST_MESSAGE_METADATA_SIZE ) ); - - validate_and_clear_assertions(); -} - -/** - * @brief Validates message buffer creation through a static buffer allocated by the user. - */ -void test_xMessageBufferCreateStatic_success( void ) -{ - StaticMessageBuffer_t messageBufferStruct; - /* The size of message buffer array should be one greater than the required size of message buffer. */ - uint8_t messageBufferArray[ TEST_MESSAGE_BUFFER_SIZE + 1 ] = { 0 }; - - xMessageBuffer = xMessageBufferCreateStatic( sizeof( messageBufferArray ), messageBufferArray, &messageBufferStruct ); - TEST_ASSERT_NOT_NULL( xMessageBuffer ); - - validate_message_buffer_init_state( xMessageBuffer, TEST_MESSAGE_BUFFER_SIZE ); - - vStreamBufferDelete( xMessageBuffer ); -} - -/** - * @brief Validates message buffer creation fails if null array is passed. - */ -void test_xMessageBufferCreateStatic_null_array( void ) -{ - StaticMessageBuffer_t messageBufferStruct; - - /* Tests should abort if assertion is enabled or return NULL. */ - shouldAbortOnAssertion = pdFALSE; - - /* Returns NULL when NULL storage area is passed as a parameter. */ - xMessageBuffer = xMessageBufferCreateStatic( TEST_MESSAGE_BUFFER_SIZE, NULL, &messageBufferStruct ); - TEST_ASSERT_NULL( xMessageBuffer ); - - validate_and_clear_assertions(); -} - -/** - * @brief Validates message buffer creation fails if NULL struct is passed. - */ -void test_xMessageBufferCreateStatic_null_struct( void ) -{ - /* The size of message buffer array should be one greater than the required size of message buffer. */ - uint8_t messageBufferArray[ TEST_MESSAGE_BUFFER_SIZE + 1 ] = { 0 }; - - /* Tests should abort if assertion is enabled or return NULL. */ - shouldAbortOnAssertion = pdFALSE; - - /* Returns NULL when NULL message buffer struct is passed as a parameter. */ - xMessageBuffer = xMessageBufferCreateStatic( sizeof( messageBufferArray ), messageBufferArray, NULL ); - TEST_ASSERT_NULL( xMessageBuffer ); - - validate_and_clear_assertions(); -} - -/** - * @brief Validates message buffer create assert if the size passed is less than the minimum size required to store metadata size. - */ -void test_xMessageBufferCreateStatic_invalid_size( void ) -{ - StaticMessageBuffer_t messageBufferStruct; - /* The size of message buffer array should be one greater than the required size of message buffer. */ - uint8_t messageBufferArray[ TEST_MESSAGE_BUFFER_SIZE + 1 ] = { 0 }; - - EXPECT_ASSERT_BREAK( ( void ) xMessageBufferCreateStatic( TEST_MESSAGE_METADATA_SIZE, messageBufferArray, &messageBufferStruct ) ); - - validate_and_clear_assertions(); -} - -/** - * @brief Validate message buffer creation asserts if the size passed is zero. - */ -void test_xMessageBufferCreateStatic_zero_size( void ) -{ - StaticMessageBuffer_t messageBufferStruct; - /* The size of message buffer array should be one greater than the required size of message buffer. */ - uint8_t messageBufferArray[ TEST_MESSAGE_BUFFER_SIZE + 1 ] = { 0 }; - - EXPECT_ASSERT_BREAK( ( void ) xMessageBufferCreateStatic( 0, messageBufferArray, &messageBufferStruct ) ); - - validate_and_clear_assertions(); -} - -/** - * @brief Validates a task is able to send upto maximum message size allowed, without blocking. - */ -void test_xMessageBufferSend_success( void ) -{ - uint8_t data[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; - size_t dataSent = 0; - - vTaskSetTimeOutState_Ignore(); - vTaskSuspendAll_Ignore(); - xTaskResumeAll_IgnoreAndReturn( pdTRUE ); - - /* Create a message buffer of the default test sample size. */ - xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); - TEST_ASSERT_NOT_NULL( xMessageBuffer ); - TEST_ASSERT_EQUAL( TEST_MESSAGE_BUFFER_SIZE, xMessageBufferSpacesAvailable( xMessageBuffer ) ); - - /* Sending bytes of size upto to available size should succeed. Sender task should not be in blocked state. */ - dataSent = xMessageBufferSend( xMessageBuffer, data, TEST_MAX_MESSAGE_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ); - TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, dataSent ); - TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, xStreamBufferNextMessageLengthBytes( xMessageBuffer ) ); - TEST_ASSERT_EQUAL( pdFALSE, xMessageBufferIsEmpty( xMessageBuffer ) ); - - vStreamBufferDelete( xMessageBuffer ); -} - -/** - * @brief An integer overflow in message size to be sent should result in an - * assertion failure - */ -void test_xMessageBufferSend_message_size_integer_overflow( void ) -{ - uint8_t data[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; - - vTaskSetTimeOutState_Ignore(); - vTaskSuspendAll_Ignore(); - xTaskResumeAll_IgnoreAndReturn( pdTRUE ); - - /* Create a message buffer of the default test sample size. */ - xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); - TEST_ASSERT_NOT_NULL( xMessageBuffer ); - - EXPECT_ASSERT_BREAK( ( void ) xMessageBufferSend( xMessageBuffer, data, TEST_MESSAGE_BUFFER_MAX_UINT_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ) ); - - validate_and_clear_assertions(); - - vStreamBufferDelete( xMessageBuffer ); -} - -/** - * Sending a message of size greater than available size should return zero bytes sent. - */ -void test_xMessageBufferSend_message_larger_than_available_size( void ) -{ - uint8_t message[ TEST_MAX_MESSAGE_SIZE + 1 ] = { 0 }; - size_t sentBytes = 0; - - vTaskSetTimeOutState_Ignore(); - vTaskSuspendAll_Ignore(); - xTaskResumeAll_IgnoreAndReturn( pdTRUE ); - - /* Create a message buffer of sample size. */ - xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); - TEST_ASSERT_NOT_NULL( xMessageBuffer ); - TEST_ASSERT_EQUAL( TEST_MESSAGE_BUFFER_SIZE, xMessageBufferSpacesAvailable( xMessageBuffer ) ); - - sentBytes = xMessageBufferSend( xMessageBuffer, message, TEST_MAX_MESSAGE_SIZE + 1, TEST_MESSAGE_BUFFER_WAIT_TICKS ); - TEST_ASSERT_EQUAL( 0, sentBytes ); - TEST_ASSERT_EQUAL( TEST_MESSAGE_BUFFER_SIZE, xMessageBufferSpacesAvailable( xMessageBuffer ) ); - - vStreamBufferDelete( xMessageBuffer ); -} - -/** - * @brief Sending null message should trigger an assert. - */ -void test_xMessageBufferSend_null_message( void ) -{ - vTaskSetTimeOutState_Ignore(); - vTaskSuspendAll_Ignore(); - xTaskResumeAll_IgnoreAndReturn( pdTRUE ); - - /* Create a message buffer of sample size. */ - xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); - TEST_ASSERT_NOT_NULL( xMessageBuffer ); - - EXPECT_ASSERT_BREAK( ( void ) xMessageBufferSend( xMessageBuffer, NULL, TEST_MAX_MESSAGE_SIZE + 1, TEST_MESSAGE_BUFFER_WAIT_TICKS ) ); - - validate_and_clear_assertions(); - - vStreamBufferDelete( xMessageBuffer ); -} - -/** - * @brief Sending to a null message buffer should trigger an assert. - */ -void test_xMessageBufferSend_null_message_buffer( void ) -{ - uint8_t message[ TEST_MAX_MESSAGE_SIZE + 1 ] = { 0 }; - - vTaskSetTimeOutState_Ignore(); - vTaskSuspendAll_Ignore(); - xTaskResumeAll_IgnoreAndReturn( pdTRUE ); - - /* Create a message buffer of sample size. */ - xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); - TEST_ASSERT_NOT_NULL( xMessageBuffer ); - - EXPECT_ASSERT_BREAK( ( void ) xMessageBufferSend( NULL, message, TEST_MAX_MESSAGE_SIZE + 1, TEST_MESSAGE_BUFFER_WAIT_TICKS ) ); - - validate_and_clear_assertions(); - - vStreamBufferDelete( xMessageBuffer ); -} - -/** - * @brief Validates that a task blocks if there is insufficient space in message buffer for a valid message to be sent. - * Task then succeeds once enough space is available by reading from the message buffer. - */ -void test_xMessageBufferSend_blocking( void ) -{ - uint8_t message[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; - size_t sentBytes = 0; - - vTaskSetTimeOutState_Ignore(); - xTaskGenericNotifyStateClear_IgnoreAndReturn( pdTRUE ); - xTaskGetCurrentTaskHandle_IgnoreAndReturn( senderTask ); - xTaskGenericNotifyWait_StubWithCallback( messageBufferReceiveCallback ); - xTaskGenericNotify_StubWithCallback( senderTaskNotificationCallback ); - xTaskCheckForTimeOut_IgnoreAndReturn( pdFALSE ); - vTaskSuspendAll_Ignore(); - xTaskResumeAll_IgnoreAndReturn( pdTRUE ); - - /* Create a message buffer of sample size. */ - xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); - TEST_ASSERT_NOT_NULL( xMessageBuffer ); - TEST_ASSERT_EQUAL( TEST_MESSAGE_BUFFER_SIZE, xMessageBufferSpacesAvailable( xMessageBuffer ) ); - - /* Sending max message size so that message buffer is full. */ - sentBytes = xMessageBufferSend( xMessageBuffer, message, TEST_MAX_MESSAGE_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ); - TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, sentBytes ); - TEST_ASSERT_EQUAL( 0, xMessageBufferSpacesAvailable( xMessageBuffer ) ); - - /* Sending max message size again blocks the task. API succeeds after reading the current message from the buffer. */ - sentBytes = xMessageBufferSend( xMessageBuffer, message, TEST_MAX_MESSAGE_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ); - TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, sentBytes ); - TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, xStreamBufferNextMessageLengthBytes( xMessageBuffer ) ); - TEST_ASSERT_EQUAL( 1, senderTaskWoken ); - - vStreamBufferDelete( xMessageBuffer ); -} - -/** - * @brief Validates a task is able to receive upto maximum message size allowed, without blocking. - */ -void test_xMessageBufferReceive_success( void ) -{ - uint8_t data[ TEST_MAX_MESSAGE_SIZE ] = { 0xAA }; - size_t sent = 0; - uint8_t dataReceived[ TEST_MAX_MESSAGE_SIZE + 1 ] = { 0x00 }; - size_t received = 0; - - vTaskSetTimeOutState_Ignore(); - vTaskSuspendAll_Ignore(); - xTaskResumeAll_IgnoreAndReturn( pdTRUE ); - - /* Create a message buffer of the default test sample size. */ - xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); - TEST_ASSERT_NOT_NULL( xMessageBuffer ); - TEST_ASSERT_EQUAL( TEST_MESSAGE_BUFFER_SIZE, xMessageBufferSpacesAvailable( xMessageBuffer ) ); - - sent = xMessageBufferSend( xMessageBuffer, data, TEST_MAX_MESSAGE_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ); - TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, sent ); - TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, xStreamBufferNextMessageLengthBytes( xMessageBuffer ) ); - - /* Receiving bytes of size less than the message length will return 0 bytes. */ - received = xMessageBufferReceive( xMessageBuffer, dataReceived, TEST_MAX_MESSAGE_SIZE - 1, TEST_MESSAGE_BUFFER_WAIT_TICKS ); - TEST_ASSERT_EQUAL( 0, received ); - TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, xStreamBufferNextMessageLengthBytes( xMessageBuffer ) ); - - /* Receiving bytes of size greater than the message length will return message length bytes. */ - received = xMessageBufferReceive( xMessageBuffer, dataReceived, TEST_MAX_MESSAGE_SIZE + 1, TEST_MESSAGE_BUFFER_WAIT_TICKS ); - TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, received ); - TEST_ASSERT_EQUAL( 0, xStreamBufferNextMessageLengthBytes( xMessageBuffer ) ); - - vStreamBufferDelete( xMessageBuffer ); -} - -/** - * @brief Validates xMessageBufferReceive API with null input message. - */ -void test_xMessageBufferReceive_null_input_message( void ) -{ - vTaskSetTimeOutState_Ignore(); - vTaskSuspendAll_Ignore(); - xTaskResumeAll_IgnoreAndReturn( pdTRUE ); - - /* Create a message buffer of sample size. */ - xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); - TEST_ASSERT_NOT_NULL( xMessageBuffer ); - - /* Should assert if a null input message is passed. */ - EXPECT_ASSERT_BREAK( ( void ) xMessageBufferReceive( xMessageBuffer, NULL, TEST_MAX_MESSAGE_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ) ); - - validate_and_clear_assertions(); - - vStreamBufferDelete( xMessageBuffer ); -} - - -/** - * @brief Validates xMessageBufferReceive API with null message buffer handle. - */ -void test_xMessageBufferReceive_invalid_params( void ) -{ - uint8_t message[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; - - vTaskSetTimeOutState_Ignore(); - vTaskSuspendAll_Ignore(); - xTaskResumeAll_IgnoreAndReturn( pdTRUE ); - - /* Create a message buffer of sample size. */ - xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); - TEST_ASSERT_NOT_NULL( xMessageBuffer ); - - /* Should assert if a null message buffer handle is passed. */ - EXPECT_ASSERT_BREAK( ( void ) xMessageBufferReceive( NULL, message, TEST_MAX_MESSAGE_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ) ); - - validate_and_clear_assertions(); - - vStreamBufferDelete( xMessageBuffer ); -} - -/** - * @brief Validates that a task blocks if trying to read from an empty buffer. - * Task succeeds once a message is sent to message buffer. - */ -void test_xMessageBufferReceive_blocking( void ) -{ - uint8_t message[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; - size_t received = 0; - - vTaskSetTimeOutState_Ignore(); - xTaskGenericNotifyStateClear_IgnoreAndReturn( pdTRUE ); - xTaskGetCurrentTaskHandle_IgnoreAndReturn( receiverTask ); - xTaskGenericNotifyWait_StubWithCallback( messageBufferSendCallback ); - xTaskGenericNotify_StubWithCallback( receiverTaskNotificationCallback ); - xTaskCheckForTimeOut_IgnoreAndReturn( pdFALSE ); - vTaskSuspendAll_Ignore(); - xTaskResumeAll_IgnoreAndReturn( pdTRUE ); - - /* Create a message buffer of sample size. */ - xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); - TEST_ASSERT_NOT_NULL( xMessageBuffer ); - TEST_ASSERT_EQUAL( TEST_MESSAGE_BUFFER_SIZE, xMessageBufferSpacesAvailable( xMessageBuffer ) ); - - /* Receive from an empty buffer causes task to block. API succeeds after a message is sent to buffer. */ - received = xMessageBufferReceive( xMessageBuffer, message, TEST_MAX_MESSAGE_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ); - TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, received ); - TEST_ASSERT_EQUAL( 0, xStreamBufferNextMessageLengthBytes( xMessageBuffer ) ); - TEST_ASSERT_EQUAL( 1, receiverTaskWoken ); - - vStreamBufferDelete( xMessageBuffer ); -} - -/** - * @brief Validates that xMessageBufferSendFromISR API is successful and unblocks a receive task. - */ -void test_xMessageBufferSendFromISR_success( void ) -{ - uint8_t message[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; - size_t received = 0, sent = 0; - BaseType_t highPriorityTaskWoken = pdFALSE; - - vTaskSetTimeOutState_Ignore(); - xTaskGenericNotifyStateClear_IgnoreAndReturn( pdTRUE ); - xTaskGetCurrentTaskHandle_IgnoreAndReturn( receiverTask ); - xTaskGenericNotifyWait_StubWithCallback( messageBufferSendFromISRCallback ); - xTaskGenericNotifyFromISR_IgnoreAndReturn( pdTRUE ); - xTaskCheckForTimeOut_IgnoreAndReturn( pdFALSE ); - vTaskSuspendAll_Ignore(); - xTaskResumeAll_IgnoreAndReturn( pdTRUE ); - - /* Create a message buffer of sample size. */ - xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); - TEST_ASSERT_NOT_NULL( xMessageBuffer ); - TEST_ASSERT_EQUAL( TEST_MESSAGE_BUFFER_SIZE, xMessageBufferSpacesAvailable( xMessageBuffer ) ); - - /* Receiving from empty message buffer should block. But the task be woken up from a send from ISR. */ - received = xMessageBufferReceive( xMessageBuffer, message, TEST_MAX_MESSAGE_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ); - TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, received ); - - - /* Sending message of max size from ISR should succeed. */ - sent = xMessageBufferSendFromISR( xMessageBuffer, message, TEST_MAX_MESSAGE_SIZE, &highPriorityTaskWoken ); - TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, received ); - - /* Sending message of max size again from ISR should return zero instead of blocking. */ - sent = xMessageBufferSendFromISR( xMessageBuffer, message, TEST_MAX_MESSAGE_SIZE, &highPriorityTaskWoken ); - TEST_ASSERT_EQUAL( 0, sent ); - - vStreamBufferDelete( xMessageBuffer ); -} - -/** - * @brief Validates that xMessageBufferSendFromISR API is successful and unblocks a receive task. - */ -void test_xMessageBufferReceiveFromISR_success( void ) -{ - uint8_t message[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; - size_t sent = 0, received = 0; - BaseType_t xHighPriorityTaskWoken = pdFALSE; - - vTaskSetTimeOutState_Ignore(); - vTaskSuspendAll_Ignore(); - xTaskResumeAll_IgnoreAndReturn( pdTRUE ); - - /* Create a message buffer of sample size. */ - xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); - TEST_ASSERT_NOT_NULL( xMessageBuffer ); - TEST_ASSERT_EQUAL( pdTRUE, xMessageBufferIsEmpty( xMessageBuffer ) ); - - /* Receiving from an empty message buffer from ISR should not block but return 0 bytes. */ - received = xMessageBufferReceiveFromISR( xMessageBuffer, message, TEST_MESSAGE_BUFFER_SIZE, &xHighPriorityTaskWoken ); - TEST_ASSERT_EQUAL( 0, received ); - - xTaskGenericNotifyStateClear_IgnoreAndReturn( pdTRUE ); - xTaskGetCurrentTaskHandle_IgnoreAndReturn( senderTask ); - xTaskGenericNotifyWait_StubWithCallback( messageBufferReceiveFromISRCallback ); - xTaskGenericNotifyFromISR_IgnoreAndReturn( pdTRUE ); - xTaskCheckForTimeOut_IgnoreAndReturn( pdFALSE ); - - /* Sending max message size so that message buffer is full. */ - sent = xMessageBufferSend( xMessageBuffer, message, TEST_MAX_MESSAGE_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ); - TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, sent ); - TEST_ASSERT_EQUAL( 0, xMessageBufferSpacesAvailable( xMessageBuffer ) ); - - /* Receiving using a smaller buffer size from ISR should not block and return 0 bytes. */ - received = xMessageBufferReceiveFromISR( xMessageBuffer, message, TEST_MAX_MESSAGE_SIZE - 1, &xHighPriorityTaskWoken ); - TEST_ASSERT_EQUAL( 0, received ); - - /* Sending max message size again should block, but task should be woken up after receiving message from ISR. */ - sent = xMessageBufferSend( xMessageBuffer, message, TEST_MAX_MESSAGE_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ); - TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, sent ); - - vStreamBufferDelete( xMessageBuffer ); -} diff --git a/FreeRTOS/Test/CMock/message_buffer/message_buffer_utest.c b/FreeRTOS/Test/CMock/message_buffer/message_buffer_utest.c new file mode 100644 index 000000000..2df5d52ef --- /dev/null +++ b/FreeRTOS/Test/CMock/message_buffer/message_buffer_utest.c @@ -0,0 +1,800 @@ +/* + * FreeRTOS V202111.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 message_buffer_utest.c */ + +/* C runtime includes. */ +#include +#include + +/* Message Buffer includes */ +#include "FreeRTOS.h" +#include "FreeRTOSConfig.h" +#include "message_buffer.h" + +/* Test includes. */ +#include "unity.h" +#include "unity_memory.h" +#include "CException.h" + +/* Mock includes. */ +#include "mock_task.h" +#include "mock_fake_assert.h" +#include "mock_fake_port.h" + +/** + * @brief Sample size in bytes of the message buffer used for test. + * Keep it short enough so that they can be allocated on stack. + */ +#define TEST_MESSAGE_BUFFER_SIZE ( 64U ) + +/** + * @brief Minimum size required to store the length of the message. + */ +#define TEST_MESSAGE_METADATA_SIZE ( sizeof( configMESSAGE_BUFFER_LENGTH_TYPE ) ) + +/** + * @brief Maximum size of a message that can be sent to a message buffer. + * Each message stores an associated length of the message as metadata. So maximum message + * size at any time is total length - size of the variable used to store length. + */ +#define TEST_MAX_MESSAGE_SIZE ( TEST_MESSAGE_BUFFER_SIZE - TEST_MESSAGE_METADATA_SIZE ) + +/** + * @brief Maximum unsigned long value so as to trigger an integer overflow. + */ +#define TEST_MESSAGE_BUFFER_MAX_UINT_SIZE ( ~( size_t ) ( 0UL ) ) + +/** + * @brief Ticks to wait from tests if the message buffer is full while sending data or + * below trigger level while receiving data. + */ +#define TEST_MESSAGE_BUFFER_WAIT_TICKS ( 1000U ) + +/** + * @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(); \ + } \ + Catch( e ) \ + { \ + TEST_ASSERT_EQUAL( configASSERT_E, e ); \ + } \ + } while( 0 ) + +/* ============================ GLOBAL VARIABLES =========================== */ + +/** + * @brief Global counter for the number of assertions in code. + */ +static int assertionFailed = 0; + +/** + * @brief Global counter to keep track of how many times a sender task was woken up by a task receiving from the stream buffer. + */ +static int senderTaskWoken = 0; + +/** + * @brief Global counter to keep track of how many times a receiver task was woken up by a task sending to the buffer. + */ +static int receiverTaskWoken = 0; + +/** + * @brief Dummy sender task handle to which the stream buffer receive APIs will send notification. + */ +static TaskHandle_t senderTask = ( TaskHandle_t ) ( 0xAABBCCDD ); + +/** + * @brief Dummy receiver task handle to which the stream buffer send APIs will send notifications. + */ +static TaskHandle_t receiverTask = ( TaskHandle_t ) ( 0xABCDEEFF ); + +/** + * @brief Global message buffer handle used for tests. + */ +static MessageBufferHandle_t xMessageBuffer; + +/** + * @brief Flag which denotes if test need to abort on assertion. + */ +static BaseType_t shouldAbortOnAssertion; + +/* ========================== CALLBACK FUNCTIONS =========================== */ + +void * pvPortMalloc( size_t xSize ) +{ + return unity_malloc( xSize ); +} +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 ); + } + } +} + +static BaseType_t senderTaskNotificationCallback( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + uint32_t ulValue, + eNotifyAction eAction, + uint32_t * pulPreviousNotificationValue, + int cmock_num_calls ) +{ + TEST_ASSERT_EQUAL( senderTask, xTaskToNotify ); + senderTaskWoken++; + return pdTRUE; +} + +static BaseType_t messageBufferReceiveFromISRCallback( UBaseType_t uxIndexToWaitOn, + uint32_t ulBitsToClearOnEntry, + uint32_t ulBitsToClearOnExit, + uint32_t * pulNotificationValue, + TickType_t xTicksToWait, + int cmock_num_calls ) +{ + uint8_t data[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; + size_t dataReceived = 0; + BaseType_t senderTaskWokenFromISR = pdFALSE; + + dataReceived = xMessageBufferReceiveFromISR( xMessageBuffer, data, TEST_MAX_MESSAGE_SIZE, &senderTaskWokenFromISR ); + TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, dataReceived ); + return pdTRUE; +} + +static BaseType_t messageBufferReceiveCallback( UBaseType_t uxIndexToWaitOn, + uint32_t ulBitsToClearOnEntry, + uint32_t ulBitsToClearOnExit, + uint32_t * pulNotificationValue, + TickType_t xTicksToWait, + int cmock_num_calls ) +{ + uint8_t data[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; + size_t dataReceived = 0; + + /* Read next message from message buffer to wake up sender task. */ + dataReceived = xMessageBufferReceive( xMessageBuffer, data, TEST_MAX_MESSAGE_SIZE, 0 ); + TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, dataReceived ); + return pdTRUE; +} + +static BaseType_t messageBufferSendFromISRCallback( UBaseType_t uxIndexToWaitOn, + uint32_t ulBitsToClearOnEntry, + uint32_t ulBitsToClearOnExit, + uint32_t * pulNotificationValue, + TickType_t xTicksToWait, + int cmock_num_calls ) +{ + BaseType_t receiverTaskWokenFromISR = pdFALSE; + uint8_t data[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; + size_t dataSent = 0; + + dataSent = xMessageBufferSendFromISR( xMessageBuffer, data, TEST_MAX_MESSAGE_SIZE, &receiverTaskWokenFromISR ); + TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, dataSent ); + return pdTRUE; +} + +static BaseType_t messageBufferSendCallback( UBaseType_t uxIndexToWaitOn, + uint32_t ulBitsToClearOnEntry, + uint32_t ulBitsToClearOnExit, + uint32_t * pulNotificationValue, + TickType_t xTicksToWait, + int cmock_num_calls ) +{ + uint8_t data[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; + size_t dataSent = 0; + + /* Send a single message of max message size to message buffer to wake up receiver Task. */ + dataSent = xMessageBufferSend( xMessageBuffer, data, TEST_MAX_MESSAGE_SIZE, 0 ); + TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, dataSent ); + return pdTRUE; +} + +static BaseType_t receiverTaskNotificationCallback( TaskHandle_t xTaskToNotify, + UBaseType_t uxIndexToNotify, + uint32_t ulValue, + eNotifyAction eAction, + uint32_t * pulPreviousNotificationValue, + int cmock_num_calls ) +{ + TEST_ASSERT_EQUAL( receiverTask, xTaskToNotify ); + receiverTaskWoken++; + return pdTRUE; +} + +/******************************************************************************* + * Unity fixtures + ******************************************************************************/ +void setUp( void ) +{ + assertionFailed = 0; + xMessageBuffer = NULL; + senderTaskWoken = 0; + receiverTaskWoken = 0; + shouldAbortOnAssertion = pdTRUE; + + mock_task_Init(); + mock_fake_assert_Init(); + mock_fake_port_Init(); + + vFakePortEnterCriticalSection_Ignore(); + vFakePortExitCriticalSection_Ignore(); + ulFakePortSetInterruptMaskFromISR_IgnoreAndReturn( 0U ); + vFakePortClearInterruptMaskFromISR_Ignore(); + vFakeAssert_StubWithCallback( vFakeAssertStub ); + /* Track calls to malloc / free */ + UnityMalloc_StartTest(); +} + +/*! called before each test case */ +void tearDown( void ) +{ + TEST_ASSERT_EQUAL_MESSAGE( 0, assertionFailed, "Assertion check failed in code." ); + UnityMalloc_EndTest(); + + mock_task_Verify(); + mock_task_Destroy(); + + mock_fake_assert_Verify(); + mock_fake_assert_Destroy(); + + mock_fake_port_Verify(); + mock_fake_port_Destroy(); +} + +/*! called at the beginning of the whole suite */ +void suiteSetUp() +{ +} + +/*! called at the end of the whole suite */ +int suiteTearDown( int numFailures ) +{ + return numFailures; +} + +static void validate_message_buffer_init_state( MessageBufferHandle_t xMessageBuffer, + size_t bufferSize ) +{ + TEST_ASSERT_TRUE( xMessageBufferIsEmpty( xMessageBuffer ) ); + TEST_ASSERT_FALSE( xMessageBufferIsFull( xMessageBuffer ) ); + TEST_ASSERT_EQUAL( bufferSize, xMessageBufferSpacesAvailable( xMessageBuffer ) ); + TEST_ASSERT_EQUAL( 0, xStreamBufferNextMessageLengthBytes( xMessageBuffer ) ); + TEST_ASSERT_EQUAL( 1, ucStreamBufferGetStreamBufferType( xMessageBuffer ) ); +} + +static void validate_and_clear_assertions( void ) +{ + TEST_ASSERT_EQUAL( 1, assertionFailed ); + assertionFailed = 0; +} + +/* ============================== Test Cases ============================== */ + +/** + * @brief Validates that message buffer of sample test size is created successfully. + */ +void test_xMessageBufferCreate_success( void ) +{ + xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); + TEST_ASSERT_NOT_EQUAL( NULL, xMessageBuffer ); + validate_message_buffer_init_state( xMessageBuffer, TEST_MESSAGE_BUFFER_SIZE ); + vMessageBufferDelete( xMessageBuffer ); +} + +/** + * @brief API should fail and return null if there is an integer overflow in message buffer size passed. + */ +void test_xMessageBufferCreate_integer_overflow( void ) +{ + xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_MAX_UINT_SIZE ); + TEST_ASSERT_EQUAL( NULL, xMessageBuffer ); +} + +/** + * @brief API should fail and return null if the malloc fails. + */ +void test_xMessageBufferCreate_malloc_fail( void ) +{ + UnityMalloc_MakeMallocFailAfterCount( 0 ); + xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); + TEST_ASSERT_NULL( xMessageBuffer ); +} + +/** + * @brief Should assert if a zero size is passed to create API. + */ +void test_xMessageBufferCreate_zero_size( void ) +{ + EXPECT_ASSERT_BREAK( ( void ) xMessageBufferCreate( 0 ) ); + + validate_and_clear_assertions(); +} + +/** + * @brief Should assert if the size passed is less than the minimum size required to store metadata size. + */ +void test_xMessageBufferCreate_invalid_size( void ) +{ + EXPECT_ASSERT_BREAK( ( void ) xMessageBufferCreate( TEST_MESSAGE_METADATA_SIZE ) ); + + validate_and_clear_assertions(); +} + +/** + * @brief Validates message buffer creation through a static buffer allocated by the user. + */ +void test_xMessageBufferCreateStatic_success( void ) +{ + StaticMessageBuffer_t messageBufferStruct; + /* The size of message buffer array should be one greater than the required size of message buffer. */ + uint8_t messageBufferArray[ TEST_MESSAGE_BUFFER_SIZE + 1 ] = { 0 }; + + xMessageBuffer = xMessageBufferCreateStatic( sizeof( messageBufferArray ), messageBufferArray, &messageBufferStruct ); + TEST_ASSERT_NOT_NULL( xMessageBuffer ); + + validate_message_buffer_init_state( xMessageBuffer, TEST_MESSAGE_BUFFER_SIZE ); + + vStreamBufferDelete( xMessageBuffer ); +} + +/** + * @brief Validates message buffer creation fails if null array is passed. + */ +void test_xMessageBufferCreateStatic_null_array( void ) +{ + StaticMessageBuffer_t messageBufferStruct; + + /* Tests should abort if assertion is enabled or return NULL. */ + shouldAbortOnAssertion = pdFALSE; + + /* Returns NULL when NULL storage area is passed as a parameter. */ + xMessageBuffer = xMessageBufferCreateStatic( TEST_MESSAGE_BUFFER_SIZE, NULL, &messageBufferStruct ); + TEST_ASSERT_NULL( xMessageBuffer ); + + validate_and_clear_assertions(); +} + +/** + * @brief Validates message buffer creation fails if NULL struct is passed. + */ +void test_xMessageBufferCreateStatic_null_struct( void ) +{ + /* The size of message buffer array should be one greater than the required size of message buffer. */ + uint8_t messageBufferArray[ TEST_MESSAGE_BUFFER_SIZE + 1 ] = { 0 }; + + /* Tests should abort if assertion is enabled or return NULL. */ + shouldAbortOnAssertion = pdFALSE; + + /* Returns NULL when NULL message buffer struct is passed as a parameter. */ + xMessageBuffer = xMessageBufferCreateStatic( sizeof( messageBufferArray ), messageBufferArray, NULL ); + TEST_ASSERT_NULL( xMessageBuffer ); + + validate_and_clear_assertions(); +} + +/** + * @brief Validates message buffer create assert if the size passed is less than the minimum size required to store metadata size. + */ +void test_xMessageBufferCreateStatic_invalid_size( void ) +{ + StaticMessageBuffer_t messageBufferStruct; + /* The size of message buffer array should be one greater than the required size of message buffer. */ + uint8_t messageBufferArray[ TEST_MESSAGE_BUFFER_SIZE + 1 ] = { 0 }; + + EXPECT_ASSERT_BREAK( ( void ) xMessageBufferCreateStatic( TEST_MESSAGE_METADATA_SIZE, messageBufferArray, &messageBufferStruct ) ); + + validate_and_clear_assertions(); +} + +/** + * @brief Validate message buffer creation asserts if the size passed is zero. + */ +void test_xMessageBufferCreateStatic_zero_size( void ) +{ + StaticMessageBuffer_t messageBufferStruct; + /* The size of message buffer array should be one greater than the required size of message buffer. */ + uint8_t messageBufferArray[ TEST_MESSAGE_BUFFER_SIZE + 1 ] = { 0 }; + + EXPECT_ASSERT_BREAK( ( void ) xMessageBufferCreateStatic( 0, messageBufferArray, &messageBufferStruct ) ); + + validate_and_clear_assertions(); +} + +/** + * @brief Validates a task is able to send upto maximum message size allowed, without blocking. + */ +void test_xMessageBufferSend_success( void ) +{ + uint8_t data[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; + size_t dataSent = 0; + + vTaskSetTimeOutState_Ignore(); + vTaskSuspendAll_Ignore(); + xTaskResumeAll_IgnoreAndReturn( pdTRUE ); + + /* Create a message buffer of the default test sample size. */ + xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); + TEST_ASSERT_NOT_NULL( xMessageBuffer ); + TEST_ASSERT_EQUAL( TEST_MESSAGE_BUFFER_SIZE, xMessageBufferSpacesAvailable( xMessageBuffer ) ); + + /* Sending bytes of size upto to available size should succeed. Sender task should not be in blocked state. */ + dataSent = xMessageBufferSend( xMessageBuffer, data, TEST_MAX_MESSAGE_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ); + TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, dataSent ); + TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, xStreamBufferNextMessageLengthBytes( xMessageBuffer ) ); + TEST_ASSERT_EQUAL( pdFALSE, xMessageBufferIsEmpty( xMessageBuffer ) ); + + vStreamBufferDelete( xMessageBuffer ); +} + +/** + * @brief An integer overflow in message size to be sent should result in an + * assertion failure + */ +void test_xMessageBufferSend_message_size_integer_overflow( void ) +{ + uint8_t data[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; + + vTaskSetTimeOutState_Ignore(); + vTaskSuspendAll_Ignore(); + xTaskResumeAll_IgnoreAndReturn( pdTRUE ); + + /* Create a message buffer of the default test sample size. */ + xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); + TEST_ASSERT_NOT_NULL( xMessageBuffer ); + + EXPECT_ASSERT_BREAK( ( void ) xMessageBufferSend( xMessageBuffer, data, TEST_MESSAGE_BUFFER_MAX_UINT_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ) ); + + validate_and_clear_assertions(); + + vStreamBufferDelete( xMessageBuffer ); +} + +/** + * Sending a message of size greater than available size should return zero bytes sent. + */ +void test_xMessageBufferSend_message_larger_than_available_size( void ) +{ + uint8_t message[ TEST_MAX_MESSAGE_SIZE + 1 ] = { 0 }; + size_t sentBytes = 0; + + vTaskSetTimeOutState_Ignore(); + vTaskSuspendAll_Ignore(); + xTaskResumeAll_IgnoreAndReturn( pdTRUE ); + + /* Create a message buffer of sample size. */ + xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); + TEST_ASSERT_NOT_NULL( xMessageBuffer ); + TEST_ASSERT_EQUAL( TEST_MESSAGE_BUFFER_SIZE, xMessageBufferSpacesAvailable( xMessageBuffer ) ); + + sentBytes = xMessageBufferSend( xMessageBuffer, message, TEST_MAX_MESSAGE_SIZE + 1, TEST_MESSAGE_BUFFER_WAIT_TICKS ); + TEST_ASSERT_EQUAL( 0, sentBytes ); + TEST_ASSERT_EQUAL( TEST_MESSAGE_BUFFER_SIZE, xMessageBufferSpacesAvailable( xMessageBuffer ) ); + + vStreamBufferDelete( xMessageBuffer ); +} + +/** + * @brief Sending null message should trigger an assert. + */ +void test_xMessageBufferSend_null_message( void ) +{ + vTaskSetTimeOutState_Ignore(); + vTaskSuspendAll_Ignore(); + xTaskResumeAll_IgnoreAndReturn( pdTRUE ); + + /* Create a message buffer of sample size. */ + xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); + TEST_ASSERT_NOT_NULL( xMessageBuffer ); + + EXPECT_ASSERT_BREAK( ( void ) xMessageBufferSend( xMessageBuffer, NULL, TEST_MAX_MESSAGE_SIZE + 1, TEST_MESSAGE_BUFFER_WAIT_TICKS ) ); + + validate_and_clear_assertions(); + + vStreamBufferDelete( xMessageBuffer ); +} + +/** + * @brief Sending to a null message buffer should trigger an assert. + */ +void test_xMessageBufferSend_null_message_buffer( void ) +{ + uint8_t message[ TEST_MAX_MESSAGE_SIZE + 1 ] = { 0 }; + + vTaskSetTimeOutState_Ignore(); + vTaskSuspendAll_Ignore(); + xTaskResumeAll_IgnoreAndReturn( pdTRUE ); + + /* Create a message buffer of sample size. */ + xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); + TEST_ASSERT_NOT_NULL( xMessageBuffer ); + + EXPECT_ASSERT_BREAK( ( void ) xMessageBufferSend( NULL, message, TEST_MAX_MESSAGE_SIZE + 1, TEST_MESSAGE_BUFFER_WAIT_TICKS ) ); + + validate_and_clear_assertions(); + + vStreamBufferDelete( xMessageBuffer ); +} + +/** + * @brief Validates that a task blocks if there is insufficient space in message buffer for a valid message to be sent. + * Task then succeeds once enough space is available by reading from the message buffer. + */ +void test_xMessageBufferSend_blocking( void ) +{ + uint8_t message[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; + size_t sentBytes = 0; + + vTaskSetTimeOutState_Ignore(); + xTaskGenericNotifyStateClear_IgnoreAndReturn( pdTRUE ); + xTaskGetCurrentTaskHandle_IgnoreAndReturn( senderTask ); + xTaskGenericNotifyWait_StubWithCallback( messageBufferReceiveCallback ); + xTaskGenericNotify_StubWithCallback( senderTaskNotificationCallback ); + xTaskCheckForTimeOut_IgnoreAndReturn( pdFALSE ); + vTaskSuspendAll_Ignore(); + xTaskResumeAll_IgnoreAndReturn( pdTRUE ); + + /* Create a message buffer of sample size. */ + xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); + TEST_ASSERT_NOT_NULL( xMessageBuffer ); + TEST_ASSERT_EQUAL( TEST_MESSAGE_BUFFER_SIZE, xMessageBufferSpacesAvailable( xMessageBuffer ) ); + + /* Sending max message size so that message buffer is full. */ + sentBytes = xMessageBufferSend( xMessageBuffer, message, TEST_MAX_MESSAGE_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ); + TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, sentBytes ); + TEST_ASSERT_EQUAL( 0, xMessageBufferSpacesAvailable( xMessageBuffer ) ); + + /* Sending max message size again blocks the task. API succeeds after reading the current message from the buffer. */ + sentBytes = xMessageBufferSend( xMessageBuffer, message, TEST_MAX_MESSAGE_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ); + TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, sentBytes ); + TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, xStreamBufferNextMessageLengthBytes( xMessageBuffer ) ); + TEST_ASSERT_EQUAL( 1, senderTaskWoken ); + + vStreamBufferDelete( xMessageBuffer ); +} + +/** + * @brief Validates a task is able to receive upto maximum message size allowed, without blocking. + */ +void test_xMessageBufferReceive_success( void ) +{ + uint8_t data[ TEST_MAX_MESSAGE_SIZE ] = { 0xAA }; + size_t sent = 0; + uint8_t dataReceived[ TEST_MAX_MESSAGE_SIZE + 1 ] = { 0x00 }; + size_t received = 0; + + vTaskSetTimeOutState_Ignore(); + vTaskSuspendAll_Ignore(); + xTaskResumeAll_IgnoreAndReturn( pdTRUE ); + + /* Create a message buffer of the default test sample size. */ + xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); + TEST_ASSERT_NOT_NULL( xMessageBuffer ); + TEST_ASSERT_EQUAL( TEST_MESSAGE_BUFFER_SIZE, xMessageBufferSpacesAvailable( xMessageBuffer ) ); + + sent = xMessageBufferSend( xMessageBuffer, data, TEST_MAX_MESSAGE_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ); + TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, sent ); + TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, xStreamBufferNextMessageLengthBytes( xMessageBuffer ) ); + + /* Receiving bytes of size less than the message length will return 0 bytes. */ + received = xMessageBufferReceive( xMessageBuffer, dataReceived, TEST_MAX_MESSAGE_SIZE - 1, TEST_MESSAGE_BUFFER_WAIT_TICKS ); + TEST_ASSERT_EQUAL( 0, received ); + TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, xStreamBufferNextMessageLengthBytes( xMessageBuffer ) ); + + /* Receiving bytes of size greater than the message length will return message length bytes. */ + received = xMessageBufferReceive( xMessageBuffer, dataReceived, TEST_MAX_MESSAGE_SIZE + 1, TEST_MESSAGE_BUFFER_WAIT_TICKS ); + TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, received ); + TEST_ASSERT_EQUAL( 0, xStreamBufferNextMessageLengthBytes( xMessageBuffer ) ); + + vStreamBufferDelete( xMessageBuffer ); +} + +/** + * @brief Validates xMessageBufferReceive API with null input message. + */ +void test_xMessageBufferReceive_null_input_message( void ) +{ + vTaskSetTimeOutState_Ignore(); + vTaskSuspendAll_Ignore(); + xTaskResumeAll_IgnoreAndReturn( pdTRUE ); + + /* Create a message buffer of sample size. */ + xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); + TEST_ASSERT_NOT_NULL( xMessageBuffer ); + + /* Should assert if a null input message is passed. */ + EXPECT_ASSERT_BREAK( ( void ) xMessageBufferReceive( xMessageBuffer, NULL, TEST_MAX_MESSAGE_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ) ); + + validate_and_clear_assertions(); + + vStreamBufferDelete( xMessageBuffer ); +} + + +/** + * @brief Validates xMessageBufferReceive API with null message buffer handle. + */ +void test_xMessageBufferReceive_invalid_params( void ) +{ + uint8_t message[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; + + vTaskSetTimeOutState_Ignore(); + vTaskSuspendAll_Ignore(); + xTaskResumeAll_IgnoreAndReturn( pdTRUE ); + + /* Create a message buffer of sample size. */ + xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); + TEST_ASSERT_NOT_NULL( xMessageBuffer ); + + /* Should assert if a null message buffer handle is passed. */ + EXPECT_ASSERT_BREAK( ( void ) xMessageBufferReceive( NULL, message, TEST_MAX_MESSAGE_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ) ); + + validate_and_clear_assertions(); + + vStreamBufferDelete( xMessageBuffer ); +} + +/** + * @brief Validates that a task blocks if trying to read from an empty buffer. + * Task succeeds once a message is sent to message buffer. + */ +void test_xMessageBufferReceive_blocking( void ) +{ + uint8_t message[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; + size_t received = 0; + + vTaskSetTimeOutState_Ignore(); + xTaskGenericNotifyStateClear_IgnoreAndReturn( pdTRUE ); + xTaskGetCurrentTaskHandle_IgnoreAndReturn( receiverTask ); + xTaskGenericNotifyWait_StubWithCallback( messageBufferSendCallback ); + xTaskGenericNotify_StubWithCallback( receiverTaskNotificationCallback ); + xTaskCheckForTimeOut_IgnoreAndReturn( pdFALSE ); + vTaskSuspendAll_Ignore(); + xTaskResumeAll_IgnoreAndReturn( pdTRUE ); + + /* Create a message buffer of sample size. */ + xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); + TEST_ASSERT_NOT_NULL( xMessageBuffer ); + TEST_ASSERT_EQUAL( TEST_MESSAGE_BUFFER_SIZE, xMessageBufferSpacesAvailable( xMessageBuffer ) ); + + /* Receive from an empty buffer causes task to block. API succeeds after a message is sent to buffer. */ + received = xMessageBufferReceive( xMessageBuffer, message, TEST_MAX_MESSAGE_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ); + TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, received ); + TEST_ASSERT_EQUAL( 0, xStreamBufferNextMessageLengthBytes( xMessageBuffer ) ); + TEST_ASSERT_EQUAL( 1, receiverTaskWoken ); + + vStreamBufferDelete( xMessageBuffer ); +} + +/** + * @brief Validates that xMessageBufferSendFromISR API is successful and unblocks a receive task. + */ +void test_xMessageBufferSendFromISR_success( void ) +{ + uint8_t message[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; + size_t received = 0, sent = 0; + BaseType_t highPriorityTaskWoken = pdFALSE; + + vTaskSetTimeOutState_Ignore(); + xTaskGenericNotifyStateClear_IgnoreAndReturn( pdTRUE ); + xTaskGetCurrentTaskHandle_IgnoreAndReturn( receiverTask ); + xTaskGenericNotifyWait_StubWithCallback( messageBufferSendFromISRCallback ); + xTaskGenericNotifyFromISR_IgnoreAndReturn( pdTRUE ); + xTaskCheckForTimeOut_IgnoreAndReturn( pdFALSE ); + vTaskSuspendAll_Ignore(); + xTaskResumeAll_IgnoreAndReturn( pdTRUE ); + + /* Create a message buffer of sample size. */ + xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); + TEST_ASSERT_NOT_NULL( xMessageBuffer ); + TEST_ASSERT_EQUAL( TEST_MESSAGE_BUFFER_SIZE, xMessageBufferSpacesAvailable( xMessageBuffer ) ); + + /* Receiving from empty message buffer should block. But the task be woken up from a send from ISR. */ + received = xMessageBufferReceive( xMessageBuffer, message, TEST_MAX_MESSAGE_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ); + TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, received ); + + + /* Sending message of max size from ISR should succeed. */ + sent = xMessageBufferSendFromISR( xMessageBuffer, message, TEST_MAX_MESSAGE_SIZE, &highPriorityTaskWoken ); + TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, received ); + + /* Sending message of max size again from ISR should return zero instead of blocking. */ + sent = xMessageBufferSendFromISR( xMessageBuffer, message, TEST_MAX_MESSAGE_SIZE, &highPriorityTaskWoken ); + TEST_ASSERT_EQUAL( 0, sent ); + + vStreamBufferDelete( xMessageBuffer ); +} + +/** + * @brief Validates that xMessageBufferSendFromISR API is successful and unblocks a receive task. + */ +void test_xMessageBufferReceiveFromISR_success( void ) +{ + uint8_t message[ TEST_MAX_MESSAGE_SIZE ] = { 0 }; + size_t sent = 0, received = 0; + BaseType_t xHighPriorityTaskWoken = pdFALSE; + + vTaskSetTimeOutState_Ignore(); + vTaskSuspendAll_Ignore(); + xTaskResumeAll_IgnoreAndReturn( pdTRUE ); + + /* Create a message buffer of sample size. */ + xMessageBuffer = xMessageBufferCreate( TEST_MESSAGE_BUFFER_SIZE ); + TEST_ASSERT_NOT_NULL( xMessageBuffer ); + TEST_ASSERT_EQUAL( pdTRUE, xMessageBufferIsEmpty( xMessageBuffer ) ); + + /* Receiving from an empty message buffer from ISR should not block but return 0 bytes. */ + received = xMessageBufferReceiveFromISR( xMessageBuffer, message, TEST_MESSAGE_BUFFER_SIZE, &xHighPriorityTaskWoken ); + TEST_ASSERT_EQUAL( 0, received ); + + xTaskGenericNotifyStateClear_IgnoreAndReturn( pdTRUE ); + xTaskGetCurrentTaskHandle_IgnoreAndReturn( senderTask ); + xTaskGenericNotifyWait_StubWithCallback( messageBufferReceiveFromISRCallback ); + xTaskGenericNotifyFromISR_IgnoreAndReturn( pdTRUE ); + xTaskCheckForTimeOut_IgnoreAndReturn( pdFALSE ); + + /* Sending max message size so that message buffer is full. */ + sent = xMessageBufferSend( xMessageBuffer, message, TEST_MAX_MESSAGE_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ); + TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, sent ); + TEST_ASSERT_EQUAL( 0, xMessageBufferSpacesAvailable( xMessageBuffer ) ); + + /* Receiving using a smaller buffer size from ISR should not block and return 0 bytes. */ + received = xMessageBufferReceiveFromISR( xMessageBuffer, message, TEST_MAX_MESSAGE_SIZE - 1, &xHighPriorityTaskWoken ); + TEST_ASSERT_EQUAL( 0, received ); + + /* Sending max message size again should block, but task should be woken up after receiving message from ISR. */ + sent = xMessageBufferSend( xMessageBuffer, message, TEST_MAX_MESSAGE_SIZE, TEST_MESSAGE_BUFFER_WAIT_TICKS ); + TEST_ASSERT_EQUAL( TEST_MAX_MESSAGE_SIZE, sent ); + + vStreamBufferDelete( xMessageBuffer ); +} diff --git a/FreeRTOS/Test/CMock/message_buffer/size_mismatch/FreeRTOSConfig.h b/FreeRTOS/Test/CMock/message_buffer/size_mismatch/FreeRTOSConfig.h deleted file mode 100644 index 377edc2ca..000000000 --- a/FreeRTOS/Test/CMock/message_buffer/size_mismatch/FreeRTOSConfig.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - * FreeRTOS V202111.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 - * - */ - - -#ifndef FREERTOS_CONFIG_H -#define FREERTOS_CONFIG_H - -#include "fake_assert.h" - -/*----------------------------------------------------------- -* Application specific definitions. -* -* These definitions should be adjusted for your particular hardware and -* application requirements. -* -* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE -* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. See -* http://www.freertos.org/a00110.html -*----------------------------------------------------------*/ - -#define configUSE_PREEMPTION 1 -#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 -#define configUSE_IDLE_HOOK 1 -#define configUSE_TICK_HOOK 1 -#define configUSE_DAEMON_TASK_STARTUP_HOOK 1 -#define configTICK_RATE_HZ ( 1000 ) /* In this non-real time simulated environment the tick frequency has to be at least a multiple of the Win32 tick frequency, and therefore very slow. */ -#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 70 ) /* In this simulated case, the stack only has to hold one small structure as the real stack is part of the win32 thread. */ -#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 52 * 1024 ) ) -#define configMAX_TASK_NAME_LEN ( 12 ) -#define configUSE_TRACE_FACILITY 0 -#define configUSE_16_BIT_TICKS 0 -#define configIDLE_SHOULD_YIELD 1 -#define configUSE_MUTEXES 1 -#define configCHECK_FOR_STACK_OVERFLOW 0 -#define configUSE_RECURSIVE_MUTEXES 1 -#define configQUEUE_REGISTRY_SIZE 0 -#define configUSE_MALLOC_FAILED_HOOK 1 -#define configUSE_APPLICATION_TASK_TAG 1 -#define configUSE_COUNTING_SEMAPHORES 1 -#define configUSE_ALTERNATIVE_API 0 -#define configUSE_QUEUE_SETS 0 -#define configUSE_TASK_NOTIFICATIONS 1 -#define configTASK_NOTIFICATION_ARRAY_ENTRIES 5 -#define configSUPPORT_STATIC_ALLOCATION 1 -#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. */ -#define configMESSAGE_BUFFER_LENGTH_TYPE uint8_t - -/* Software timer related configuration options. */ -#define configUSE_TIMERS 1 -#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 ) -#define configTIMER_QUEUE_LENGTH 20 -#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 ) - -#define configMAX_PRIORITIES ( 7 ) - -/* Run time stats gathering configuration options. */ -unsigned long ulGetRunTimeCounterValue( void ); /* Prototype of function that returns run time counter. */ -void vConfigureTimerForRunTimeStats( void ); /* Prototype of function that initialises the run time counter. */ -#define configGENERATE_RUN_TIME_STATS 1 -#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() vConfigureTimerForRunTimeStats() -#define portGET_RUN_TIME_COUNTER_VALUE() ulGetRunTimeCounterValue() - -/* Co-routine related configuration options. */ -#define configUSE_CO_ROUTINES 0 -#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) - -/* This demo makes use of one or more example stats formatting functions. These - * format the raw data provided by the uxTaskGetSystemState() function in to human - * readable ASCII form. See the notes in the implementation of vTaskList() within - * FreeRTOS/Source/tasks.c for limitations. */ -#define configUSE_STATS_FORMATTING_FUNCTIONS 1 - -/* Set the following definitions to 1 to include the API function, or zero - * to exclude the API function. In most cases the linker will remove unused - * functions anyway. */ -#define INCLUDE_vTaskPrioritySet 1 -#define INCLUDE_uxTaskPriorityGet 1 -#define INCLUDE_vTaskDelete 1 -#define INCLUDE_vTaskCleanUpResources 0 -#define INCLUDE_vTaskSuspend 1 -#define INCLUDE_vTaskDelayUntil 1 -#define INCLUDE_vTaskDelay 1 -#define INCLUDE_uxTaskGetStackHighWaterMark 1 -#define INCLUDE_xTaskGetSchedulerState 1 -#define INCLUDE_xTimerGetTimerDaemonTaskHandle 1 -#define INCLUDE_xTaskGetIdleTaskHandle 1 -#define INCLUDE_xTaskGetHandle 1 -#define INCLUDE_eTaskGetState 1 -#define INCLUDE_xSemaphoreGetMutexHolder 1 -#define INCLUDE_xTimerPendFunctionCall 1 -#define INCLUDE_xTaskAbortDelay 1 - -/* It is a good idea to define configASSERT() while developing. configASSERT() - * uses the same semantics as the standard C assert() macro. */ -#define configASSERT( x ) \ - do \ - { \ - if( x ) \ - { \ - vFakeAssert( true, __FILE__, __LINE__ ); \ - } \ - else \ - { \ - vFakeAssert( false, __FILE__, __LINE__ ); \ - } \ - } while( 0 ) - - -#define mtCOVERAGE_TEST_MARKER() __asm volatile ( "NOP" ) - -#define configINCLUDE_MESSAGE_BUFFER_AMP_DEMO 0 -#if ( configINCLUDE_MESSAGE_BUFFER_AMP_DEMO == 1 ) - extern void vGenerateCoreBInterrupt( void * xUpdatedMessageBuffer ); - #define sbSEND_COMPLETED( pxStreamBuffer ) vGenerateCoreBInterrupt( pxStreamBuffer ) -#endif /* configINCLUDE_MESSAGE_BUFFER_AMP_DEMO */ - -#endif /* FREERTOS_CONFIG_H */ diff --git a/FreeRTOS/Test/CMock/message_buffer/size_mismatch/Makefile b/FreeRTOS/Test/CMock/message_buffer/size_mismatch/Makefile deleted file mode 100644 index 289f8f975..000000000 --- a/FreeRTOS/Test/CMock/message_buffer/size_mismatch/Makefile +++ /dev/null @@ -1,45 +0,0 @@ -# Indent with spaces -.RECIPEPREFIX := $(.RECIPEPREFIX) $(.RECIPEPREFIX) - -# Do not move this line below the include -MAKEFILE_ABSPATH := $(abspath $(lastword $(MAKEFILE_LIST))) -include ../../makefile.in - -# PROJECT_SRC lists the .c files under test -PROJECT_SRC += stream_buffer.c - -# PROJECT_DEPS_SRC list the .c file that are dependencies of PROJECT_SRC files -# Files in PROJECT_DEPS_SRC are excluded from coverage measurements -PROJECT_DEPS_SRC += list.c - -# PROJECT_HEADER_DEPS: headers that should be excluded from coverage measurements. -PROJECT_HEADER_DEPS += FreeRTOS.h - -# SUITE_UT_SRC: .c files that contain test cases (must end in _utest.c) -SUITE_UT_SRC += message_buffer_utest.c - -# SUITE_SUPPORT_SRC: .c files used for testing that do not contain test cases. -# Paths are relative to PROJECT_DIR -SUITE_SUPPORT_SRC += - -# List the headers used by PROJECT_SRC that you would like to mock -MOCK_FILES_FP += $(KERNEL_DIR)/include/task.h -MOCK_FILES_FP += $(UT_ROOT_DIR)/config/fake_assert.h -MOCK_FILES_FP += $(UT_ROOT_DIR)/config/fake_port.h - -# List any addiitonal flags needed by the preprocessor -CPPFLAGS += -DportUSING_MPU_WRAPPERS=0 -I . - -# List any addiitonal flags needed by the compiler -CFLAGS += - -# Try not to edit beyond this line unless necessary. - -# Project / Suite are determined based on path: $(UT_ROOT_DIR)/$(PROJECT)/$(SUITE) -PROJECT := $(lastword $(subst /, ,$(dir $(abspath $(MAKEFILE_ABSPATH)/../)))) -SUITE := $(lastword $(subst /, ,$(dir $(MAKEFILE_ABSPATH)))) - -# Make variables available to included makefile -export - -include ../../testdir.mk diff --git a/FreeRTOS/Test/CMock/message_buffer/size_mismatch/message_buffer_utest.c b/FreeRTOS/Test/CMock/message_buffer/size_mismatch/message_buffer_utest.c deleted file mode 100644 index 146cb1470..000000000 --- a/FreeRTOS/Test/CMock/message_buffer/size_mismatch/message_buffer_utest.c +++ /dev/null @@ -1,223 +0,0 @@ -/* - * FreeRTOS V202111.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 message_buffer_utest.c */ - -/* C runtime includes. */ -#include -#include - -/* Message Buffer includes */ -#include "FreeRTOS.h" -#include "FreeRTOSConfig.h" -#include "message_buffer.h" - -/* Test includes. */ -#include "unity.h" -#include "unity_memory.h" -#include "CException.h" - -/* Mock includes. */ -#include "mock_task.h" -#include "mock_fake_assert.h" -#include "mock_fake_port.h" - -/** - * @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(); \ - } \ - Catch( e ) \ - { \ - TEST_ASSERT_EQUAL( configASSERT_E, e ); \ - } \ - } while( 0 ) - -/* ============================ GLOBAL VARIABLES =========================== */ - -/** - * @brief Global counter for the number of assertions in code. - */ -static int assertionFailed = 0; - -/** - * @brief Global counter to keep track of how many times a sender task was woken up by a task receiving from the stream buffer. - */ -static int senderTaskWoken = 0; - -/** - * @brief Global counter to keep track of how many times a receiver task was woken up by a task sending to the buffer. - */ -static int receiverTaskWoken = 0; - -/** - * @brief Dummy sender task handle to which the stream buffer receive APIs will send notification. - */ -/*static TaskHandle_t senderTask = ( TaskHandle_t ) ( 0xAABBCCDD ); */ - -/** - * @brief Dummy receiver task handle to which the stream buffer send APIs will send notifications. - */ -/*static TaskHandle_t receiverTask = ( TaskHandle_t ) ( 0xABCDEEFF ); */ - -/** - * @brief Global message buffer handle used for tests. - */ -static MessageBufferHandle_t xMessageBuffer; - -/** - * @brief Flag which denotes if test need to abort on assertion. - */ -static BaseType_t shouldAbortOnAssertion; - -/* ========================== CALLBACK FUNCTIONS =========================== */ - -void * pvPortMalloc( size_t xSize ) -{ - return unity_malloc( xSize ); -} -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 - ******************************************************************************/ -void setUp( void ) -{ - assertionFailed = 0; - xMessageBuffer = NULL; - senderTaskWoken = 0; - receiverTaskWoken = 0; - shouldAbortOnAssertion = pdTRUE; - - mock_task_Init(); - mock_fake_assert_Init(); - mock_fake_port_Init(); - - vFakePortEnterCriticalSection_Ignore(); - vFakePortExitCriticalSection_Ignore(); - ulFakePortSetInterruptMaskFromISR_IgnoreAndReturn( 0U ); - vFakePortClearInterruptMaskFromISR_Ignore(); - vFakeAssert_StubWithCallback( vFakeAssertStub ); - /* Track calls to malloc / free */ - UnityMalloc_StartTest(); -} - -/*! called before each test case */ -void tearDown( void ) -{ - TEST_ASSERT_EQUAL_MESSAGE( 0, assertionFailed, "Assertion check failed in code." ); - UnityMalloc_EndTest(); - - mock_task_Verify(); - mock_task_Destroy(); - - mock_fake_assert_Verify(); - mock_fake_assert_Destroy(); - - mock_fake_port_Verify(); - mock_fake_port_Destroy(); -} - -/*! called at the beginning of the whole suite */ -void suiteSetUp() -{ -} - -/*! called at the end of the whole suite */ -int suiteTearDown( int numFailures ) -{ - return numFailures; -} - - -static void validate_and_clear_assertions( void ) -{ - TEST_ASSERT_EQUAL( 1, assertionFailed ); - assertionFailed = 0; -} - -/* ============================== Test Cases ============================== */ - - -/** - * @brief assert if xDataLengthBytes does not fit in - * configMESSAGE_BUFFER_LENGTH_TYPE. - * - */ -void test_xMessageBufferSend_size_mismatch( void ) -{ - uint8_t message[ UINT8_MAX + 5 + 1 ] = { 0 }; - - vTaskSetTimeOutState_Ignore(); - vTaskSuspendAll_Ignore(); - xTaskResumeAll_IgnoreAndReturn( pdTRUE ); - - xMessageBuffer = xMessageBufferCreate( UINT8_MAX + 5 ); - /* Create a message buffer of sample size. */ - TEST_ASSERT_NOT_NULL( xMessageBuffer ); - - EXPECT_ASSERT_BREAK( ( void ) xMessageBufferSend( xMessageBuffer, - message, - UINT8_MAX + 5, - 0 ) ); - vStreamBufferDelete( xMessageBuffer ); - - validate_and_clear_assertions(); -} diff --git a/FreeRTOS/Test/CMock/testdir.mk b/FreeRTOS/Test/CMock/testdir.mk index 25fe2ba20..139cae80a 100644 --- a/FreeRTOS/Test/CMock/testdir.mk +++ b/FreeRTOS/Test/CMock/testdir.mk @@ -131,7 +131,7 @@ $(PROJ_DIR)/%.i : $(KERNEL_DIR)/%.c # compile the project objects with coverage instrumented $(PROJ_DIR)/%.o : $(PROJ_DIR)/%.i - $(CC) -c $< $(CPPFLAGS) $(CFLAGS) $(INCLUDE_DIR) $(GCC_COV_OPTS) -Wall -Wextra -Werror -pedantic -std=c89 -o $@ + $(CC) -c $< $(CPPFLAGS) $(CFLAGS) $(INCLUDE_DIR) $(GCC_COV_OPTS) -o $@ # Build mock objects $(SCRATCH_DIR)/mock_%.o : $(MOCKS_DIR)/mock_%.c diff --git a/manifest.yml b/manifest.yml index 818aecf66..12eedb356 100644 --- a/manifest.yml +++ b/manifest.yml @@ -4,7 +4,7 @@ description: "This is the standard distribution of FreeRTOS." dependencies: - name: "FreeRTOS-Kernel" - version: "e13f990" + version: "V10.4.6" repository: type: "git" url: "https://github.com/FreeRTOS/FreeRTOS-Kernel.git" -- cgit v1.2.1