zephyr/tests/kernel/timer/timer_api/src/test_timer_api.c
David B. Kinder ac74d8b652 license: Replace Apache boilerplate with SPDX tag
Replace the existing Apache 2.0 boilerplate header with an SPDX tag
throughout the zephyr code tree. This patch was generated via a
script run over the master branch.

Also updated doc/porting/application.rst that had a dependency on
line numbers in a literal include.

Manually updated subsys/logging/sys_log.c that had a malformed
header in the original file.  Also cleanup several cases that already
had a SPDX tag and we either got a duplicate or missed updating.

Jira: ZEP-1457

Change-Id: I6131a1d4ee0e58f5b938300c2d2fc77d2e69572c
Signed-off-by: David B. Kinder <david.b.kinder@intel.com>
Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
2017-01-19 03:50:58 +00:00

267 lines
6.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (c) 2016 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "test_timer.h"
#include <ztest.h>
#define DURATION 100
#define PERIOD 50
#define EXPIRE_TIMES 4
static void duration_expire(struct k_timer *timer);
static void duration_stop(struct k_timer *timer);
/** TESTPOINT: init timer via K_TIMER_DEFINE */
K_TIMER_DEFINE(ktimer, duration_expire, duration_stop);
static struct k_timer timer;
static struct timer_data tdata;
#define TIMER_ASSERT(exp, tmr) \
do { \
if (!(exp)) { \
k_timer_stop(tmr); \
assert_true(exp, NULL); \
} \
} while (0)
static void init_timer_data(void)
{
tdata.expire_cnt = 0;
tdata.stop_cnt = 0;
}
/* entry routines */
static void duration_expire(struct k_timer *timer)
{
/** TESTPOINT: expire function */
tdata.expire_cnt++;
if (tdata.expire_cnt == 1) {
TIMER_ASSERT(k_uptime_delta(&tdata.timestamp) >= DURATION,
timer);
} else {
TIMER_ASSERT(k_uptime_delta(&tdata.timestamp) >= PERIOD, timer);
}
tdata.timestamp = k_uptime_get();
if (tdata.expire_cnt >= EXPIRE_TIMES) {
k_timer_stop(timer);
}
}
static void duration_stop(struct k_timer *timer)
{
tdata.stop_cnt++;
}
static void period0_expire(struct k_timer *timer)
{
tdata.expire_cnt++;
}
static void status_expire(struct k_timer *timer)
{
/** TESTPOINT: status get upon timer expired */
TIMER_ASSERT(k_timer_status_get(timer) == 1, timer);
/** TESTPOINT: remaining get upon timer expired */
TIMER_ASSERT(k_timer_remaining_get(timer) >= PERIOD, timer);
if (tdata.expire_cnt >= EXPIRE_TIMES) {
k_timer_stop(timer);
}
}
static void busy_wait_ms(int32_t ms)
{
int32_t deadline = k_uptime_get() + ms;
volatile int32_t now = k_uptime_get();
while (now < deadline) {
now = k_uptime_get();
}
}
static void status_stop(struct k_timer *timer)
{
/** TESTPOINT: remaining get upon timer stopped */
TIMER_ASSERT(k_timer_remaining_get(timer) == 0, timer);
}
/* test cases */
void test_timer_duration_period(void)
{
init_timer_data();
/** TESTPOINT: init timer via k_timer_init */
k_timer_init(&timer, duration_expire, duration_stop);
k_timer_start(&timer, DURATION, PERIOD);
tdata.timestamp = k_uptime_get();
busy_wait_ms(DURATION + PERIOD * EXPIRE_TIMES + PERIOD/2);
/** TESTPOINT: check expire and stop times */
TIMER_ASSERT(tdata.expire_cnt == EXPIRE_TIMES, &timer);
TIMER_ASSERT(tdata.stop_cnt == 1, &timer);
/* cleanup environemtn */
k_timer_stop(&timer);
}
void test_timer_period_0(void)
{
init_timer_data();
/** TESTPOINT: set period 0 */
k_timer_init(&timer, period0_expire, NULL);
k_timer_start(&timer, DURATION, 0);
tdata.timestamp = k_uptime_get();
busy_wait_ms(DURATION + 1);
/** TESTPOINT: ensure it is one-short timer */
TIMER_ASSERT(tdata.expire_cnt == 1, &timer);
TIMER_ASSERT(tdata.stop_cnt == 0, &timer);
/* cleanup environemtn */
k_timer_stop(&timer);
}
void test_timer_expirefn_null(void)
{
init_timer_data();
/** TESTPOINT: expire function NULL */
k_timer_init(&timer, NULL, duration_stop);
k_timer_start(&timer, DURATION, PERIOD);
busy_wait_ms(DURATION + PERIOD * EXPIRE_TIMES + PERIOD/2);
k_timer_stop(&timer);
/** TESTPOINT: expire handler is not invoked */
TIMER_ASSERT(tdata.expire_cnt == 0, &timer);
/** TESTPOINT: stop handler is invoked */
TIMER_ASSERT(tdata.stop_cnt == 1, &timer);
/* cleanup environment */
k_timer_stop(&timer);
}
void test_timer_status_get(void)
{
init_timer_data();
k_timer_init(&timer, status_expire, status_stop);
k_timer_start(&timer, DURATION, PERIOD);
/** TESTPOINT: status get upon timer starts */
TIMER_ASSERT(k_timer_status_get(&timer) == 0, &timer);
/** TESTPOINT: remaining get upon timer starts */
TIMER_ASSERT(k_timer_remaining_get(&timer) >= DURATION/2, &timer);
/* cleanup environment */
k_timer_stop(&timer);
}
void test_timer_status_get_anytime(void)
{
init_timer_data();
k_timer_init(&timer, NULL, NULL);
k_timer_start(&timer, DURATION, PERIOD);
busy_wait_ms(DURATION + PERIOD * (EXPIRE_TIMES - 1) + PERIOD/2);
/** TESTPOINT: status get at any time */
TIMER_ASSERT(k_timer_status_get(&timer) == EXPIRE_TIMES, &timer);
/* cleanup environment */
k_timer_stop(&timer);
}
void test_timer_status_sync(void)
{
init_timer_data();
k_timer_init(&timer, duration_expire, duration_stop);
k_timer_start(&timer, DURATION, PERIOD);
for (int i = 0; i < EXPIRE_TIMES; i++) {
/** TESTPOINT: check timer not expire */
TIMER_ASSERT(tdata.expire_cnt == i, &timer);
/** TESTPOINT expired times returned by status sync */
TIMER_ASSERT(k_timer_status_sync(&timer) == 1, &timer);
/** TESTPOINT: check timer not expire */
TIMER_ASSERT(tdata.expire_cnt == (i + 1), &timer);
}
/* cleanup environment */
k_timer_stop(&timer);
}
void test_timer_k_define(void)
{
init_timer_data();
/** TESTPOINT: init timer via k_timer_init */
k_timer_start(&ktimer, DURATION, PERIOD);
tdata.timestamp = k_uptime_get();
busy_wait_ms(DURATION + PERIOD * EXPIRE_TIMES + PERIOD/2);
/** TESTPOINT: check expire and stop times */
TIMER_ASSERT(tdata.expire_cnt == EXPIRE_TIMES, &ktimer);
TIMER_ASSERT(tdata.stop_cnt == 1, &ktimer);
/* cleanup environment */
k_timer_stop(&ktimer);
}
/* k_timer_user_data_set/get test */
static void user_data_timer_handler(struct k_timer *timer);
static struct k_timer user_data_timer[5] = {
K_TIMER_INITIALIZER(user_data_timer[0], user_data_timer_handler, NULL),
K_TIMER_INITIALIZER(user_data_timer[1], user_data_timer_handler, NULL),
K_TIMER_INITIALIZER(user_data_timer[2], user_data_timer_handler, NULL),
K_TIMER_INITIALIZER(user_data_timer[3], user_data_timer_handler, NULL),
K_TIMER_INITIALIZER(user_data_timer[4], user_data_timer_handler, NULL),
};
static const intptr_t user_data[5] = {0x1337, 0xbabe, 0xd00d, 0xdeaf, 0xfade};
static int user_data_correct[5] = {0, 0, 0, 0, 0};
static void user_data_timer_handler(struct k_timer *timer)
{
int timer_num = timer == &user_data_timer[0] ? 0 :
timer == &user_data_timer[1] ? 1 :
timer == &user_data_timer[2] ? 2 :
timer == &user_data_timer[3] ? 3 :
timer == &user_data_timer[4] ? 4 : -1;
if (timer_num == -1) {
return;
}
intptr_t data_retrieved = (intptr_t)k_timer_user_data_get(timer);
user_data_correct[timer_num] = user_data[timer_num] == data_retrieved;
}
void test_timer_user_data(void)
{
int ii;
for (ii = 0; ii < 5; ii++) {
intptr_t check;
k_timer_user_data_set(&user_data_timer[ii],
(void *)user_data[ii]);
check = (intptr_t)k_timer_user_data_get(&user_data_timer[ii]);
assert_true(check == user_data[ii], NULL);
}
for (ii = 0; ii < 5; ii++) {
k_timer_start(&user_data_timer[ii], 50 + ii * 50, 0);
}
k_sleep(50 * ii + 50);
for (ii = 0; ii < 5; ii++) {
k_timer_stop(&user_data_timer[ii]);
}
for (ii = 0; ii < 5; ii++) {
assert_true(user_data_correct[ii], NULL);
}
}