From a32ab34192d45ac4ac63114a5f6466aa9c6c0e49 Mon Sep 17 00:00:00 2001 From: alfred gedeon <28123637+alfred2g@users.noreply.github.com> Date: Fri, 15 Oct 2021 16:07:59 -0700 Subject: [PATCH] UT: Add streambuffer test to make PR #391 pass (#690) UT: Add streambuffer test to make PR #391 pass --- FreeRTOS/Test/CMock/message_buffer/Makefile | 46 +--- .../message_buffer/message_buffer/Makefile | 45 ++++ .../message_buffer_utest.c | 0 .../size_mismatch/FreeRTOSConfig.h | 142 +++++++++++ .../message_buffer/size_mismatch/Makefile | 45 ++++ .../size_mismatch/message_buffer_utest.c | 223 ++++++++++++++++++ 6 files changed, 464 insertions(+), 37 deletions(-) create mode 100644 FreeRTOS/Test/CMock/message_buffer/message_buffer/Makefile rename FreeRTOS/Test/CMock/message_buffer/{ => message_buffer}/message_buffer_utest.c (100%) create mode 100644 FreeRTOS/Test/CMock/message_buffer/size_mismatch/FreeRTOSConfig.h create mode 100644 FreeRTOS/Test/CMock/message_buffer/size_mismatch/Makefile create mode 100644 FreeRTOS/Test/CMock/message_buffer/size_mismatch/message_buffer_utest.c diff --git a/FreeRTOS/Test/CMock/message_buffer/Makefile b/FreeRTOS/Test/CMock/message_buffer/Makefile index a8dd6cccd0..ff0c83ee3c 100644 --- a/FreeRTOS/Test/CMock/message_buffer/Makefile +++ b/FreeRTOS/Test/CMock/message_buffer/Makefile @@ -1,43 +1,15 @@ -# 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 -# 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))))) +# SUITES lists the suites contained in subdirectories of this directory +SUITES += size_mismatch +SUITES += message_buffer -export +# PROJECT and SUITE variables are determined based on path like so: +# $(UT_ROOT_DIR)/$(PROJECT)/$(SUITE) +PROJECT := $(lastword $(subst /, ,$(dir $(abspath $(MAKEFILE_ABSPATH))))) -include ../testdir.mk +include ../subdir.mk diff --git a/FreeRTOS/Test/CMock/message_buffer/message_buffer/Makefile b/FreeRTOS/Test/CMock/message_buffer/message_buffer/Makefile new file mode 100644 index 0000000000..44f03aa94c --- /dev/null +++ b/FreeRTOS/Test/CMock/message_buffer/message_buffer/Makefile @@ -0,0 +1,45 @@ +# 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_utest.c b/FreeRTOS/Test/CMock/message_buffer/message_buffer/message_buffer_utest.c similarity index 100% rename from FreeRTOS/Test/CMock/message_buffer/message_buffer_utest.c rename to FreeRTOS/Test/CMock/message_buffer/message_buffer/message_buffer_utest.c diff --git a/FreeRTOS/Test/CMock/message_buffer/size_mismatch/FreeRTOSConfig.h b/FreeRTOS/Test/CMock/message_buffer/size_mismatch/FreeRTOSConfig.h new file mode 100644 index 0000000000..15f74679ef --- /dev/null +++ b/FreeRTOS/Test/CMock/message_buffer/size_mismatch/FreeRTOSConfig.h @@ -0,0 +1,142 @@ +/* + * FreeRTOS V202107.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 new file mode 100644 index 0000000000..289f8f975e --- /dev/null +++ b/FreeRTOS/Test/CMock/message_buffer/size_mismatch/Makefile @@ -0,0 +1,45 @@ +# 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 new file mode 100644 index 0000000000..7e7386df86 --- /dev/null +++ b/FreeRTOS/Test/CMock/message_buffer/size_mismatch/message_buffer_utest.c @@ -0,0 +1,223 @@ +/* + * FreeRTOS V202107.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(); +}