Files
OpenCellular/cts/hook/dut.c
Daisuke Nojiri a82421df00 eCTS: Print start marker before sync
This patch makes each test print start marker before sync. This will
allow us to distinguish the failure before even sync is attempted
(CTS_RC_DID_NOT_START, thus probably caused by the previous test)
and the failure caused by the hanging partner, in which case the one
good and alive will be stuck in sync (and should return _DID_NOT_END
or even better _BAD_SYNC once we implement timeout in sync).

This patch also:

* Adds did_not_start_test to and removes debug_test from meta suite
* Consolidates test runner loops into common cts_main_loop
* Removes dut_common.h and th_common.h
* Removes debug print macro and CTS_DEBUG
* Replaces all infinite loops after tests with task_wait_event(-1)
* Removes meaningless comments and debug printfs
* Removes CTS_TEST_ID_*
* Adds sync() to task suite

BUG=chromium:736104
BRANCH=none
TEST=Run run_ects.sh and verify all tests pass

Change-Id: I6ccdf26afac6b8e8cb16483c5d75e4e77e7962f4
Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/545176
2017-06-27 15:52:06 -07:00

166 lines
3.8 KiB
C

/* 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 "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=%ld", 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=%ld", 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);
}