Files
TencentOS-tiny/test/suit_timer.c
2022-06-02 17:01:58 +08:00

249 lines
6.7 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "test/test.h"
#include "greatest/greatest.h"
SUITE(suit_timer);
k_timer_t test_timer_00;
k_timer_t test_timer_01;
k_timer_t test_timer_02;
static uint32_t test_timer_oneshot_count = 0;
static uint32_t test_timer_periodic_count = 0;
static void test_timer_call_back_dummy(void *arg)
{
}
static void test_timer_oneshot_call_back(void *arg)
{
++test_timer_oneshot_count;
}
static void test_timer_periodic_call_back(void *arg)
{
++test_timer_periodic_count;
}
TEST test_tos_timer_create(void)
{
k_err_t err;
err = tos_timer_create(&test_timer_00, (k_tick_t)0u, (k_tick_t)0u,
test_timer_call_back_dummy, K_NULL,
TOS_OPT_TIMER_ONESHOT);
ASSERT_EQ(err, K_ERR_TIMER_INVALID_DELAY);
err = tos_timer_create(&test_timer_00, (k_tick_t)0u, (k_tick_t)200u,
test_timer_call_back_dummy, K_NULL,
TOS_OPT_TIMER_ONESHOT);
ASSERT_EQ(err, K_ERR_TIMER_INVALID_DELAY);
err = tos_timer_create(&test_timer_00, (k_tick_t)0u, (k_tick_t)0u,
test_timer_call_back_dummy, K_NULL,
TOS_OPT_TIMER_PERIODIC);
ASSERT_EQ(err, K_ERR_TIMER_INVALID_PERIOD);
err = tos_timer_create(&test_timer_00, (k_tick_t)200u, (k_tick_t)0u,
test_timer_call_back_dummy, K_NULL,
TOS_OPT_TIMER_PERIODIC);
ASSERT_EQ(err, K_ERR_TIMER_INVALID_PERIOD);
err = tos_timer_create(&test_timer_00, (k_tick_t)200u, (k_tick_t)0u,
K_NULL, K_NULL,
TOS_OPT_TIMER_ONESHOT);
ASSERT_EQ(err, K_ERR_OBJ_PTR_NULL);
err = tos_timer_create(&test_timer_00, TOS_TIME_FOREVER, (k_tick_t)0u,
test_timer_call_back_dummy, K_NULL,
TOS_OPT_TIMER_ONESHOT);
ASSERT_EQ(err, K_ERR_TIMER_DELAY_FOREVER);
err = tos_timer_create(&test_timer_00, (k_tick_t)0u, TOS_TIME_FOREVER,
test_timer_call_back_dummy, K_NULL,
TOS_OPT_TIMER_PERIODIC);
ASSERT_EQ(err, K_ERR_TIMER_PERIOD_FOREVER);
err = tos_timer_create(&test_timer_00, (k_tick_t)200u, (k_tick_t)0u,
test_timer_call_back_dummy, K_NULL,
TOS_OPT_TIMER_ONESHOT);
ASSERT_EQ(err, K_ERR_NONE);
err = tos_timer_create(&test_timer_01, (k_tick_t)0u, (k_tick_t)200u,
test_timer_call_back_dummy, K_NULL,
TOS_OPT_TIMER_PERIODIC);
ASSERT_EQ(err, K_ERR_NONE);
err = tos_timer_destroy(&test_timer_00);
ASSERT_EQ(err, K_ERR_NONE);
err = tos_timer_destroy(&test_timer_01);
ASSERT_EQ(err, K_ERR_NONE);
PASS();
}
TEST test_tos_timer_destroy(void)
{
k_err_t err;
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
err = tos_timer_destroy(&test_timer_00);
ASSERT_EQ(err, K_ERR_OBJ_INVALID);
#endif
err = tos_timer_destroy(K_NULL);
ASSERT_EQ(err, K_ERR_OBJ_PTR_NULL);
PASS();
}
#if TOS_CFG_OBJ_DYNAMIC_CREATE_EN > 0u
TEST test_tos_timer_create_dyn(void)
{
k_err_t err;
k_timer_t *timer;
err = tos_timer_create_dyn(&timer, (k_tick_t)0u, (k_tick_t)200u,
test_timer_call_back_dummy, K_NULL,
TOS_OPT_TIMER_PERIODIC);
ASSERT_EQ(err, K_ERR_NONE);
err = tos_timer_destroy(timer);
ASSERT_EQ(err, K_ERR_OBJ_INVALID_ALLOC_TYPE);
err = tos_timer_destroy_dyn(timer);
ASSERT_EQ(err, K_ERR_NONE);
PASS();
}
#endif
TEST test_tos_timer_stop(void)
{
k_err_t err;
err = tos_timer_stop(K_NULL);
ASSERT_EQ(err, K_ERR_OBJ_PTR_NULL);
#if TOS_CFG_OBJECT_VERIFY_EN > 0u
err = tos_timer_stop(&test_timer_00);
ASSERT_EQ(err, K_ERR_OBJ_INVALID);
#endif
err = tos_timer_create(&test_timer_00, (k_tick_t)500u, (k_tick_t)0u,
test_timer_call_back_dummy, K_NULL,
TOS_OPT_TIMER_ONESHOT);
ASSERT_EQ(err, K_ERR_NONE);
ASSERT_EQ(test_timer_00.state, TIMER_STATE_STOPPED);
err = tos_timer_stop(&test_timer_00);
ASSERT_EQ(err, K_ERR_TIMER_STOPPED);
err = tos_timer_start(&test_timer_00);
ASSERT_EQ(err, K_ERR_NONE);
ASSERT_EQ(test_timer_00.state, TIMER_STATE_RUNNING);
err = tos_task_delay(500u + 10u);
ASSERT_EQ(err, K_ERR_NONE);
ASSERT_EQ(test_timer_00.state, TIMER_STATE_COMPLETED);
err = tos_timer_stop(&test_timer_00);
ASSERT_EQ(err, K_ERR_TIMER_STOPPED);
err = tos_timer_start(&test_timer_00);
ASSERT_EQ(err, K_ERR_NONE);
ASSERT_EQ(test_timer_00.state, TIMER_STATE_RUNNING);
err = tos_timer_stop(&test_timer_00);
ASSERT_EQ(err, K_ERR_NONE);
ASSERT_EQ(test_timer_00.state, TIMER_STATE_STOPPED);
err = tos_timer_destroy(&test_timer_00);
ASSERT_EQ(err, K_ERR_NONE);
PASS();
}
TEST test_tos_timer_oneshot_functional(void)
{
k_err_t err;
err = tos_timer_create(&test_timer_00, (k_tick_t)500u, (k_tick_t)0u,
test_timer_oneshot_call_back, K_NULL,
TOS_OPT_TIMER_ONESHOT);
ASSERT_EQ(err, K_ERR_NONE);
ASSERT_EQ(test_timer_oneshot_count, 0);
err = tos_timer_start(&test_timer_00);
ASSERT_EQ(err, K_ERR_NONE);
err = tos_task_delay(500u + 10u);
ASSERT_EQ(err, K_ERR_NONE);
ASSERT_EQ(test_timer_00.state, TIMER_STATE_COMPLETED);
ASSERT_EQ(test_timer_oneshot_count, 1);
err = tos_timer_stop(&test_timer_00);
ASSERT_EQ(err, K_ERR_TIMER_STOPPED);
err = tos_timer_destroy(&test_timer_00);
ASSERT_EQ(err, K_ERR_NONE);
PASS();
}
TEST test_tos_timer_periodic_functional(void)
{
int count = 0;
k_err_t err;
err = tos_timer_create(&test_timer_00, (k_tick_t)500u, (k_tick_t)400u,
test_timer_periodic_call_back, K_NULL,
TOS_OPT_TIMER_PERIODIC);
ASSERT_EQ(err, K_ERR_NONE);
ASSERT_EQ(test_timer_periodic_count, 0);
err = tos_timer_start(&test_timer_00);
ASSERT_EQ(err, K_ERR_NONE);
err = tos_task_delay(500u + 10u);
ASSERT_EQ(err, K_ERR_NONE);
ASSERT_EQ(test_timer_00.state, TIMER_STATE_RUNNING);
ASSERT_EQ(test_timer_periodic_count, 1);
while (count++ < 4) {
err = tos_task_delay(400u + 10u);
ASSERT_EQ(err, K_ERR_NONE);
ASSERT_EQ(test_timer_00.state, TIMER_STATE_RUNNING);
ASSERT_EQ(test_timer_periodic_count, 1 + count);
}
err = tos_timer_destroy(&test_timer_00);
ASSERT_EQ(err, K_ERR_NONE);
PASS();
}
SUITE(suit_timer)
{
RUN_TEST(test_tos_timer_create);
RUN_TEST(test_tos_timer_destroy);
#if TOS_CFG_OBJ_DYNAMIC_CREATE_EN > 0u
RUN_TEST(test_tos_timer_create_dyn);
#endif
RUN_TEST(test_tos_timer_stop);
RUN_TEST(test_tos_timer_oneshot_functional);
RUN_TEST(test_tos_timer_periodic_functional);
}