diff options
Diffstat (limited to 'cts/hook')
-rw-r--r-- | cts/hook/cts.testlist | 2 | ||||
-rw-r--r-- | cts/hook/dut.c | 9 | ||||
-rw-r--r--[l---------] | cts/hook/th.c | 165 |
3 files changed, 169 insertions, 7 deletions
diff --git a/cts/hook/cts.testlist b/cts/hook/cts.testlist index 97b25575d4..75e1a11324 100644 --- a/cts/hook/cts.testlist +++ b/cts/hook/cts.testlist @@ -1,4 +1,4 @@ -/* Copyright 2017 The Chromium OS Authors. All rights reserved. +/* Copyright 2017 The ChromiumOS Authors * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ diff --git a/cts/hook/dut.c b/cts/hook/dut.c index f3a52ddaf4..fc6187cade 100644 --- a/cts/hook/dut.c +++ b/cts/hook/dut.c @@ -1,4 +1,4 @@ -/* Copyright 2013 The Chromium OS Authors. All rights reserved. +/* Copyright 2013 The ChromiumOS Authors * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. * @@ -88,8 +88,7 @@ static enum cts_rc test_ticks(void) msleep(1300); interval = tick_time[1].val - tick_time[0].val; - error_pct = (interval - HOOK_TICK_INTERVAL) * 100 / - HOOK_TICK_INTERVAL; + error_pct = (interval - HOOK_TICK_INTERVAL) * 100 / HOOK_TICK_INTERVAL; if (error_pct < -10 || 10 < error_pct) { CPRINTS("tick error=%d%% interval=%lld", error_pct, interval); return CTS_RC_FAILURE; @@ -142,8 +141,8 @@ static enum cts_rc test_deferred(void) /* Invalid deferred function */ deferred_call_count = 0; - if (hook_call_deferred(&invalid_deferred_func_data, 50 * MSEC) - == EC_SUCCESS) { + if (hook_call_deferred(&invalid_deferred_func_data, 50 * MSEC) == + EC_SUCCESS) { CPRINTL("non_deferred_func_data"); return CTS_RC_FAILURE; } diff --git a/cts/hook/th.c b/cts/hook/th.c index 41eab28462..fc6187cade 120000..100644 --- a/cts/hook/th.c +++ b/cts/hook/th.c @@ -1 +1,164 @@ -dut.c
\ No newline at end of file +/* Copyright 2013 The ChromiumOS Authors + * 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 "cts_common.h" +#include "hooks.h" +#include "task.h" +#include "timer.h" +#include "util.h" +#include "watchdog.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; +} +/* tick2_hook() prio means it should be called after tick_hook() */ +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 void invalid_deferred_func(void) +{ + deferred_call_count++; +} + +static const struct deferred_data invalid_deferred_func_data = { + invalid_deferred_func +}; + +static enum cts_rc test_init_hook(void) +{ + if (init_hook_count != 1) + return CTS_RC_FAILURE; + return CTS_RC_SUCCESS; +} + +static enum cts_rc test_ticks(void) +{ + int64_t interval; + int error_pct; + + /* + * HOOK_SECOND must have been fired at least once when HOOK + * task starts. We only need to wait for just more than a second + * to allow it fires for the second time. + */ + msleep(1300); + + interval = tick_time[1].val - tick_time[0].val; + error_pct = (interval - HOOK_TICK_INTERVAL) * 100 / HOOK_TICK_INTERVAL; + if (error_pct < -10 || 10 < error_pct) { + CPRINTS("tick error=%d%% interval=%lld", error_pct, interval); + return CTS_RC_FAILURE; + } + + interval = second_time[1].val - second_time[0].val; + error_pct = (interval - SECOND) * 100 / SECOND; + if (error_pct < -10 || 10 < error_pct) { + CPRINTS("second error=%d%% interval=%lld", error_pct, interval); + return CTS_RC_FAILURE; + } + + return CTS_RC_SUCCESS; +} + +static enum cts_rc test_priority(void) +{ + usleep(HOOK_TICK_INTERVAL); + 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 enum cts_rc test_deferred(void) +{ + deferred_call_count = 0; + hook_call_deferred(&deferred_func_data, 50 * MSEC); + 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); + msleep(25); + hook_call_deferred(&deferred_func_data, -1); + msleep(75); + if (deferred_call_count != 0) { + CPRINTL("deferred_call_count=%d", deferred_call_count); + return CTS_RC_FAILURE; + } + + /* 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) +{ + cts_main_loop(tests, "Hook"); + task_wait_event(-1); +} |