Test: Watchdog: Update the test case teardown

Replace the thread used in the test case teardown with a Ticker to allow
testing with the bare metal profile. This Ticker is used to prevent the
watchdog from resetting the device during the final greentea
communication.
pull/12182/head
Filip Jagodzinski 2020-01-02 17:31:32 +01:00
parent de798c4f37
commit 5a0fafdc89
4 changed files with 30 additions and 77 deletions

View File

@ -73,18 +73,6 @@ using utest::v1::Harness;
using namespace mbed;
Thread wdg_kicking_thread(osPriorityNormal, 768);
Semaphore kick_wdg_during_test_teardown(0, 1);
void wdg_kicking_thread_fun()
{
kick_wdg_during_test_teardown.wait();
while (true) {
hal_watchdog_kick();
wait_ms(20);
}
}
void test_max_timeout_is_valid()
{
Watchdog &watchdog = Watchdog::get_instance();
@ -172,8 +160,10 @@ utest::v1::status_t case_teardown_sync_on_reset(const Case *const source, const
if (CASE_IGNORED) {
return utest::v1::greentea_case_teardown_handler(source, passed, failed, failure);
}
// Unlock kicking the watchdog during teardown.
kick_wdg_during_test_teardown.release();
// Start kicking the watchdog during teardown.
hal_watchdog_kick();
Ticker wdg_kicking_ticker;
wdg_kicking_ticker.attach_us(mbed::callback(hal_watchdog_kick), 20000);
utest::v1::status_t status = utest::v1::greentea_case_teardown_handler(source, passed, failed, failure);
if (failed) {
/* Return immediately and skip the device reset, if the test case failed.
@ -260,10 +250,6 @@ int testsuite_setup_sync_on_reset(const size_t number_of_cases)
return utest::v1::STATUS_ABORT;
}
// The thread is started here, but feeding the watchdog will start
// when the semaphore is released during a test case teardown.
wdg_kicking_thread.start(mbed::callback(wdg_kicking_thread_fun));
utest_printf("Starting with test case index %i of all %i defined test cases.\n", CASE_INDEX_START, number_of_cases);
return CASE_INDEX_START;
}

View File

@ -90,18 +90,7 @@ struct testcase_data {
testcase_data current_case;
Thread wdg_kicking_thread(osPriorityNormal, 768);
Semaphore kick_wdg_during_test_teardown(0, 1);
void wdg_kicking_thread_fun()
{
kick_wdg_during_test_teardown.acquire();
Watchdog &watchdog = Watchdog::get_instance();
while (true) {
watchdog.kick();
wait_us(20000);
}
}
Ticker wdg_kicking_ticker;
bool send_reset_notification(testcase_data *tcdata, uint32_t delay_ms)
{
@ -140,7 +129,8 @@ void test_simple_reset()
// Watchdog reset should have occurred during a wait above.
kick_wdg_during_test_teardown.release(); // For testsuite failure handling.
hal_watchdog_kick();
wdg_kicking_ticker.attach_us(mbed::callback(hal_watchdog_kick), 20000); // For testsuite failure handling.
TEST_ASSERT_MESSAGE(0, "Watchdog did not reset the device as expected.");
}
@ -174,7 +164,8 @@ void test_sleep_reset()
// Watchdog reset should have occurred during the sleep above.
kick_wdg_during_test_teardown.release(); // For testsuite failure handling.
hal_watchdog_kick();
wdg_kicking_ticker.attach_us(mbed::callback(hal_watchdog_kick), 20000); // For testsuite failure handling.
TEST_ASSERT_MESSAGE(0, "Watchdog did not reset the device as expected.");
}
@ -210,7 +201,8 @@ void test_deepsleep_reset()
// Watchdog reset should have occurred during the deepsleep above.
kick_wdg_during_test_teardown.release(); // For testsuite failure handling.
hal_watchdog_kick();
wdg_kicking_ticker.attach_us(mbed::callback(hal_watchdog_kick), 20000); // For testsuite failure handling.
TEST_ASSERT_MESSAGE(0, "Watchdog did not reset the device as expected.");
}
#endif
@ -255,7 +247,8 @@ void test_restart_reset()
// Watchdog reset should have occurred during a wait above.
kick_wdg_during_test_teardown.release(); // For testsuite failure handling.
hal_watchdog_kick();
wdg_kicking_ticker.attach_us(mbed::callback(hal_watchdog_kick), 20000); // For testsuite failure handling.
TEST_ASSERT_MESSAGE(0, "Watchdog did not reset the device as expected.");
}
@ -288,7 +281,8 @@ void test_kick_reset()
// Watchdog reset should have occurred during a wait above.
kick_wdg_during_test_teardown.release(); // For testsuite failure handling.
hal_watchdog_kick();
wdg_kicking_ticker.attach_us(mbed::callback(hal_watchdog_kick), 20000); // For testsuite failure handling.
TEST_ASSERT_MESSAGE(0, "Watchdog did not reset the device as expected.");
}
@ -323,10 +317,6 @@ int testsuite_setup(const size_t number_of_cases)
return utest::v1::STATUS_ABORT;
}
// The thread is started here, but feeding the watchdog will start
// when the semaphore is released during a test case teardown.
wdg_kicking_thread.start(mbed::callback(wdg_kicking_thread_fun));
utest_printf("This test suite is composed of %i test cases. Starting at index %i.\n", number_of_cases,
current_case.start_index);
return current_case.start_index;

View File

@ -73,18 +73,6 @@ using utest::v1::Harness;
const watchdog_config_t WDG_CONFIG_DEFAULT = { .timeout_ms = WDG_TIMEOUT_MS };
Thread wdg_kicking_thread(osPriorityNormal, 768);
Semaphore kick_wdg_during_test_teardown(0, 1);
void wdg_kicking_thread_fun()
{
kick_wdg_during_test_teardown.wait();
while (true) {
hal_watchdog_kick();
wait_ms(20);
}
}
void test_max_timeout_is_valid()
{
TEST_ASSERT(hal_watchdog_get_platform_features().max_timeout > 1UL);
@ -168,8 +156,10 @@ utest::v1::status_t case_teardown_sync_on_reset(const Case *const source, const
if (CASE_IGNORED) {
return utest::v1::greentea_case_teardown_handler(source, passed, failed, failure);
}
// Unlock kicking the watchdog during teardown.
kick_wdg_during_test_teardown.release();
// Start kicking the watchdog during teardown.
hal_watchdog_kick();
Ticker wdg_kicking_ticker;
wdg_kicking_ticker.attach_us(mbed::callback(hal_watchdog_kick), 20000);
utest::v1::status_t status = utest::v1::greentea_case_teardown_handler(source, passed, failed, failure);
if (failed) {
/* Return immediately and skip the device reset, if the test case failed.
@ -256,10 +246,6 @@ int testsuite_setup_sync_on_reset(const size_t number_of_cases)
return utest::v1::STATUS_ABORT;
}
// The thread is started here, but feeding the watchdog will start
// when the semaphore is released during a test case teardown.
wdg_kicking_thread.start(mbed::callback(wdg_kicking_thread_fun));
utest_printf("Starting with test case index %i of all %i defined test cases.\n", CASE_INDEX_START, number_of_cases);
return CASE_INDEX_START;
}

View File

@ -88,17 +88,7 @@ struct testcase_data {
testcase_data current_case;
Thread wdg_kicking_thread(osPriorityNormal, 768);
Semaphore kick_wdg_during_test_teardown(0, 1);
void wdg_kicking_thread_fun()
{
kick_wdg_during_test_teardown.acquire();
while (true) {
hal_watchdog_kick();
wait_us(20000);
}
}
Ticker wdg_kicking_ticker;
bool send_reset_notification(testcase_data *tcdata, uint32_t delay_ms)
{
@ -135,7 +125,8 @@ void test_simple_reset()
// Watchdog reset should have occurred during a wait above.
kick_wdg_during_test_teardown.release(); // For testsuite failure handling.
hal_watchdog_kick();
wdg_kicking_ticker.attach_us(mbed::callback(hal_watchdog_kick), 20000); // For testsuite failure handling.
TEST_ASSERT_MESSAGE(0, "Watchdog did not reset the device as expected.");
}
@ -167,7 +158,8 @@ void test_sleep_reset()
// Watchdog reset should have occurred during the sleep above.
kick_wdg_during_test_teardown.release(); // For testsuite failure handling.
hal_watchdog_kick();
wdg_kicking_ticker.attach_us(mbed::callback(hal_watchdog_kick), 20000); // For testsuite failure handling.
TEST_ASSERT_MESSAGE(0, "Watchdog did not reset the device as expected.");
}
@ -201,7 +193,8 @@ void test_deepsleep_reset()
// Watchdog reset should have occurred during the deepsleep above.
kick_wdg_during_test_teardown.release(); // For testsuite failure handling.
hal_watchdog_kick();
wdg_kicking_ticker.attach_us(mbed::callback(hal_watchdog_kick), 20000); // For testsuite failure handling.
TEST_ASSERT_MESSAGE(0, "Watchdog did not reset the device as expected.");
}
#endif
@ -242,7 +235,8 @@ void test_restart_reset()
// Watchdog reset should have occurred during a wait above.
kick_wdg_during_test_teardown.release(); // For testsuite failure handling.
hal_watchdog_kick();
wdg_kicking_ticker.attach_us(mbed::callback(hal_watchdog_kick), 20000); // For testsuite failure handling.
TEST_ASSERT_MESSAGE(0, "Watchdog did not reset the device as expected.");
}
@ -273,7 +267,8 @@ void test_kick_reset()
// Watchdog reset should have occurred during a wait above.
kick_wdg_during_test_teardown.release(); // For testsuite failure handling.
hal_watchdog_kick();
wdg_kicking_ticker.attach_us(mbed::callback(hal_watchdog_kick), 20000); // For testsuite failure handling.
TEST_ASSERT_MESSAGE(0, "Watchdog did not reset the device as expected.");
}
@ -308,10 +303,6 @@ int testsuite_setup(const size_t number_of_cases)
return utest::v1::STATUS_ABORT;
}
// The thread is started here, but feeding the watchdog will start
// when the semaphore is released during a test case teardown.
wdg_kicking_thread.start(mbed::callback(wdg_kicking_thread_fun));
utest_printf("This test suite is composed of %i test cases. Starting at index %i.\n", number_of_cases,
current_case.start_index);
return current_case.start_index;