diff --git a/tests/kernel/common/src/clock.c b/tests/kernel/common/src/clock.c index 1a413a4a1c9..4c140b1b5b6 100644 --- a/tests/kernel/common/src/clock.c +++ b/tests/kernel/common/src/clock.c @@ -22,6 +22,23 @@ } while (0) #endif +#ifndef CONFIG_BOARD_QEMU_CORTEX_M0 +struct timer_data { + int duration_count; + int stop_count; +}; +static void duration_expire(struct k_timer *timer); +static void stop_expire(struct k_timer *timer); + +/** TESTPOINT: init timer via K_TIMER_DEFINE */ +K_TIMER_DEFINE(ktimer, duration_expire, stop_expire); + +static ZTEST_BMEM struct timer_data tdata; + +#define DURATION 100 +#define LESS_DURATION 80 +#endif + /** * @addtogroup kernel_common_tests * @{ @@ -110,6 +127,68 @@ void test_clock_cycle(void) } } +#ifdef CONFIG_BOARD_QEMU_CORTEX_M0 +void test_ms_time_duration(void) +{ + ztest_test_skip(); +} + +#else + +/* + *help function + */ +static void duration_expire(struct k_timer *timer) +{ + tdata.duration_count++; +} + +static void stop_expire(struct k_timer *timer) +{ + tdata.stop_count++; +} + +static void init_data_count(void) +{ + tdata.duration_count = 0; + tdata.stop_count = 0; +} + +/** + * @brief Test millisecond time duration + * + * @details initialize a timer, then providing time duration in + * millisecond, and check the duration time whether correct. + * + * @see k_timer_init(), k_timer_start(), k_timer_stop(), + * k_busy_wait() + * + * + */ + +void test_ms_time_duration(void) +{ + init_data_count(); + k_timer_start(&ktimer, K_MSEC(DURATION), K_NO_WAIT); + + /** TESTPOINT: waiting time less than duration and check the count*/ + k_busy_wait(LESS_DURATION * 1000); + zassert_true(tdata.duration_count == 0, NULL); + zassert_true(tdata.stop_count == 0, NULL); + + /** TESTPOINT: proving duration in millisecond */ + init_data_count(); + k_timer_start(&ktimer, K_MSEC(100), K_MSEC(50)); + + /** TESTPOINT: waiting time more than duration and check the count */ + k_busy_wait((DURATION + 1) * 1000); + zassert_true(tdata.duration_count == 1, NULL); + zassert_true(tdata.stop_count == 0, NULL); + + /** cleanup environemtn */ + k_timer_stop(&ktimer); +} +#endif /** * @} */ diff --git a/tests/kernel/common/src/main.c b/tests/kernel/common/src/main.c index e40c4e04825..87f56c9b8b1 100644 --- a/tests/kernel/common/src/main.c +++ b/tests/kernel/common/src/main.c @@ -29,6 +29,7 @@ extern void test_printk(void); extern void test_timeout_order(void); extern void test_clock_cycle(void); extern void test_clock_uptime(void); +extern void test_ms_time_duration(void); extern void test_multilib(void); extern void test_thread_context(void); extern void test_bootdelay(void); @@ -124,6 +125,7 @@ void test_main(void) ztest_unit_test(test_version), ztest_unit_test(test_multilib), ztest_unit_test(test_thread_context), + ztest_unit_test(test_ms_time_duration), ztest_unit_test(test_bounds_check_mitigation) );