/* * Copyright (c) 2016 Intel Corporation * * SPDX-License-Identifier: Apache-2.0 */ /** * @file * * @brief Zephyr testing framework _test. */ #ifndef __ZTEST_TEST_H__ #define __ZTEST_TEST_H__ #include #ifdef __cplusplus extern "C" { #endif struct unit_test { const char *name; void (*test)(void); void (*setup)(void); void (*teardown)(void); u32_t thread_options; }; void z_ztest_run_test_suite(const char *name, struct unit_test *suite); /** * @defgroup ztest_test Ztest testing macros * @ingroup ztest * * This module eases the testing process by providing helpful macros and other * testing structures. * * @{ */ /** * @brief Fail the currently running test. * * This is the function called from failed assertions and the like. You * probably don't need to call it yourself. */ void ztest_test_fail(void); /** * @brief Pass the currently running test. * * Normally a test passes just by returning without an assertion failure. * However, if the success case for your test involves a fatal fault, * you can call this function from k_sys_fatal_error_handler to indicate that * the test passed before aborting the thread. */ void ztest_test_pass(void); /** * @brief Skip the current test. * */ void ztest_test_skip(void); /** * @brief Do nothing, successfully. * * Unit test / setup function / teardown function that does * nothing, successfully. Can be used as a parameter to * ztest_unit_test_setup_teardown(). */ static inline void unit_test_noop(void) { } /** * @brief Define a test with setup and teardown functions * * This should be called as an argument to ztest_test_suite. The test will * be run in the following order: @a setup, @a fn, @a teardown. * * @param fn Main test function * @param setup Setup function * @param teardown Teardown function */ #define ztest_unit_test_setup_teardown(fn, setup, teardown) { \ STRINGIFY(fn), fn, setup, teardown, 0 \ } /** * @brief Define a user mode test with setup and teardown functions * * This should be called as an argument to ztest_test_suite. The test will * be run in the following order: @a setup, @a fn, @a teardown. ALL * test functions will be run in user mode, and only if CONFIG_USERSPACE * is enabled, otherwise this is the same as ztest_unit_test_setup_teardown(). * * @param fn Main test function * @param setup Setup function * @param teardown Teardown function */ #define ztest_user_unit_test_setup_teardown(fn, setup, teardown) { \ STRINGIFY(fn), fn, setup, teardown, K_USER \ } /** * @brief Define a test function * * This should be called as an argument to ztest_test_suite. * * @param fn Test function */ #define ztest_unit_test(fn) \ ztest_unit_test_setup_teardown(fn, unit_test_noop, unit_test_noop) /** * @brief Define a test function that should run as a user thread * * This should be called as an argument to ztest_test_suite. * If CONFIG_USERSPACE is not enabled, this is functionally identical to * ztest_unit_test(). * * @param fn Test function */ #define ztest_user_unit_test(fn) \ ztest_user_unit_test_setup_teardown(fn, unit_test_noop, unit_test_noop) __syscall void z_test_1cpu_start(void); __syscall void z_test_1cpu_stop(void); /** * @brief Define a SMP-unsafe test function * * As ztest_unit_test(), but ensures all test code runs on only * one CPU when in SMP. * * @param fn Test function */ #ifdef CONFIG_SMP #define ztest_1cpu_unit_test(fn) \ ztest_unit_test_setup_teardown(fn, z_test_1cpu_start, z_test_1cpu_stop) #else #define ztest_1cpu_unit_test(fn) ztest_unit_test(fn) #endif /** * @brief Define a SMP-unsafe test function that should run as a user thread * * As ztest_user_unit_test(), but ensures all test code runs on only * one CPU when in SMP. * * @param fn Test function */ #ifdef CONFIG_SMP #define ztest_1cpu_user_unit_test(fn) \ ztest_user_unit_test_setup_teardown(fn, z_test_1cpu_start, z_test_1cpu_stop) #else #define ztest_1cpu_user_unit_test(fn) ztest_user_unit_test(fn) #endif /* definitions for use with testing application shared memory */ #ifdef CONFIG_USERSPACE #define ZTEST_DMEM K_APP_DMEM(ztest_mem_partition) #define ZTEST_BMEM K_APP_BMEM(ztest_mem_partition) #define ZTEST_SECTION K_APP_DMEM_SECTION(ztest_mem_partition) extern struct k_mem_partition ztest_mem_partition; extern struct k_mem_domain ztest_mem_domain; #else #define ZTEST_DMEM #define ZTEST_BMEM #define ZTEST_SECTION .data #endif /** * @brief Define a test suite * * This function should be called in the following fashion: * ```{.c} * ztest_test_suite(test_suite_name, * ztest_unit_test(test_function), * ztest_unit_test(test_other_function) * ); * * ztest_run_test_suite(test_suite_name); * ``` * * @param suite Name of the testing suite */ #define ztest_test_suite(suite, ...) \ static ZTEST_DMEM struct unit_test _##suite[] = { \ __VA_ARGS__, { 0 } \ } /** * @brief Run the specified test suite. * * @param suite Test suite to run. */ #define ztest_run_test_suite(suite) \ z_ztest_run_test_suite(#suite, _##suite) /** * @} */ #ifndef ZTEST_UNITTEST #include #endif #ifdef __cplusplus } #endif #endif /* __ZTEST_ASSERT_H__ */