From bcaffe767f73e268c540b8d38d3acc913d402d8c Mon Sep 17 00:00:00 2001 From: Jan Date: Thu, 13 Feb 2025 17:03:06 +0100 Subject: [PATCH] feat(hardware-test): automate hw test for freertos queue Checks: - creation of FreeRTOS queue - basic message exchange - changing message dynamically before pushing to queue - overflow of queue --- test/hardware/AutomatedHWTests/CMakeLists.txt | 15 +++ .../AutomatedHWTests/TestFreeRTOSQueue.c | 104 ++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 test/hardware/AutomatedHWTests/TestFreeRTOSQueue.c diff --git a/test/hardware/AutomatedHWTests/CMakeLists.txt b/test/hardware/AutomatedHWTests/CMakeLists.txt index 03e88258..b5adfd01 100644 --- a/test/hardware/AutomatedHWTests/CMakeLists.txt +++ b/test/hardware/AutomatedHWTests/CMakeLists.txt @@ -13,4 +13,19 @@ if(BUILDING_FOR_ELASTIC_NODE) unity ) create_enV5_executable(TestFlash) + + add_executable(TestFreeRTOSQueue TestFreeRTOSQueue.c) + target_link_libraries(TestFreeRTOSQueue PRIVATE + Common + EnV5HwController + freeRtosUtils + + freeRtos::FreeRTOS-Kernel + Pico::pico_stdlib + Pico::pico_bootrom + Pico::hardware_spi + + unity + ) + create_enV5_executable(TestFreeRTOSQueue) endif() \ No newline at end of file diff --git a/test/hardware/AutomatedHWTests/TestFreeRTOSQueue.c b/test/hardware/AutomatedHWTests/TestFreeRTOSQueue.c new file mode 100644 index 00000000..9da60cda --- /dev/null +++ b/test/hardware/AutomatedHWTests/TestFreeRTOSQueue.c @@ -0,0 +1,104 @@ +#define SOURCE_FILE "FREERTOS-HWTEST" + +#include "Common.h" +#include "EnV5HwController.h" +#include "FreeRtosQueueWrapper.h" +#include "FreeRtosTaskWrapper.h" +#include "stdlib.h" +#include "string.h" +#include "unity.h" + +#include "pico/bootrom.h" +#include "pico/stdio_usb.h" + +#define QUEUE_SIZE 5 + +typedef struct message { + uint16_t messageId; + char content[15]; +} message_t; + +queue_t messageQueue; +char staticMessage[] = "STATIC MSG"; +char dynamicMessage[] = "DYNAMIC MSG"; + +void init(void) { + stdio_init_all(); + while ((!stdio_usb_connected())) {} + env5HwControllerInit(); +} + +void testCreateQueueSuccessful(void) { + TEST_ASSERT_NOT_NULL(messageQueue); +} + +void testBasicMessageExchange() { + message_t sentMessage = {.messageId = 1}; + strcpy(sentMessage.content, staticMessage); + + TEST_ASSERT_TRUE(freeRtosQueueWrapperPush(messageQueue, &sentMessage)); + + message_t receivedMessage; + TEST_ASSERT_TRUE(freeRtosQueueWrapperPop(messageQueue, &receivedMessage)); + TEST_ASSERT_EQUAL_UINT16(1, receivedMessage.messageId); + TEST_ASSERT_EQUAL_STRING(staticMessage, receivedMessage.content); +} + +void testMessageContentDynamicallyChangedBeforeEnqueueing() { + message_t sentMessage = {.messageId = 3}; + strcpy(sentMessage.content, staticMessage); + if (sentMessage.messageId % 2) { + strcpy(sentMessage.content, dynamicMessage); + } + + TEST_ASSERT_TRUE(freeRtosQueueWrapperPush(messageQueue, &sentMessage)); + + message_t receivedMessage; + TEST_ASSERT_TRUE(freeRtosQueueWrapperPop(messageQueue, &receivedMessage)); + TEST_ASSERT_EQUAL_UINT16(3, receivedMessage.messageId); + TEST_ASSERT_EQUAL_STRING(dynamicMessage, receivedMessage.content); +} + +void testQueueOverflowAfterMaxSizeReached() { + message_t message; + for (int i = 0; i < QUEUE_SIZE; i++) { + message.messageId = i; + strcpy(message.content, staticMessage); + TEST_ASSERT_TRUE(freeRtosQueueWrapperPush(messageQueue, &message)); + } + + message.messageId = QUEUE_SIZE + 1; + strcpy(message.content, staticMessage); + TEST_ASSERT_FALSE(freeRtosQueueWrapperPush(messageQueue, &message)); +} + +void setUp() {} +void tearDown() {} +void deInit() { + rom_reset_usb_boot(0, 0); +} + +void testRunnerTask() { + PRINT_DEBUG("Starting Unity tests..."); + UNITY_BEGIN(); + RUN_TEST(testCreateQueueSuccessful); + RUN_TEST(testBasicMessageExchange); + RUN_TEST(testMessageContentDynamicallyChangedBeforeEnqueueing); + RUN_TEST(testQueueOverflowAfterMaxSizeReached); + UNITY_END(); + PRINT_DEBUG("Unity tests finished..."); + deInit(); +} + +int main(void) { + init(); + + PRINT_DEBUG("Creating queue..."); + messageQueue = freeRtosQueueWrapperCreate(QUEUE_SIZE, sizeof(message_t)); + + PRINT_DEBUG("Registering test task..."); + freeRtosTaskWrapperRegisterTask(testRunnerTask, "test_runner", 1, FREERTOS_CORE_0); + + PRINT_DEBUG("Starting FreeRTOS scheduler..."); + freeRtosTaskWrapperStartScheduler(); +}