summaryrefslogtreecommitdiff
path: root/cts/hook/dut.c
diff options
context:
space:
mode:
Diffstat (limited to 'cts/hook/dut.c')
-rw-r--r--cts/hook/dut.c128
1 files changed, 81 insertions, 47 deletions
diff --git a/cts/hook/dut.c b/cts/hook/dut.c
index 36494916b9..8be9121128 100644
--- a/cts/hook/dut.c
+++ b/cts/hook/dut.c
@@ -7,10 +7,12 @@
#include "common.h"
#include "console.h"
+#include "cts_common.h"
+#include "dut_common.h"
#include "hooks.h"
-#include "test_util.h"
#include "timer.h"
#include "util.h"
+#include "watchdog.h"
static int init_hook_count;
static int tick_hook_count;
@@ -41,7 +43,7 @@ static void tick2_hook(void)
tick_count_seen_by_tick2 = tick_hook_count;
}
/* tick2_hook() prio means it should be called after tick_hook() */
-DECLARE_HOOK(HOOK_TICK, tick2_hook, HOOK_PRIO_DEFAULT+1);
+DECLARE_HOOK(HOOK_TICK, tick2_hook, HOOK_PRIO_DEFAULT + 1);
static void second_hook(void)
{
@@ -57,22 +59,23 @@ static void deferred_func(void)
}
DECLARE_DEFERRED(deferred_func);
-static void non_deferred_func(void)
+static void invalid_deferred_func(void)
{
deferred_call_count++;
}
-static const struct deferred_data non_deferred_func_data = {
- non_deferred_func
+static const struct deferred_data invalid_deferred_func_data = {
+ invalid_deferred_func
};
-static int test_init_hook(void)
+static enum cts_rc test_init_hook(void)
{
- TEST_ASSERT(init_hook_count == 1);
- return EC_SUCCESS;
+ if (init_hook_count != 1)
+ return CTS_RC_FAILURE;
+ return CTS_RC_SUCCESS;
}
-static int test_ticks(void)
+static enum cts_rc test_ticks(void)
{
int64_t interval;
int error_pct;
@@ -82,66 +85,97 @@ static int test_ticks(void)
* task starts. We only need to wait for just more than a second
* to allow it fires for the second time.
*/
- usleep(1300 * MSEC);
+ msleep(1300);
interval = tick_time[1].val - tick_time[0].val;
error_pct = (interval - HOOK_TICK_INTERVAL) * 100 /
HOOK_TICK_INTERVAL;
- TEST_ASSERT_ABS_LESS(error_pct, 10);
+ if (error_pct < -10 || 10 < error_pct) {
+ CPRINTS("tick error=%d%% interval=%ld", error_pct, interval);
+ return CTS_RC_FAILURE;
+ }
interval = second_time[1].val - second_time[0].val;
error_pct = (interval - SECOND) * 100 / SECOND;
- TEST_ASSERT_ABS_LESS(error_pct, 10);
+ if (error_pct < -10 || 10 < error_pct) {
+ CPRINTS("second error=%d%% interval=%ld", error_pct, interval);
+ return CTS_RC_FAILURE;
+ }
- return EC_SUCCESS;
+ return CTS_RC_SUCCESS;
}
-static int test_priority(void)
+static enum cts_rc test_priority(void)
{
usleep(HOOK_TICK_INTERVAL);
- TEST_ASSERT(tick_hook_count == tick2_hook_count);
- TEST_ASSERT(tick_hook_count == tick_count_seen_by_tick2);
-
- return EC_SUCCESS;
+ if (tick_hook_count != tick2_hook_count)
+ return CTS_RC_FAILURE;
+ if (tick_hook_count != tick_count_seen_by_tick2)
+ return CTS_RC_FAILURE;
+ return CTS_RC_SUCCESS;
}
-static int test_deferred(void)
+static enum cts_rc test_deferred(void)
{
deferred_call_count = 0;
hook_call_deferred(&deferred_func_data, 50 * MSEC);
- usleep(100 * MSEC);
- TEST_ASSERT(deferred_call_count == 1);
-
- hook_call_deferred(&deferred_func_data, 50 * MSEC);
- usleep(25 * MSEC);
- hook_call_deferred(&deferred_func_data, -1);
- usleep(75 * MSEC);
- TEST_ASSERT(deferred_call_count == 1);
-
+ if (deferred_call_count != 0) {
+ CPRINTL("deferred_call_count=%d", deferred_call_count);
+ return CTS_RC_FAILURE;
+ }
+ msleep(100);
+ if (deferred_call_count != 1) {
+ CPRINTL("deferred_call_count=%d", deferred_call_count);
+ return CTS_RC_FAILURE;
+ }
+
+ /* Test cancellation */
+ deferred_call_count = 0;
hook_call_deferred(&deferred_func_data, 50 * MSEC);
- usleep(25 * MSEC);
+ msleep(25);
hook_call_deferred(&deferred_func_data, -1);
- usleep(15 * MSEC);
- hook_call_deferred(&deferred_func_data, 25 * MSEC);
- usleep(50 * MSEC);
- TEST_ASSERT(deferred_call_count == 2);
+ msleep(75);
+ if (deferred_call_count != 0) {
+ CPRINTL("deferred_call_count=%d", deferred_call_count);
+ return CTS_RC_FAILURE;
+ }
- TEST_ASSERT(hook_call_deferred(&non_deferred_func_data, 50 * MSEC) !=
- EC_SUCCESS);
- usleep(100 * MSEC);
- TEST_ASSERT(deferred_call_count == 2);
-
- return EC_SUCCESS;
+ /* Invalid deferred function */
+ deferred_call_count = 0;
+ if (hook_call_deferred(&invalid_deferred_func_data, 50 * MSEC)
+ == EC_SUCCESS) {
+ CPRINTL("non_deferred_func_data");
+ return CTS_RC_FAILURE;
+ }
+ msleep(100);
+ if (deferred_call_count != 0) {
+ CPRINTL("deferred_call_count=%d", deferred_call_count);
+ return CTS_RC_FAILURE;
+ }
+
+ return CTS_RC_SUCCESS;
}
+#include "cts_testlist.h"
+
void cts_task(void)
{
- test_reset();
-
- RUN_TEST(test_init_hook);
- RUN_TEST(test_ticks);
- RUN_TEST(test_priority);
- RUN_TEST(test_deferred);
-
- test_print_result();
+ enum cts_rc result;
+ int i;
+
+ cflush();
+ for (i = 0; i < CTS_TEST_ID_COUNT; i++) {
+ sync();
+ CPRINTF("\n%s start\n", tests[i].name);
+ result = tests[i].run();
+ CPRINTF("\n%s end %d\n", tests[i].name, result);
+ cflush();
+ }
+
+ CPRINTS("Hook test finished");
+ cflush();
+ while (1) {
+ watchdog_reload();
+ sleep(1);
+ }
}