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>
This commit is contained in:
Vic Yang
2013-05-11 23:30:01 +08:00
committed by ChromeBot
parent e1c0b58c96
commit fa9c222a79
5 changed files with 161 additions and 2 deletions

View File

@@ -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;

View File

@@ -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)

View File

@@ -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

127
test/hooks.c Normal file
View File

@@ -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();
}

17
test/hooks.tasklist Normal file
View File

@@ -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 */