From fa9c222a7936a74a405cc254e1bdc7baa9cd65b2 Mon Sep 17 00:00:00 2001 From: Vic Yang Date: Sat, 11 May 2013 23:30:01 +0800 Subject: 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 Reviewed-on: https://gerrit.chromium.org/gerrit/50957 Reviewed-by: Vincent Palatin --- core/host/main.c | 3 ++ include/test_util.h | 13 +++++- test/build.mk | 3 +- test/hooks.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++ test/hooks.tasklist | 17 +++++++ 5 files changed, 161 insertions(+), 2 deletions(-) create mode 100644 test/hooks.c create mode 100644 test/hooks.tasklist 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 */ -- cgit v1.2.1