/** * @file CatchRunner.cpp * @brief Source file to compile catch framework. * @details All tests should be written in other files. * For eclipse console output, install ANSI Escape in Console * from the eclipse market place to get colored characters. */ #include "CatchRunner.h" #define CATCH_CONFIG_COLOUR_WINDOWS #include #include #ifdef FSFW_OSAL_FREERTOS #include #include "task.h" #endif extern int customSetup(); extern int customTeardown(); #ifdef FSFW_OSAL_FREERTOS struct Taskparameters { int argc; char** argv; TaskHandle_t catchTask; } taskParameters; void unittestTaskFunction(void* pvParameters) { Taskparameters* parameters = (Taskparameters*)pvParameters; int result = Catch::Session().run(parameters->argc, parameters->argv); vTaskDelay(pdMS_TO_TICKS(10)); vTaskSuspendAll(); vTaskDelete(parameters->catchTask); customTeardown(); exit(result); } #endif #ifdef FSFW_OSAL_RTEMS #include int sigaltstack(const stack_t* ss, stack_t* old_ss) { return 0; } extern "C" { void exit_qemu_failing(int error) { asm(/* 0x20026 == ADP_Stopped_ApplicationExit */ "mov x1, #0x26\n\t" "movk x1, #2, lsl #16\n\t" "str x1, [sp,#0]\n\t"); /* Exit status code. Host QEMU process exits with that status. */ asm("mov x0, %[error]\n\t" : : [error] "r"(error)); asm("str x0, [sp,#8]\n\t" /* x1 contains the address of parameter block. * Any memory address could be used. */ "mov x1, sp\n\t" /* SYS_EXIT */ "mov w0, #0x18\n\t" /* Do the semihosting call on A64. */ "hlt 0xf000\n\t"); } #include void user_handle_fatal(Internal_errors_Source source, bool internal, Internal_errors_t error_code) { if (source == RTEMS_FATAL_SOURCE_EXIT) { if (error_code != 0) { printk("*** EXIT STATUS NOT ZERO ***\n"); printk("Quitting qemu with exit code %i\n", error_code); exit_qemu_failing(error_code); } } } rtems_task Init(rtems_task_argument ignored) { rtems_time_of_day now; now.year = 2023; now.month = 1; now.day = 15; now.hour = 0; now.minute = 0; now.second = 0; now.ticks = 0; rtems_clock_set(&now); customSetup(); const char* argv[] = {"fsfw-test", ""}; int result = Catch::Session().run(1, argv); customTeardown(); exit(result); } } #endif int main(int argc, char* argv[]) { customSetup(); int result = 0; #ifdef FSFW_OSAL_FREERTOS xTaskCreate( unittestTaskFunction, /* The function that implements the task. */ "Unittests", /* The text name assigned to the task - for debug only as it is not used by the kernel. */ configMINIMAL_STACK_SIZE, /* The size of the stack to allocate to the task. */ &taskParameters, /* The parameter passed to the task - not used in this simple case. */ 1, /* The priority assigned to the task. */ &taskParameters.catchTask); /* The task handle is not required, so NULL is passed. */ taskParameters.argc = argc; taskParameters.argv = argv; vTaskStartScheduler(); #else // Catch internal function call result = Catch::Session().run(argc, argv); #endif // global clean-up customTeardown(); return result; }