summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVic Yang <victoryang@chromium.org>2013-05-11 23:30:01 +0800
committerChromeBot <chrome-bot@google.com>2013-05-14 09:25:03 -0700
commitfa9c222a7936a74a405cc254e1bdc7baa9cd65b2 (patch)
tree035cd67081778127ab3fe0631a794d12bbd8c733
parente1c0b58c9638798fd51577b137d714038be5c1b7 (diff)
downloadchrome-ec-fa9c222a7936a74a405cc254e1bdc7baa9cd65b2.tar.gz
Add hook test
Test of hook functionality. BUG=chrome-os-partner:19236 TEST=Pass the test BRANCH=None Change-Id: I4700f3061edd0707932e935a719fc73c3976892e Signed-off-by: Vic Yang <victoryang@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/50957 Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
-rw-r--r--core/host/main.c3
-rw-r--r--include/test_util.h13
-rw-r--r--test/build.mk3
-rw-r--r--test/hooks.c127
-rw-r--r--test/hooks.tasklist17
5 files changed, 161 insertions, 2 deletions
diff --git a/core/host/main.c b/core/host/main.c
index f370e4b561..e96dc40faa 100644
--- a/core/host/main.c
+++ b/core/host/main.c
@@ -5,6 +5,7 @@
/* Entry point of unit test executable */
+#include "hooks.h"
#include "task.h"
#include "timer.h"
@@ -12,6 +13,8 @@ int main(void)
{
timer_init();
+ hook_init();
+
task_start();
return 0;
diff --git a/include/test_util.h b/include/test_util.h
index 40ce8c2633..e940beda1c 100644
--- a/include/test_util.h
+++ b/include/test_util.h
@@ -26,7 +26,18 @@
#define TEST_ASSERT(n) \
do { \
if (!(n)) { \
- ccprintf("ASSERTION failed: %s\n", #n); \
+ ccprintf("%d: ASSERTION failed: %s\n", __LINE__, #n); \
+ return EC_ERROR_UNKNOWN; \
+ } \
+ } while (0)
+
+#define __ABS(n) ((n) > 0 ? (n) : -(n))
+
+#define TEST_ASSERT_ABS_LESS(n, t) \
+ do { \
+ if (__ABS(n) >= t) { \
+ ccprintf("%d: ASSERT_ABS_LESS failed: abs(%d) is " \
+ "not less than %d\n", __LINE__, n, t); \
return EC_ERROR_UNKNOWN; \
} \
} while (0)
diff --git a/test/build.mk b/test/build.mk
index 9121d03d1b..1c1b8dd713 100644
--- a/test/build.mk
+++ b/test/build.mk
@@ -25,9 +25,10 @@ test-list-$(BOARD_link)=
test-list-$(BOARD_slippy)=
# Emulator tests
-test-list-host=mutex pingpong utils kb_scan kb_mkbp lid_sw power_button
+test-list-host=mutex pingpong utils kb_scan kb_mkbp lid_sw power_button hooks
flash-y=flash.o
+hooks-y=hooks.o
kb_mkbp-y=kb_mkbp.o
kb_scan-y=kb_scan.o
lid_sw-y=lid_sw.o
diff --git a/test/hooks.c b/test/hooks.c
new file mode 100644
index 0000000000..1ece19e9cf
--- /dev/null
+++ b/test/hooks.c
@@ -0,0 +1,127 @@
+/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * Test hooks.
+ */
+
+#include "common.h"
+#include "console.h"
+#include "hooks.h"
+#include "test_util.h"
+#include "timer.h"
+#include "util.h"
+
+static int init_hook_count;
+static int tick_hook_count;
+static int tick2_hook_count;
+static int tick_count_seen_by_tick2;
+static timestamp_t tick_time[2];
+static int second_hook_count;
+static timestamp_t second_time[2];
+static int deferred_call_count;
+
+static void init_hook(void)
+{
+ init_hook_count++;
+}
+DECLARE_HOOK(HOOK_INIT, init_hook, HOOK_PRIO_DEFAULT);
+
+static void tick_hook(void)
+{
+ tick_hook_count++;
+ tick_time[0] = tick_time[1];
+ tick_time[1] = get_time();
+}
+DECLARE_HOOK(HOOK_TICK, tick_hook, HOOK_PRIO_DEFAULT);
+
+static void tick2_hook(void)
+{
+ tick2_hook_count++;
+ tick_count_seen_by_tick2 = tick_hook_count;
+}
+DECLARE_HOOK(HOOK_TICK, tick2_hook, HOOK_PRIO_DEFAULT+1);
+
+static void second_hook(void)
+{
+ second_hook_count++;
+ second_time[0] = second_time[1];
+ second_time[1] = get_time();
+}
+DECLARE_HOOK(HOOK_SECOND, second_hook, HOOK_PRIO_DEFAULT);
+
+static void deferred_func(void)
+{
+ deferred_call_count++;
+}
+DECLARE_DEFERRED(deferred_func);
+
+static int test_init(void)
+{
+ TEST_ASSERT(init_hook_count == 1);
+ return EC_SUCCESS;
+}
+
+static int test_ticks(void)
+{
+ uint64_t interval;
+ int error_pct;
+
+ usleep(1500 * MSEC);
+
+ 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, 3);
+
+ interval = second_time[1].val - second_time[0].val;
+ error_pct = (interval - 1000 * MSEC) * 100 / (1000 * MSEC);
+ TEST_ASSERT_ABS_LESS(error_pct, 3);
+
+ return EC_SUCCESS;
+}
+
+static int 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;
+}
+
+static int test_deferred(void)
+{
+ deferred_call_count = 0;
+ hook_call_deferred(deferred_func, 10 * MSEC);
+ usleep(11 * MSEC);
+ TEST_ASSERT(deferred_call_count == 1);
+
+ hook_call_deferred(deferred_func, 10 * MSEC);
+ usleep(5 * MSEC);
+ hook_call_deferred(deferred_func, -1);
+ usleep(10 * MSEC);
+ TEST_ASSERT(deferred_call_count == 1);
+
+ hook_call_deferred(deferred_func, 10 * MSEC);
+ usleep(5 * MSEC);
+ hook_call_deferred(deferred_func, -1);
+ usleep(3 * MSEC);
+ hook_call_deferred(deferred_func, 5 * MSEC);
+ usleep(10 * MSEC);
+ TEST_ASSERT(deferred_call_count == 2);
+
+ return EC_SUCCESS;
+}
+
+void run_test(void)
+{
+ test_reset();
+
+ RUN_TEST(test_init);
+ RUN_TEST(test_ticks);
+ RUN_TEST(test_priority);
+ RUN_TEST(test_deferred);
+
+ test_print_result();
+}
diff --git a/test/hooks.tasklist b/test/hooks.tasklist
new file mode 100644
index 0000000000..26cfc53453
--- /dev/null
+++ b/test/hooks.tasklist
@@ -0,0 +1,17 @@
+/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+/**
+ * List of enabled tasks in the priority order
+ *
+ * The first one has the lowest priority.
+ *
+ * For each task, use the macro TASK_TEST(n, r, d, s) where :
+ * 'n' in the name of the task
+ * 'r' in the main routine of the task
+ * 'd' in an opaque parameter passed to the routine at startup
+ * 's' is the stack size in bytes; must be a multiple of 8
+ */
+#define CONFIG_TEST_TASK_LIST /* No test task */