xref: /openbmc/u-boot/include/test/ut.h (revision b592936d357f6c648f59ae0e3159149df3a942fb)
183d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */
2e721b882SJoe Hershberger /*
3e721b882SJoe Hershberger  * Simple unit test library
4e721b882SJoe Hershberger  *
5e721b882SJoe Hershberger  * Copyright (c) 2013 Google, Inc
6e721b882SJoe Hershberger  */
7e721b882SJoe Hershberger 
8e721b882SJoe Hershberger #ifndef __TEST_UT_H
9e721b882SJoe Hershberger #define __TEST_UT_H
10e721b882SJoe Hershberger 
1185aeda4aSSimon Glass #include <linux/err.h>
1285aeda4aSSimon Glass 
13e721b882SJoe Hershberger struct unit_test_state;
14e721b882SJoe Hershberger 
15e721b882SJoe Hershberger /**
16e721b882SJoe Hershberger  * ut_fail() - Record failure of a unit test
17e721b882SJoe Hershberger  *
18e721b882SJoe Hershberger  * @uts: Test state
19eae4b2b6SVagrant Cascadian  * @fname: Filename where the error occurred
20eae4b2b6SVagrant Cascadian  * @line: Line number where the error occurred
21eae4b2b6SVagrant Cascadian  * @func: Function name where the error occurred
22e721b882SJoe Hershberger  * @cond: The condition that failed
23e721b882SJoe Hershberger  */
24e721b882SJoe Hershberger void ut_fail(struct unit_test_state *uts, const char *fname, int line,
25e721b882SJoe Hershberger 	     const char *func, const char *cond);
26e721b882SJoe Hershberger 
27e721b882SJoe Hershberger /**
28e721b882SJoe Hershberger  * ut_failf() - Record failure of a unit test
29e721b882SJoe Hershberger  *
30e721b882SJoe Hershberger  * @uts: Test state
31eae4b2b6SVagrant Cascadian  * @fname: Filename where the error occurred
32eae4b2b6SVagrant Cascadian  * @line: Line number where the error occurred
33eae4b2b6SVagrant Cascadian  * @func: Function name where the error occurred
34e721b882SJoe Hershberger  * @cond: The condition that failed
35e721b882SJoe Hershberger  * @fmt: printf() format string for the error, followed by args
36e721b882SJoe Hershberger  */
37e721b882SJoe Hershberger void ut_failf(struct unit_test_state *uts, const char *fname, int line,
38e721b882SJoe Hershberger 	      const char *func, const char *cond, const char *fmt, ...)
39e721b882SJoe Hershberger 			__attribute__ ((format (__printf__, 6, 7)));
40e721b882SJoe Hershberger 
41e721b882SJoe Hershberger 
42e721b882SJoe Hershberger /* Assert that a condition is non-zero */
43e721b882SJoe Hershberger #define ut_assert(cond)							\
44e721b882SJoe Hershberger 	if (!(cond)) {							\
45e721b882SJoe Hershberger 		ut_fail(uts, __FILE__, __LINE__, __func__, #cond);	\
46fe3f6a65SJoe Hershberger 		return CMD_RET_FAILURE;					\
47e721b882SJoe Hershberger 	}
48e721b882SJoe Hershberger 
49e721b882SJoe Hershberger /* Assert that a condition is non-zero, with printf() string */
50e721b882SJoe Hershberger #define ut_assertf(cond, fmt, args...)					\
51e721b882SJoe Hershberger 	if (!(cond)) {							\
52e721b882SJoe Hershberger 		ut_failf(uts, __FILE__, __LINE__, __func__, #cond,	\
53e721b882SJoe Hershberger 			 fmt, ##args);					\
54fe3f6a65SJoe Hershberger 		return CMD_RET_FAILURE;					\
55e721b882SJoe Hershberger 	}
56e721b882SJoe Hershberger 
57e721b882SJoe Hershberger /* Assert that two int expressions are equal */
58e721b882SJoe Hershberger #define ut_asserteq(expr1, expr2) {					\
59e721b882SJoe Hershberger 	unsigned int val1 = (expr1), val2 = (expr2);			\
60e721b882SJoe Hershberger 									\
61e721b882SJoe Hershberger 	if (val1 != val2) {						\
62e721b882SJoe Hershberger 		ut_failf(uts, __FILE__, __LINE__, __func__,		\
63e721b882SJoe Hershberger 			 #expr1 " == " #expr2,				\
64e721b882SJoe Hershberger 			 "Expected %d, got %d", val1, val2);		\
65fe3f6a65SJoe Hershberger 		return CMD_RET_FAILURE;					\
66e721b882SJoe Hershberger 	}								\
67e721b882SJoe Hershberger }
68e721b882SJoe Hershberger 
69e721b882SJoe Hershberger /* Assert that two string expressions are equal */
70e721b882SJoe Hershberger #define ut_asserteq_str(expr1, expr2) {					\
71e721b882SJoe Hershberger 	const char *val1 = (expr1), *val2 = (expr2);			\
72e721b882SJoe Hershberger 									\
73e721b882SJoe Hershberger 	if (strcmp(val1, val2)) {					\
74e721b882SJoe Hershberger 		ut_failf(uts, __FILE__, __LINE__, __func__,		\
75e721b882SJoe Hershberger 			 #expr1 " = " #expr2,				\
76e721b882SJoe Hershberger 			 "Expected \"%s\", got \"%s\"", val1, val2);	\
77fe3f6a65SJoe Hershberger 		return CMD_RET_FAILURE;					\
78e721b882SJoe Hershberger 	}								\
79e721b882SJoe Hershberger }
80e721b882SJoe Hershberger 
81*41f67e3bSMario Six /* Assert that two memory areas are equal */
82*41f67e3bSMario Six #define ut_asserteq_mem(expr1, expr2, len) {				\
83*41f67e3bSMario Six 	const u8 *val1 = (u8 *)(expr1), *val2 = (u8 *)(expr2);		\
84*41f67e3bSMario Six 	const uint __len = len;						\
85*41f67e3bSMario Six 									\
86*41f67e3bSMario Six 	if (memcmp(val1, val2, __len)) {				\
87*41f67e3bSMario Six 		char __buf1[64 + 1] = "\0";				\
88*41f67e3bSMario Six 		char __buf2[64 + 1] = "\0";				\
89*41f67e3bSMario Six 		bin2hex(__buf1, val1, min(__len, (uint)32));		\
90*41f67e3bSMario Six 		bin2hex(__buf2, val2, min(__len, (uint)32));		\
91*41f67e3bSMario Six 		ut_failf(uts, __FILE__, __LINE__, __func__,		\
92*41f67e3bSMario Six 			 #expr1 " = " #expr2,				\
93*41f67e3bSMario Six 			 "Expected \"%s\", got \"%s\"",			\
94*41f67e3bSMario Six 			 __buf1, __buf2);				\
95*41f67e3bSMario Six 		return CMD_RET_FAILURE;					\
96*41f67e3bSMario Six 	}								\
97*41f67e3bSMario Six }
98*41f67e3bSMario Six 
99e721b882SJoe Hershberger /* Assert that two pointers are equal */
100e721b882SJoe Hershberger #define ut_asserteq_ptr(expr1, expr2) {					\
101e721b882SJoe Hershberger 	const void *val1 = (expr1), *val2 = (expr2);			\
102e721b882SJoe Hershberger 									\
103e721b882SJoe Hershberger 	if (val1 != val2) {						\
104e721b882SJoe Hershberger 		ut_failf(uts, __FILE__, __LINE__, __func__,		\
105e721b882SJoe Hershberger 			 #expr1 " = " #expr2,				\
106e721b882SJoe Hershberger 			 "Expected %p, got %p", val1, val2);		\
107fe3f6a65SJoe Hershberger 		return CMD_RET_FAILURE;					\
108e721b882SJoe Hershberger 	}								\
109e721b882SJoe Hershberger }
110e721b882SJoe Hershberger 
1118d545790SRamon Fried /* Assert that a pointer is NULL */
1128d545790SRamon Fried #define ut_assertnull(expr) {					\
1138d545790SRamon Fried 	const void *val = (expr);					\
1148d545790SRamon Fried 									\
1158d545790SRamon Fried 	if (val != NULL) {						\
1168d545790SRamon Fried 		ut_failf(uts, __FILE__, __LINE__, __func__,		\
1178d545790SRamon Fried 			 #expr " != NULL",				\
1188d545790SRamon Fried 			 "Expected NULL, got %p", val);		\
1198d545790SRamon Fried 		return CMD_RET_FAILURE;					\
1208d545790SRamon Fried 	}								\
1218d545790SRamon Fried }
1228d545790SRamon Fried 
123e721b882SJoe Hershberger /* Assert that a pointer is not NULL */
124e721b882SJoe Hershberger #define ut_assertnonnull(expr) {					\
125e721b882SJoe Hershberger 	const void *val = (expr);					\
126e721b882SJoe Hershberger 									\
127e721b882SJoe Hershberger 	if (val == NULL) {						\
128e721b882SJoe Hershberger 		ut_failf(uts, __FILE__, __LINE__, __func__,		\
129e721b882SJoe Hershberger 			 #expr " = NULL",				\
130e721b882SJoe Hershberger 			 "Expected non-null, got NULL");		\
131fe3f6a65SJoe Hershberger 		return CMD_RET_FAILURE;					\
132e721b882SJoe Hershberger 	}								\
133e721b882SJoe Hershberger }
134e721b882SJoe Hershberger 
13585aeda4aSSimon Glass /* Assert that a pointer is not an error pointer */
13685aeda4aSSimon Glass #define ut_assertok_ptr(expr) {						\
13785aeda4aSSimon Glass 	const void *val = (expr);					\
13885aeda4aSSimon Glass 									\
13985aeda4aSSimon Glass 	if (IS_ERR(val)) {						\
14085aeda4aSSimon Glass 		ut_failf(uts, __FILE__, __LINE__, __func__,		\
14185aeda4aSSimon Glass 			 #expr " = NULL",				\
14285aeda4aSSimon Glass 			 "Expected pointer, got error %ld",		\
14385aeda4aSSimon Glass 			 PTR_ERR(val));					\
14485aeda4aSSimon Glass 		return CMD_RET_FAILURE;					\
14585aeda4aSSimon Glass 	}								\
14685aeda4aSSimon Glass }
14785aeda4aSSimon Glass 
148e721b882SJoe Hershberger /* Assert that an operation succeeds (returns 0) */
149e721b882SJoe Hershberger #define ut_assertok(cond)	ut_asserteq(0, cond)
150e721b882SJoe Hershberger 
151e721b882SJoe Hershberger #endif
152