diff --git a/CMakeLists.txt b/CMakeLists.txt index a3c93d09..6e1b231b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,10 @@ cmake_minimum_required(VERSION 3.16) include(common.cmake) +# No exceptions in app builds (this is different in test builds). +idf_build_set_property(COMPILE_OPTIONS "-DRESULT_DISABLE_EXCEPTIONS" APPEND) + +# Include all app components. +list(APPEND EXTRA_COMPONENT_DIRS "$ENV{PROJ_PATH}/src") + project(gay-ipod-fw) diff --git a/common.cmake b/common.cmake index 59121379..7a947fdf 100644 --- a/common.cmake +++ b/common.cmake @@ -14,9 +14,6 @@ list(APPEND EXTRA_COMPONENT_DIRS "$ENV{PROJ_PATH}/lib/result") list(APPEND EXTRA_COMPONENT_DIRS "$ENV{PROJ_PATH}/lib/lvgl") list(APPEND EXTRA_COMPONENT_DIRS "$ENV{PROJ_PATH}/lib/catch2") -# Project components -list(APPEND EXTRA_COMPONENT_DIRS "$ENV{PROJ_PATH}/src") - include($ENV{IDF_PATH}/tools/cmake/project.cmake) # Additional warnings used when compiling our components. @@ -30,5 +27,4 @@ set(EXTRA_WARNINGS "-Wshadow" "-Wnon-virtual-dtor" "-Wunused" # Extra build flags that should apply to the entire build. This should mostly # just be used to setting flags that our external dependencies requires. # Otherwise, prefer adding per-component build flags to keep things neat. -idf_build_set_property( - COMPILE_OPTIONS "-DRESULT_DISABLE_EXCEPTIONS -DLV_CONF_INCLUDE_SIMPLE" APPEND) +idf_build_set_property(COMPILE_OPTIONS "-DLV_CONF_INCLUDE_SIMPLE" APPEND) diff --git a/lib/catch2/CMakeLists.txt b/lib/catch2/CMakeLists.txt index 2714474e..ac435074 100644 --- a/lib/catch2/CMakeLists.txt +++ b/lib/catch2/CMakeLists.txt @@ -1 +1,4 @@ -idf_component_register(SRCS "catch_runner.cpp" INCLUDE_DIRS "include") +idf_component_register( + SRCS "catch_runner.cpp" + INCLUDE_DIRS "include" + REQUIRES "console") diff --git a/lib/catch2/catch_runner.cpp b/lib/catch2/catch_runner.cpp index 8cd5c120..2b8f9678 100644 --- a/lib/catch2/catch_runner.cpp +++ b/lib/catch2/catch_runner.cpp @@ -3,8 +3,28 @@ #define CATCH_CONFIG_RUNNER #include "catch2/catch.hpp" -void run_catch(void) { - int argc = 1; - char *argv = "catch2"; - Catch::Session().run( argc, &argv ); +#include +#include +#include "esp_console.h" +#include "esp_log.h" +#include "esp_system.h" + +// There must be exactly on Session instance at all times; attempting to destroy +// this will result in memory corruption. +static Catch::Session sCatchSession; + +int exec_catch2(int argc, char** argv) { + // Reset the existing configuration before applying a new one. Otherwise we + // will get the combination of all configs. + sCatchSession.configData() = Catch::ConfigData(); + + int result = sCatchSession.applyCommandLine(argc, argv); + if (result != 0) { + return result; + } + + // Returns number of failures. + int failures = sCatchSession.run(); + + return failures > 0; } diff --git a/lib/catch2/include/catch_runner.hpp b/lib/catch2/include/catch_runner.hpp index 527b7ff6..51e8c1bc 100644 --- a/lib/catch2/include/catch_runner.hpp +++ b/lib/catch2/include/catch_runner.hpp @@ -1,3 +1,7 @@ #pragma once -void run_catch(void); +/* + * Executes the Catch2 test runner as if called from the commandline on a + * standard unix-y system. + */ +int exec_catch2(int argc, char **argv); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index ddcc063a..8d8229d3 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,9 +1,14 @@ cmake_minimum_required(VERSION 3.16) include(../common.cmake) +idf_build_set_property( + COMPILE_OPTIONS "-DCATCH_CONFIG_NO_POSIX_SIGNALS -DCATCH_CONFIG_FAST_COMPILE" APPEND) + # Treat warnings as errors for test purposes. list(APPEND EXTRA_WARNINGS "-Werror") +list(APPEND EXTRA_COMPONENT_DIRS "$ENV{PROJ_PATH}/src/drivers") + # List all components that include tests here. set(TEST_COMPONENTS "drivers") diff --git a/test/main/CMakeLists.txt b/test/main/CMakeLists.txt index 687802d4..650dcc24 100644 --- a/test/main/CMakeLists.txt +++ b/test/main/CMakeLists.txt @@ -1 +1,4 @@ -idf_component_register(SRCS "main.cpp" INCLUDE_DIRS "." REQUIRE "catch2") +idf_component_register( + SRCS "main.cpp" + INCLUDE_DIRS "." + REQUIRES "catch2") diff --git a/test/main/main.cpp b/test/main/main.cpp index 06e733c4..8dbbda8e 100644 --- a/test/main/main.cpp +++ b/test/main/main.cpp @@ -1,17 +1,37 @@ #include #include -static void print_banner(const char* text); +#include "esp_console.h" +#include "esp_log.h" +#include "esp_system.h" -extern "C" { - void app_main(void) - { - print_banner("Running tests without [ignore] tag"); - } -} +#include "catch_runner.hpp" -static void print_banner(const char* text) -{ - printf("\n#### %s #####\n\n", text); +void register_catch2() { + esp_console_cmd_t cmd{ + .command = "catch", + .help = "Execute the catch2 test runner. Use -? for options.", + .hint = NULL, + .func = &exec_catch2, + .argtable = NULL}; + esp_console_cmd_register(&cmd); } +extern "C" void app_main(void) { + esp_console_repl_t* repl = nullptr; + esp_console_repl_config_t repl_config = ESP_CONSOLE_REPL_CONFIG_DEFAULT(); + repl_config.max_history_len = 16; + repl_config.prompt = " →"; + repl_config.max_cmdline_length = 256; + // Catch2 needs a huge stack, since it does a lot of pretty string formatting. + repl_config.task_stack_size = 1024 * 24; + + esp_console_dev_uart_config_t hw_config = + ESP_CONSOLE_DEV_UART_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_console_new_repl_uart(&hw_config, &repl_config, &repl)); + + esp_console_register_help_command(); + register_catch2(); + + ESP_ERROR_CHECK(esp_console_start_repl(repl)); +}