1 /*
2  * Copyright (c) 2016 Intel Corporation
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 /**
8  * @file
9  *
10  * @brief Zephyr testing framework assertion macros
11  */
12 
13 #ifndef ZEPHYR_TESTSUITE_ZTEST_ASSERT_H_
14 #define ZEPHYR_TESTSUITE_ZTEST_ASSERT_H_
15 
16 #include <stdarg.h>
17 #include <stdbool.h>
18 #include <stdio.h>
19 #include <string.h>
20 
21 #include <zephyr/ztest.h>
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 const char *ztest_relative_filename(const char *file);
28 void ztest_test_fail(void);
29 void ztest_test_skip(void);
30 void ztest_test_expect_fail(void);
31 void ztest_skip_failed_assumption(void);
32 #if CONFIG_ZTEST_ASSERT_VERBOSE == 0
33 
z_zassert_(bool cond,const char * file,int line)34 static inline bool z_zassert_(bool cond, const char *file, int line)
35 {
36 	if (cond == false) {
37 		PRINT("\n    Assertion failed at %s:%d\n", ztest_relative_filename(file), line);
38 		ztest_test_fail();
39 		return false;
40 	}
41 
42 	return true;
43 }
44 
45 #define z_zassert(cond, default_msg, file, line, func, msg, ...) z_zassert_(cond, file, line)
46 
z_zassume_(bool cond,const char * file,int line)47 static inline bool z_zassume_(bool cond, const char *file, int line)
48 {
49 	if (cond == false) {
50 		PRINT("\n    Assumption failed at %s:%d\n", ztest_relative_filename(file), line);
51 		ztest_skip_failed_assumption();
52 		return false;
53 	}
54 
55 	return true;
56 }
57 
58 #define z_zassume(cond, default_msg, file, line, func, msg, ...) z_zassume_(cond, file, line)
59 
z_zexpect_(bool cond,const char * file,int line)60 static inline bool z_zexpect_(bool cond, const char *file, int line)
61 {
62 	if (cond == false) {
63 		PRINT("\n    Expectation failed at %s:%d\n", ztest_relative_filename(file), line);
64 		ztest_test_expect_fail();
65 		return false;
66 	}
67 
68 	return true;
69 }
70 
71 #define z_zexpect(cond, default_msg, file, line, func, msg, ...) z_zexpect_(cond, file, line)
72 
73 #else /* CONFIG_ZTEST_ASSERT_VERBOSE != 0 */
74 
z_zassert(bool cond,const char * default_msg,const char * file,int line,const char * func,const char * msg,...)75 static inline bool z_zassert(bool cond, const char *default_msg, const char *file, int line,
76 			     const char *func, const char *msg, ...)
77 {
78 	if (cond == false) {
79 		va_list vargs;
80 
81 		va_start(vargs, msg);
82 		PRINT("\n    Assertion failed at %s:%d: %s: %s\n", ztest_relative_filename(file),
83 		      line, func, default_msg);
84 		vprintk(msg, vargs);
85 		printk("\n");
86 		va_end(vargs);
87 		ztest_test_fail();
88 		return false;
89 	}
90 #if CONFIG_ZTEST_ASSERT_VERBOSE == 2
91 	else {
92 		PRINT("\n   Assertion succeeded at %s:%d (%s)\n", ztest_relative_filename(file),
93 		      line, func);
94 	}
95 #endif
96 	return true;
97 }
98 
z_zassume(bool cond,const char * default_msg,const char * file,int line,const char * func,const char * msg,...)99 static inline bool z_zassume(bool cond, const char *default_msg, const char *file, int line,
100 			     const char *func, const char *msg, ...)
101 {
102 	if (cond == false) {
103 		va_list vargs;
104 
105 		va_start(vargs, msg);
106 		PRINT("\n    Assumption failed at %s:%d: %s: %s\n", ztest_relative_filename(file),
107 		      line, func, default_msg);
108 		vprintk(msg, vargs);
109 		printk("\n");
110 		va_end(vargs);
111 		ztest_skip_failed_assumption();
112 		return false;
113 	}
114 #if CONFIG_ZTEST_ASSERT_VERBOSE == 2
115 	else {
116 		PRINT("\n   Assumption succeeded at %s:%d (%s)\n", ztest_relative_filename(file),
117 		      line, func);
118 	}
119 #endif
120 	return true;
121 }
122 
z_zexpect(bool cond,const char * default_msg,const char * file,int line,const char * func,const char * msg,...)123 static inline bool z_zexpect(bool cond, const char *default_msg, const char *file, int line,
124 			     const char *func, const char *msg, ...)
125 {
126 	if (cond == false) {
127 		va_list vargs;
128 
129 		va_start(vargs, msg);
130 		PRINT("\n    Expectation failed at %s:%d: %s: %s\n", ztest_relative_filename(file),
131 		      line, func, default_msg);
132 		vprintk(msg, vargs);
133 		printk("\n");
134 		va_end(vargs);
135 		ztest_test_expect_fail();
136 		return false;
137 	}
138 #if CONFIG_ZTEST_ASSERT_VERBOSE == 2
139 	else {
140 		PRINT("\n   Expectation succeeded at %s:%d (%s)\n", ztest_relative_filename(file),
141 		      line, func);
142 	}
143 #endif
144 	return true;
145 }
146 
147 #endif /* CONFIG_ZTEST_ASSERT_VERBOSE */
148 
149 /**
150  * @defgroup ztest_assert Ztest assertion macros
151  * @ingroup ztest
152  *
153  * This module provides assertions when using Ztest.
154  *
155  * @{
156  */
157 
158 /**
159  * @brief Fail the test, if @a cond is false
160  *
161  * You probably don't need to call this macro directly. You should
162  * instead use zassert_{condition} macros below.
163  *
164  * Note that when CONFIG_MULTITHREADING=n macro returns from the function. It is
165  * then expected that in that case ztest asserts will be used only in the
166  * context of the test function.
167  *
168  * @param cond Condition to check
169  * @param default_msg Message to print if @a cond is false
170  * @param msg Optional, can be NULL. Message to print if @a cond is false.
171  */
172 #define _zassert_base(cond, default_msg, msg, ...)                                                 \
173 	do {                                                                                       \
174 		bool _msg = (msg != NULL);                                                         \
175 		bool _ret = z_zassert(cond, _msg ? ("(" default_msg ")") : (default_msg), __FILE__,\
176 				      __LINE__, __func__, _msg ? msg : "", ##__VA_ARGS__);         \
177 		(void)_msg;                                                                        \
178 		if (!_ret) {                                                                       \
179 			/* If kernel but without multithreading return. */                         \
180 			COND_CODE_1(KERNEL, (COND_CODE_1(CONFIG_MULTITHREADING, (), (return;))),   \
181 				    ())                                                            \
182 		}                                                                                  \
183 	} while (0)
184 
185 #define _zassert_va(cond, default_msg, msg, ...)                                                   \
186 	_zassert_base(cond, default_msg, msg, ##__VA_ARGS__)
187 
188 #define zassert(cond, default_msg, ...)                                                            \
189 	_zassert_va(cond, default_msg, COND_CODE_1(__VA_OPT__(1), (__VA_ARGS__), (NULL)))
190 
191 /**
192  * @brief Skip the test, if @a cond is false
193  *
194  * You probably don't need to call this macro directly. You should
195  * instead use zassume_{condition} macros below.
196  *
197  * Note that when CONFIG_MULTITHREADING=n macro returns from the function. It's then expected that
198  * in that case ztest assumes will be used only in the context of the test function.
199  *
200  * NOTE: zassume should not be used to replace zassert, the goal of zassume is to skip tests that
201  * would otherwise fail due to a zassert on some other dependent behavior that is *not* under test,
202  * thus reducing what could be tens to hundreds of assertion failures to investigate down to a few
203  * failures only.
204  *
205  * @param cond Condition to check
206  * @param default_msg Message to print if @a cond is false
207  * @param msg Optional, can be NULL. Message to print if @a cond is false.
208  */
209 #define _zassume_base(cond, default_msg, msg, ...)                                                 \
210 	do {                                                                                       \
211 		bool _msg = (msg != NULL);                                                         \
212 		bool _ret = z_zassume(cond, _msg ? ("(" default_msg ")") : (default_msg), __FILE__,\
213 				      __LINE__, __func__, _msg ? msg : "", ##__VA_ARGS__);         \
214 		(void)_msg;                                                                        \
215 		if (!_ret) {                                                                       \
216 			/* If kernel but without multithreading return. */                         \
217 			COND_CODE_1(KERNEL, (COND_CODE_1(CONFIG_MULTITHREADING, (), (return;))),   \
218 				    ())                                                            \
219 		}                                                                                  \
220 	} while (0)
221 
222 #define _zassume_va(cond, default_msg, msg, ...)                                                   \
223 	_zassume_base(cond, default_msg, msg, ##__VA_ARGS__)
224 
225 #define zassume(cond, default_msg, ...)                                                            \
226 	_zassume_va(cond, default_msg, COND_CODE_1(__VA_OPT__(1), (__VA_ARGS__), (NULL)))
227 
228 /**
229  * @brief If @a cond is false, fail the test but continue its execution.
230  *
231  * You probably don't need to call this macro directly. You should
232  * instead use zexpect_{condition} macros below.
233  *
234  * @param cond Condition to check
235  * @param default_msg Message to print if @a cond is false
236  * @param msg Optional, can be NULL. Message to print if @a cond is false.
237  */
238 #define _zexpect_base(cond, default_msg, msg, ...)                                                 \
239 	do {                                                                                       \
240 		bool _msg = (msg != NULL);                                                         \
241 		bool _ret =                                                                        \
242 			z_zexpect(cond, _msg ? ("(" default_msg ")") : (default_msg), __FILE__,    \
243 				  __LINE__, __func__, _msg ? msg : "", ##__VA_ARGS__);             \
244 		(void)_msg;                                                                        \
245 		if (!_ret) {                                                                       \
246 			/* If kernel but without multithreading return. */                         \
247 			COND_CODE_1(KERNEL, (COND_CODE_1(CONFIG_MULTITHREADING, (), (return;))),   \
248 				    ())                                                            \
249 		}                                                                                  \
250 	} while (0)
251 
252 #define _zexpect_va(cond, default_msg, msg, ...)                                                   \
253 	_zexpect_base(cond, default_msg, msg, ##__VA_ARGS__)
254 
255 #define zexpect(cond, default_msg, ...)                                                            \
256 	_zexpect_va(cond, default_msg, COND_CODE_1(__VA_OPT__(1), (__VA_ARGS__), (NULL)))
257 
258 /**
259  * @brief Assert that this function call won't be reached
260  * @param ... Optional message and variables to print if the assertion fails
261  */
262 #define zassert_unreachable(...) zassert(0, "Reached unreachable code", ##__VA_ARGS__)
263 
264 /**
265  * @brief Assert that @a cond is true
266  * @param cond Condition to check
267  * @param ... Optional message and variables to print if the assertion fails
268  */
269 #define zassert_true(cond, ...) zassert(cond, #cond " is false", ##__VA_ARGS__)
270 
271 /**
272  * @brief Assert that @a cond is false
273  * @param cond Condition to check
274  * @param ... Optional message and variables to print if the assertion fails
275  */
276 #define zassert_false(cond, ...) zassert(!(cond), #cond " is true", ##__VA_ARGS__)
277 
278 /**
279  * @brief Assert that @a cond is 0 (success)
280  * @param cond Condition to check
281  * @param ... Optional message and variables to print if the assertion fails
282  */
283 #define zassert_ok(cond, ...) zassert(!(cond), #cond " is non-zero", ##__VA_ARGS__)
284 
285 /**
286  * @brief Assert that @a ptr is NULL
287  * @param ptr Pointer to compare
288  * @param ... Optional message and variables to print if the assertion fails
289  */
290 #define zassert_is_null(ptr, ...) zassert((ptr) == NULL, #ptr " is not NULL", ##__VA_ARGS__)
291 
292 /**
293  * @brief Assert that @a ptr is not NULL
294  * @param ptr Pointer to compare
295  * @param ... Optional message and variables to print if the assertion fails
296  */
297 #define zassert_not_null(ptr, ...) zassert((ptr) != NULL, #ptr " is NULL", ##__VA_ARGS__)
298 
299 /**
300  * @brief Assert that @a a equals @a b
301  *
302  * @a a and @a b won't be converted and will be compared directly.
303  *
304  * @param a Value to compare
305  * @param b Value to compare
306  * @param ... Optional message and variables to print if the assertion fails
307  */
308 #define zassert_equal(a, b, ...) zassert((a) == (b), #a " not equal to " #b, ##__VA_ARGS__)
309 
310 /**
311  * @brief Assert that @a a does not equal @a b
312  *
313  * @a a and @a b won't be converted and will be compared directly.
314  *
315  * @param a Value to compare
316  * @param b Value to compare
317  * @param ... Optional message and variables to print if the assertion fails
318  */
319 #define zassert_not_equal(a, b, ...) zassert((a) != (b), #a " equal to " #b, ##__VA_ARGS__)
320 
321 /**
322  * @brief Assert that @a a equals @a b
323  *
324  * @a a and @a b will be converted to `void *` before comparing.
325  *
326  * @param a Value to compare
327  * @param b Value to compare
328  * @param ... Optional message and variables to print if the assertion fails
329  */
330 #define zassert_equal_ptr(a, b, ...)                                                               \
331 	zassert((void *)(a) == (void *)(b), #a " not equal to " #b, ##__VA_ARGS__)
332 
333 /**
334  * @brief Assert that @a a is within @a b with delta @a d
335  *
336  * @param a Value to compare
337  * @param b Value to compare
338  * @param d Delta
339  * @param ... Optional message and variables to print if the assertion fails
340  */
341 #define zassert_within(a, b, d, ...)                                                               \
342 	zassert(((a) >= ((b) - (d))) && ((a) <= ((b) + (d))), #a " not within " #b " +/- " #d,     \
343 		##__VA_ARGS__)
344 
345 /**
346  * @brief Assert that @a a is greater than or equal to @a l and less
347  *        than or equal to @a u
348  *
349  * @param a Value to compare
350  * @param l Lower limit
351  * @param u Upper limit
352  * @param ... Optional message and variables to print if the assertion fails
353  */
354 #define zassert_between_inclusive(a, l, u, ...)                                                    \
355 	zassert(((a) >= (l)) && ((a) <= (u)), #a " not between " #l " and " #u " inclusive",       \
356 		##__VA_ARGS__)
357 
358 /**
359  * @brief Assert that 2 memory buffers have the same contents
360  *
361  * This macro calls the final memory comparison assertion macro.
362  * Using double expansion allows providing some arguments by macros that
363  * would expand to more than one values (ANSI-C99 defines that all the macro
364  * arguments have to be expanded before macro call).
365  *
366  * @param ... Arguments, see @ref zassert_mem_equal__
367  *            for real arguments accepted.
368  */
369 #define zassert_mem_equal(...) zassert_mem_equal__(__VA_ARGS__)
370 
371 /**
372  * @brief Internal assert that 2 memory buffers have the same contents
373  *
374  * @note This is internal macro, to be used as a second expansion.
375  *       See @ref zassert_mem_equal.
376  *
377  * @param buf Buffer to compare
378  * @param exp Buffer with expected contents
379  * @param size Size of buffers
380  * @param ... Optional message and variables to print if the assertion fails
381  */
382 #define zassert_mem_equal__(buf, exp, size, ...)                                                   \
383 	zassert(memcmp(buf, exp, size) == 0, #buf " not equal to " #exp, ##__VA_ARGS__)
384 
385 /**
386  * @}
387  */
388 
389 /**
390  * @defgroup ztest_assume Ztest assumption macros
391  * @ingroup ztest
392  *
393  * This module provides assumptions when using Ztest.
394  *
395  * @{
396  */
397 
398 /**
399  * @brief Assume that @a cond is true
400  *
401  * If the assumption fails, the test will be marked as "skipped".
402  *
403  * @param cond Condition to check
404  * @param ... Optional message and variables to print if the assumption fails
405  */
406 #define zassume_true(cond, ...) zassume(cond, #cond " is false", ##__VA_ARGS__)
407 
408 /**
409  * @brief Assume that @a cond is false
410  *
411  * If the assumption fails, the test will be marked as "skipped".
412  *
413  * @param cond Condition to check
414  * @param ... Optional message and variables to print if the assumption fails
415  */
416 #define zassume_false(cond, ...) zassume(!(cond), #cond " is true", ##__VA_ARGS__)
417 
418 /**
419  * @brief Assume that @a cond is 0 (success)
420  *
421  * If the assumption fails, the test will be marked as "skipped".
422  *
423  * @param cond Condition to check
424  * @param ... Optional message and variables to print if the assumption fails
425  */
426 #define zassume_ok(cond, ...) zassume(!(cond), #cond " is non-zero", ##__VA_ARGS__)
427 
428 /**
429  * @brief Assume that @a ptr is NULL
430  *
431  * If the assumption fails, the test will be marked as "skipped".
432  *
433  * @param ptr Pointer to compare
434  * @param ... Optional message and variables to print if the assumption fails
435  */
436 #define zassume_is_null(ptr, ...) zassume((ptr) == NULL, #ptr " is not NULL", ##__VA_ARGS__)
437 
438 /**
439  * @brief Assume that @a ptr is not NULL
440  *
441  * If the assumption fails, the test will be marked as "skipped".
442  *
443  * @param ptr Pointer to compare
444  * @param ... Optional message and variables to print if the assumption fails
445  */
446 #define zassume_not_null(ptr, ...) zassume((ptr) != NULL, #ptr " is NULL", ##__VA_ARGS__)
447 
448 /**
449  * @brief Assume that @a a equals @a b
450  *
451  * @a a and @a b won't be converted and will be compared directly. If the
452  * assumption fails, the test will be marked as "skipped".
453  *
454  * @param a Value to compare
455  * @param b Value to compare
456  * @param ... Optional message and variables to print if the assumption fails
457  */
458 #define zassume_equal(a, b, ...) zassume((a) == (b), #a " not equal to " #b, ##__VA_ARGS__)
459 
460 /**
461  * @brief Assume that @a a does not equal @a b
462  *
463  * @a a and @a b won't be converted and will be compared directly. If the
464  * assumption fails, the test will be marked as "skipped".
465  *
466  * @param a Value to compare
467  * @param b Value to compare
468  * @param ... Optional message and variables to print if the assumption fails
469  */
470 #define zassume_not_equal(a, b, ...) zassume((a) != (b), #a " equal to " #b, ##__VA_ARGS__)
471 
472 /**
473  * @brief Assume that @a a equals @a b
474  *
475  * @a a and @a b will be converted to `void *` before comparing. If the
476  * assumption fails, the test will be marked as "skipped".
477  *
478  * @param a Value to compare
479  * @param b Value to compare
480  * @param ... Optional message and variables to print if the assumption fails
481  */
482 #define zassume_equal_ptr(a, b, ...)                                                               \
483 	zassume((void *)(a) == (void *)(b), #a " not equal to " #b, ##__VA_ARGS__)
484 
485 /**
486  * @brief Assume that @a a is within @a b with delta @a d
487  *
488  * If the assumption fails, the test will be marked as "skipped".
489  *
490  * @param a Value to compare
491  * @param b Value to compare
492  * @param d Delta
493  * @param ... Optional message and variables to print if the assumption fails
494  */
495 #define zassume_within(a, b, d, ...)                                                               \
496 	zassume(((a) >= ((b) - (d))) && ((a) <= ((b) + (d))), #a " not within " #b " +/- " #d,     \
497 		##__VA_ARGS__)
498 
499 /**
500  * @brief Assume that @a a is greater than or equal to @a l and less
501  *        than or equal to @a u
502  *
503  * If the assumption fails, the test will be marked as "skipped".
504  *
505  * @param a Value to compare
506  * @param l Lower limit
507  * @param u Upper limit
508  * @param ... Optional message and variables to print if the assumption fails
509  */
510 #define zassume_between_inclusive(a, l, u, ...)                                                    \
511 	zassume(((a) >= (l)) && ((a) <= (u)), #a " not between " #l " and " #u " inclusive",       \
512 		##__VA_ARGS__)
513 
514 /**
515  * @brief Assume that 2 memory buffers have the same contents
516  *
517  * This macro calls the final memory comparison assumption macro.
518  * Using double expansion allows providing some arguments by macros that
519  * would expand to more than one values (ANSI-C99 defines that all the macro
520  * arguments have to be expanded before macro call).
521  *
522  * @param ... Arguments, see @ref zassume_mem_equal__
523  *            for real arguments accepted.
524  */
525 #define zassume_mem_equal(...) zassume_mem_equal__(__VA_ARGS__)
526 
527 /**
528  * @brief Internal assume that 2 memory buffers have the same contents
529  *
530  * If the assumption fails, the test will be marked as "skipped".
531  *
532  * @note This is internal macro, to be used as a second expansion.
533  *       See @ref zassume_mem_equal.
534  *
535  * @param buf Buffer to compare
536  * @param exp Buffer with expected contents
537  * @param size Size of buffers
538  * @param ... Optional message and variables to print if the assumption fails
539  */
540 #define zassume_mem_equal__(buf, exp, size, ...)                                                   \
541 	zassume(memcmp(buf, exp, size) == 0, #buf " not equal to " #exp, ##__VA_ARGS__)
542 
543 /**
544  * @}
545  */
546 
547 /**
548  * @defgroup ztest_expect Ztest expectation macros
549  * @ingroup ztest
550  *
551  * This module provides expectations when using Ztest.
552  *
553  * @{
554  */
555 
556 /**
557  * @brief Expect that @a cond is true, otherwise mark test as failed but continue its execution.
558  *
559  * @param cond Condition to check
560  * @param ... Optional message and variables to print if the expectation fails
561  */
562 #define zexpect_true(cond, ...) zexpect(cond, #cond " is false", ##__VA_ARGS__)
563 
564 /**
565  * @brief Expect that @a cond is false, otherwise mark test as failed but continue its execution.
566  *
567  * @param cond Condition to check
568  * @param ... Optional message and variables to print if the expectation fails
569  */
570 #define zexpect_false(cond, ...) zexpect(!(cond), #cond " is true", ##__VA_ARGS__)
571 
572 /**
573  * @brief Expect that @a cond is 0 (success), otherwise mark test as failed but continue its
574  * execution.
575  *
576  * @param cond Condition to check
577  * @param ... Optional message and variables to print if the expectation fails
578  */
579 #define zexpect_ok(cond, ...) zexpect(!(cond), #cond " is non-zero", ##__VA_ARGS__)
580 
581 /**
582  * @brief Expect that @a ptr is NULL, otherwise mark test as failed but continue its execution.
583  *
584  * @param ptr Pointer to compare
585  * @param ... Optional message and variables to print if the expectation fails
586  */
587 #define zexpect_is_null(ptr, ...) zexpect((ptr) == NULL, #ptr " is not NULL", ##__VA_ARGS__)
588 
589 /**
590  * @brief Expect that @a ptr is not NULL, otherwise mark test as failed but continue its execution.
591  *
592  * @param ptr Pointer to compare
593  * @param ... Optional message and variables to print if the expectation fails
594  */
595 #define zexpect_not_null(ptr, ...) zexpect((ptr) != NULL, #ptr " is NULL", ##__VA_ARGS__)
596 
597 /**
598  * @brief Expect that @a a equals @a b, otherwise mark test as failed but continue its execution.
599  * expectation fails, the test will be marked as "skipped".
600  *
601  * @param a Value to compare
602  * @param b Value to compare
603  * @param ... Optional message and variables to print if the expectation fails
604  */
605 #define zexpect_equal(a, b, ...) zexpect((a) == (b), #a " not equal to " #b, ##__VA_ARGS__)
606 
607 /**
608  * @brief Expect that @a a does not equal @a b, otherwise mark test as failed but continue its
609  * execution.
610  *
611  * @a a and @a b won't be converted and will be compared directly.
612  *
613  * @param a Value to compare
614  * @param b Value to compare
615  * @param ... Optional message and variables to print if the expectation fails
616  */
617 #define zexpect_not_equal(a, b, ...) zexpect((a) != (b), #a " equal to " #b, ##__VA_ARGS__)
618 
619 /**
620  * @brief Expect that @a a equals @a b, otherwise mark test as failed but continue its execution.
621  *
622  * @a a and @a b will be converted to `void *` before comparing.
623  *
624  * @param a Value to compare
625  * @param b Value to compare
626  * @param ... Optional message and variables to print if the expectation fails
627  */
628 #define zexpect_equal_ptr(a, b, ...)                                                               \
629 	zexpect((void *)(a) == (void *)(b), #a " not equal to " #b, ##__VA_ARGS__)
630 
631 /**
632  * @brief Expect that @a a is within @a b with delta @a d, otherwise mark test as failed but
633  * continue its execution.
634  *
635  * @param a Value to compare
636  * @param b Value to compare
637  * @param delta Difference between a and b
638  * @param ... Optional message and variables to print if the expectation fails
639  */
640 #define zexpect_within(a, b, delta, ...)                                                           \
641 	zexpect(((a) >= ((b) - (delta))) && ((a) <= ((b) + (delta))),                              \
642 		#a " not within " #b " +/- " #delta, ##__VA_ARGS__)
643 
644 /**
645  * @brief Expect that @a a is greater than or equal to @a l and less
646  *        than or equal to @a u, otherwise mark test as failed but continue its execution.
647  *
648  * @param a Value to compare
649  * @param lower Lower limit
650  * @param upper Upper limit
651  * @param ... Optional message and variables to print if the expectation fails
652  */
653 #define zexpect_between_inclusive(a, lower, upper, ...)                                            \
654 	zexpect(((a) >= (lower)) && ((a) <= (upper)),                                              \
655 		#a " not between " #lower " and " #upper " inclusive", ##__VA_ARGS__)
656 
657 /**
658  * @brief Expect that 2 memory buffers have the same contents, otherwise mark test as failed but
659  * continue its execution.
660  *
661  * @param buf Buffer to compare
662  * @param exp Buffer with expected contents
663  * @param size Size of buffers
664  * @param ... Optional message and variables to print if the expectation fails
665  */
666 #define zexpect_mem_equal(buf, exp, size, ...)                                                     \
667 	zexpect(memcmp(buf, exp, size) == 0, #buf " not equal to " #exp, ##__VA_ARGS__)
668 
669 /**
670  * @}
671  */
672 
673 #ifdef __cplusplus
674 }
675 #endif
676 
677 #endif /* ZEPHYR_TESTSUITE_ZTEST_ASSERT_H_ */
678