From 4a50b334349a9b59a8f789927097222785a3c48d Mon Sep 17 00:00:00 2001
From: sheinz <shein@bk.ru>
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 <stdlib.h>
+#include <string.h>
+#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);
+}