From 52cc05108e037f6ff05dfc834012bb875504dd44 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Wed, 2 Sep 2020 15:44:18 +0200 Subject: [PATCH] Revert "CXX: removed exception windowspill test" This reverts commit f3e180de726f715fcb82d031d2dff5ddbece20cd. --- components/cxx/test/test_cxx.cpp | 54 ++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/components/cxx/test/test_cxx.cpp b/components/cxx/test/test_cxx.cpp index e5cd24e71a..ad7ec00d4f 100644 --- a/components/cxx/test/test_cxx.cpp +++ b/components/cxx/test/test_cxx.cpp @@ -251,6 +251,60 @@ TEST_CASE("c++ exceptions emergency pool", "[cxx] [exceptions] [ignore] [leaks=" #endif } + +#define TIMEOUT 19 + +#define RECURSION 19 + +static esp_timer_handle_t crash_timer; + +static uint32_t result = 0; + +uint32_t calc_fac(uint32_t n) { + if (n == 1 || n == 0) { + return 1; + } else { + return n * calc_fac(n - 1); + } +} + +static void timer_cb(void *arg) { + result = calc_fac(RECURSION); +} + +// TODO: Not a unit test, refactor to integration test/system test, etc. +TEST_CASE("frequent interrupts don't interfere with c++ exceptions", "[cxx] [exceptions] [leaks=" LEAKS "]") +{// if exception workaround is disabled, this is almost guaranteed to fail + const esp_timer_create_args_t timer_args { + timer_cb, + NULL, + ESP_TIMER_TASK, + "crash_timer" + }; + + TEST_ESP_OK(esp_timer_create(&timer_args, &crash_timer)); + TEST_ESP_OK(esp_timer_start_periodic(crash_timer, TIMEOUT)); + + for (int i = 0; i < 500; i++) { + bool thrown_value = false; + try { + throw true; + } catch (bool e) { + thrown_value = e; + } + + if (thrown_value) { + printf("ex thrown %d\n", i); + } else { + printf("ex not thrown\n"); + TEST_ASSERT(false); + } + } + + TEST_ESP_OK(esp_timer_stop(crash_timer)); + TEST_ESP_OK(esp_timer_delete(crash_timer)); +} + #else // !CONFIG_COMPILER_CXX_EXCEPTIONS TEST_CASE("std::out_of_range exception when -fno-exceptions", "[cxx][reset=abort,SW_CPU_RESET]")