blob: 2d650eb7b9f638d650eabf4d2d825a2e10ae42fe [file] [log] [blame] [edit]
/*
* Copyright 2017, Data61, CSIRO (ABN 41 687 119 230)
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <autoconf.h>
#include <sel4test-driver/gen_config.h>
#include <sel4/sel4.h>
#include <vka/object.h>
#include "../timer.h"
#include <utils/util.h>
static bool test_finished;
typedef struct timer_test_data {
int curr_count;
int goal_count;
} timer_test_data_t;
static int test_callback(uintptr_t token)
{
assert(token);
timer_test_data_t *test_data = (timer_test_data_t *) token;
test_data->curr_count++;
if (test_data->curr_count == test_data->goal_count) {
test_finished = true;
}
return 0;
}
int test_timer(driver_env_t env)
{
uint64_t time = 0;
test_finished = false;
timer_test_data_t test_data = { .goal_count = 3 };
int error = tm_alloc_id_at(&env->tm, TIMER_ID);
test_assert_fatal(!error);
error = tm_register_cb(&env->tm, TIMEOUT_PERIODIC, 1 * NS_IN_S, 0, TIMER_ID,
test_callback, (uintptr_t) &test_data);
test_assert_fatal(!error);
while (!test_finished) {
wait_for_timer_interrupt(env);
ZF_LOGV("Tick\n");
error = tm_update(&env->tm);
test_assert_fatal(!error);
}
error = tm_free_id(&env->tm, TIMER_ID);
test_assert_fatal(!error);
error = ltimer_reset(&env->ltimer);
test_assert_fatal(!error);
return sel4test_get_result();
}
DEFINE_TEST_BOOTSTRAP(TIMER0001, "Basic timer testing", test_timer, config_set(CONFIG_HAVE_TIMER))
int
test_gettime_timeout(driver_env_t env)
{
int error = 0;
uint64_t start, end;
test_finished = false;
timer_test_data_t test_data = { .goal_count = 3 };
error = tm_alloc_id_at(&env->tm, TIMER_ID);
test_assert_fatal(!error);
start = timestamp(env);
error = tm_register_cb(&env->tm, TIMEOUT_PERIODIC, 1 * NS_IN_MS, 0, TIMER_ID,
test_callback, (uintptr_t) &test_data);
test_assert_fatal(!error);
while (!test_finished) {
wait_for_timer_interrupt(env);
ZF_LOGV("Tick\n");
error = tm_update(&env->tm);
test_assert_fatal(!error);
}
end = timestamp(env);
test_gt(end, start);
error = tm_free_id(&env->tm, TIMER_ID);
test_assert_fatal(!error);
error = ltimer_reset(&env->ltimer);
test_assert_fatal(!error);
return sel4test_get_result();
}
DEFINE_TEST_BOOTSTRAP(TIMER0002, "Test that the timer moves between gettime and timeout calls", test_gettime_timeout,
config_set(CONFIG_HAVE_TIMER))