/* * Copyright (c) 2016 Intel Corporation * * SPDX-License-Identifier: Apache-2.0 */ /** * @file * * @brief Zephyr testing framework assertion macros */ #ifndef __ZTEST_ASSERT_H__ #define __ZTEST_ASSERT_H__ #include #include #include void ztest_test_fail(void); #if CONFIG_ZTEST_ASSERT_VERBOSE == 0 static inline void _zassert_(int cond, const char *file, int line) { if (!(cond)) { PRINT("\n Assertion failed at %s:%d\n", file, line); ztest_test_fail(); } } #define _zassert(cond, default_msg, file, line, func, msg, ...) \ _zassert_(cond, file, line) #else /* CONFIG_ZTEST_ASSERT_VERBOSE != 0 */ static inline void _zassert(int cond, const char *default_msg, const char *file, int line, const char *func, const char *msg, ...) { if (!(cond)) { va_list vargs; va_start(vargs, msg); PRINT("\n Assertion failed at %s:%d: %s: %s\n", file, line, func, default_msg); #if defined(CONFIG_STDOUT_CONSOLE) vprintf(msg, vargs); #else vprintk(msg, vargs); #endif va_end(vargs); ztest_test_fail(); } #if CONFIG_ZTEST_ASSERT_VERBOSE == 2 else { PRINT("\n Assertion succeeded at %s:%d (%s)\n", file, line, func); } #endif } #endif /* CONFIG_ZTEST_ASSERT_VERBOSE */ /** * @defgroup ztest_assert Ztest assertion macros * @ingroup ztest * * This module provides assertions when using Ztest. * * @{ */ /** * @brief Fail the test, if @a cond is false * * You probably don't need to call this macro directly. You should * instead use zassert_{condition} macros below. * * @param cond Condition to check * @param msg Optional, can be NULL. Message to print if @a cond is false. * @param default_msg Message to print if @a cond is false */ #define zassert(cond, default_msg, msg, ...) \ _zassert(cond, msg ? ("(" default_msg ")") : (default_msg), \ __FILE__, __LINE__, __func__, msg ? msg : "", ##__VA_ARGS__) /** * @brief Assert that this function call won't be reached * @param msg Optional message to print if the assertion fails */ #define zassert_unreachable(msg, ...) zassert(0, "Reached unreachable code", \ msg, ##__VA_ARGS__) /** * @brief Assert that @a cond is true * @param cond Condition to check * @param msg Optional message to print if the assertion fails */ #define zassert_true(cond, msg, ...) zassert(cond, #cond " is false", \ msg, ##__VA_ARGS__) /** * @brief Assert that @a cond is false * @param cond Condition to check * @param msg Optional message to print if the assertion fails */ #define zassert_false(cond, msg, ...) zassert(!(cond), #cond " is true", \ msg, ##__VA_ARGS__) /** * @brief Assert that @a ptr is NULL * @param ptr Pointer to compare * @param msg Optional message to print if the assertion fails */ #define zassert_is_null(ptr, msg, ...) zassert((ptr) == NULL, \ #ptr " is not NULL", \ msg, ##__VA_ARGS__) /** * @brief Assert that @a ptr is not NULL * @param ptr Pointer to compare * @param msg Optional message to print if the assertion fails */ #define zassert_not_null(ptr, msg, ...) zassert((ptr) != NULL, \ #ptr " is NULL", msg, \ ##__VA_ARGS__) /** * @brief Assert that @a a equals @a b * * @a a and @a b won't be converted and will be compared directly. * * @param a Value to compare * @param b Value to compare * @param msg Optional message to print if the assertion fails */ #define zassert_equal(a, b, msg, ...) zassert((a) == (b), \ #a " not equal to " #b, \ msg, ##__VA_ARGS__) /** * @brief Assert that @a a does not equal @a b * * @a a and @a b won't be converted and will be compared directly. * * @param a Value to compare * @param b Value to compare * @param msg Optional message to print if the assertion fails */ #define zassert_not_equal(a, b, msg, ...) zassert((a) != (b), \ #a " equal to " #b, \ msg, ##__VA_ARGS__) /** * @brief Assert that @a a equals @a b * * @a a and @a b will be converted to `void *` before comparing. * * @param a Value to compare * @param b Value to compare * @param msg Optional message to print if the assertion fails */ #define zassert_equal_ptr(a, b, msg, ...) \ zassert((void *)(a) == (void *)(b), #a " not equal to " #b, \ msg, ##__VA_ARGS__) /** * @} */ #endif /* __ZTEST_ASSERT_H__ */