Skip to content

Commit

Permalink
feat(hardware-test): automated hw test for freertos queue
Browse files Browse the repository at this point in the history
Checks:
- creation of FreeRTOS queue
- basic message exchange
- changing message dynamically before pushing to queue
- overflow of queue
  • Loading branch information
Jan committed Feb 13, 2025
1 parent 36afabe commit dfb7180
Show file tree
Hide file tree
Showing 2 changed files with 131 additions and 0 deletions.
15 changes: 15 additions & 0 deletions test/hardware/AutomatedHWTests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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()
116 changes: 116 additions & 0 deletions test/hardware/AutomatedHWTests/TestFreeRTOSQueue.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
#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 testCreateQueue(void) {
TEST_ASSERT_NOT_NULL(messageQueue);
}

// tests basic message exchange
void testMessageExchange() {
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);
}

// tests if message content is dynamically changed before pushing to queue
void testDynamicMessageReplacement(void) {
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);
}

// tests if push to queue is successful up until the queue size is reached
void testQueueOverflow(void) {
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) {}
void tearDown(void) {}
void deInit() {
rom_reset_usb_boot(0, 0);
}

// runs unit tests
void testRunnerTask() {
PRINT_DEBUG("Starting Unity tests...");
UNITY_BEGIN();
RUN_TEST(testCreateQueue);
RUN_TEST(testMessageExchange);
RUN_TEST(testDynamicMessageReplacement);
RUN_TEST(testQueueOverflow);
UNITY_END();
PRINT_DEBUG("Unity tests finished...");
deInit();
}

// task for second core
_Noreturn void idleTask() {
while (1) {
freeRtosTaskWrapperTaskSleep(1000);
}
}

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);
freeRtosTaskWrapperRegisterTask(idleTask, "idle_task", 0, FREERTOS_CORE_1);

PRINT_DEBUG("Starting FreeRTOS scheduler...");
freeRtosTaskWrapperStartScheduler();
}

0 comments on commit dfb7180

Please sign in to comment.