From 4a50b334349a9b59a8f789927097222785a3c48d Mon Sep 17 00:00:00 2001 From: sheinz Date: Tue, 25 Oct 2016 13:08:27 +0300 Subject: [PATCH] Add timers test case --- tests/cases/06_timers.c | 86 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 tests/cases/06_timers.c diff --git a/tests/cases/06_timers.c b/tests/cases/06_timers.c new file mode 100644 index 0000000..d203672 --- /dev/null +++ b/tests/cases/06_timers.c @@ -0,0 +1,86 @@ +#include +#include +#include "FreeRTOS.h" +#include "task.h" +#include "etstimer.h" + +#include "testcase.h" + +DEFINE_SOLO_TESTCASE(06_ets_timers); + +typedef struct { + ETSTimer handle; + uint32_t start_time; + uint32_t fire_count; +} test_timer_t; + +#define TEST_TIMERS_NUMBER 2 +static test_timer_t timers[TEST_TIMERS_NUMBER]; + +static uint32_t get_current_time() +{ + return timer_get_count(FRC2) / 5000; // to get roughly 1ms resolution +} + +static void timer_0_cb(void *arg) +{ + uint32_t v = (uint32_t)arg; + uint32_t delay = get_current_time() - timers[0].start_time; + timers[0].fire_count++; + + TEST_ASSERT_EQUAL_UINT32_MESSAGE(0xAA, v, "Timer 0 argument invalid"); + TEST_ASSERT_EQUAL_INT_MESSAGE(1, timers[0].fire_count, "Timer 0 repeat error"); + + printf("Timer 0 delay: %d\n", delay); + // Timer should fire in 100ms + TEST_ASSERT_INT_WITHIN_MESSAGE(5, 100, delay, "Timer 0 time wrong"); +} + +static void timer_1_cb(void *arg) +{ + uint32_t v = (uint32_t)arg; + uint32_t delay = get_current_time() - timers[1].start_time; + + timers[1].start_time = get_current_time(); + timers[1].fire_count++; + + TEST_ASSERT_EQUAL_UINT32_MESSAGE(0xBB, v, "Timer 1 argument invalid"); + TEST_ASSERT_TRUE_MESSAGE(timers[1].fire_count < 6, + "Timer 1 repeats after disarming"); + + printf("Timer 1 delay: %d\n", delay); + // Timer should fire in 100ms + TEST_ASSERT_INT_WITHIN_MESSAGE(5, 50, delay, "Timer 1 time wrong"); + + if (timers[1].fire_count == 5) { + sdk_ets_timer_disarm(&timers[1].handle); + } +} + +static void test_task(void *pvParameters) +{ + sdk_ets_timer_disarm(&timers[0].handle); + sdk_ets_timer_setfn(&timers[0].handle, timer_0_cb, (void*)0xAA); + timers[0].start_time = get_current_time(); + sdk_ets_timer_arm(&timers[0].handle, 100, false); + + sdk_ets_timer_disarm(&timers[1].handle); + sdk_ets_timer_setfn(&timers[1].handle, timer_1_cb, (void*)0xBB); + timers[1].start_time = get_current_time(); + sdk_ets_timer_arm(&timers[1].handle, 50, true); // repeating timer + + vTaskDelay(500 / portTICK_RATE_MS); + + TEST_ASSERT_EQUAL_INT_MESSAGE(1, timers[0].fire_count, + "Timer hasn't fired"); + + TEST_ASSERT_EQUAL_INT_MESSAGE(5, timers[1].fire_count, + "Timer fire count isn't correct"); + + TEST_PASS(); +} + +static void a_06_ets_timers(void) +{ + xTaskCreate(test_task, (signed char *)"test_task", 256, NULL, 2, NULL); +}