Merge tag 'u-boot-imx-20190426' of git://git.denx.de/u-boot-imx
[platform/kernel/u-boot.git] / include / test / ut.h
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * Simple unit test library
4  *
5  * Copyright (c) 2013 Google, Inc
6  */
7
8 #ifndef __TEST_UT_H
9 #define __TEST_UT_H
10
11 #include <linux/err.h>
12
13 struct unit_test_state;
14
15 /**
16  * ut_fail() - Record failure of a unit test
17  *
18  * @uts: Test state
19  * @fname: Filename where the error occurred
20  * @line: Line number where the error occurred
21  * @func: Function name where the error occurred
22  * @cond: The condition that failed
23  */
24 void ut_fail(struct unit_test_state *uts, const char *fname, int line,
25              const char *func, const char *cond);
26
27 /**
28  * ut_failf() - Record failure of a unit test
29  *
30  * @uts: Test state
31  * @fname: Filename where the error occurred
32  * @line: Line number where the error occurred
33  * @func: Function name where the error occurred
34  * @cond: The condition that failed
35  * @fmt: printf() format string for the error, followed by args
36  */
37 void ut_failf(struct unit_test_state *uts, const char *fname, int line,
38               const char *func, const char *cond, const char *fmt, ...)
39                         __attribute__ ((format (__printf__, 6, 7)));
40
41
42 /* Assert that a condition is non-zero */
43 #define ut_assert(cond)                                                 \
44         if (!(cond)) {                                                  \
45                 ut_fail(uts, __FILE__, __LINE__, __func__, #cond);      \
46                 return CMD_RET_FAILURE;                                 \
47         }
48
49 /* Assert that a condition is non-zero, with printf() string */
50 #define ut_assertf(cond, fmt, args...)                                  \
51         if (!(cond)) {                                                  \
52                 ut_failf(uts, __FILE__, __LINE__, __func__, #cond,      \
53                          fmt, ##args);                                  \
54                 return CMD_RET_FAILURE;                                 \
55         }
56
57 /* Assert that two int expressions are equal */
58 #define ut_asserteq(expr1, expr2) {                                     \
59         unsigned int val1 = (expr1), val2 = (expr2);                    \
60                                                                         \
61         if (val1 != val2) {                                             \
62                 ut_failf(uts, __FILE__, __LINE__, __func__,             \
63                          #expr1 " == " #expr2,                          \
64                          "Expected %d, got %d", val1, val2);            \
65                 return CMD_RET_FAILURE;                                 \
66         }                                                               \
67 }
68
69 /* Assert that two string expressions are equal */
70 #define ut_asserteq_str(expr1, expr2) {                                 \
71         const char *val1 = (expr1), *val2 = (expr2);                    \
72                                                                         \
73         if (strcmp(val1, val2)) {                                       \
74                 ut_failf(uts, __FILE__, __LINE__, __func__,             \
75                          #expr1 " = " #expr2,                           \
76                          "Expected \"%s\", got \"%s\"", val1, val2);    \
77                 return CMD_RET_FAILURE;                                 \
78         }                                                               \
79 }
80
81 /* Assert that two memory areas are equal */
82 #define ut_asserteq_mem(expr1, expr2, len) {                            \
83         const u8 *val1 = (u8 *)(expr1), *val2 = (u8 *)(expr2);          \
84         const uint __len = len;                                         \
85                                                                         \
86         if (memcmp(val1, val2, __len)) {                                \
87                 char __buf1[64 + 1] = "\0";                             \
88                 char __buf2[64 + 1] = "\0";                             \
89                 bin2hex(__buf1, val1, min(__len, (uint)32));            \
90                 bin2hex(__buf2, val2, min(__len, (uint)32));            \
91                 ut_failf(uts, __FILE__, __LINE__, __func__,             \
92                          #expr1 " = " #expr2,                           \
93                          "Expected \"%s\", got \"%s\"",                 \
94                          __buf1, __buf2);                               \
95                 return CMD_RET_FAILURE;                                 \
96         }                                                               \
97 }
98
99 /* Assert that two pointers are equal */
100 #define ut_asserteq_ptr(expr1, expr2) {                                 \
101         const void *val1 = (expr1), *val2 = (expr2);                    \
102                                                                         \
103         if (val1 != val2) {                                             \
104                 ut_failf(uts, __FILE__, __LINE__, __func__,             \
105                          #expr1 " = " #expr2,                           \
106                          "Expected %p, got %p", val1, val2);            \
107                 return CMD_RET_FAILURE;                                 \
108         }                                                               \
109 }
110
111 /* Assert that a pointer is NULL */
112 #define ut_assertnull(expr) {                                   \
113         const void *val = (expr);                                       \
114                                                                         \
115         if (val != NULL) {                                              \
116                 ut_failf(uts, __FILE__, __LINE__, __func__,             \
117                          #expr " != NULL",                              \
118                          "Expected NULL, got %p", val);         \
119                 return CMD_RET_FAILURE;                                 \
120         }                                                               \
121 }
122
123 /* Assert that a pointer is not NULL */
124 #define ut_assertnonnull(expr) {                                        \
125         const void *val = (expr);                                       \
126                                                                         \
127         if (val == NULL) {                                              \
128                 ut_failf(uts, __FILE__, __LINE__, __func__,             \
129                          #expr " = NULL",                               \
130                          "Expected non-null, got NULL");                \
131                 return CMD_RET_FAILURE;                                 \
132         }                                                               \
133 }
134
135 /* Assert that a pointer is not an error pointer */
136 #define ut_assertok_ptr(expr) {                                         \
137         const void *val = (expr);                                       \
138                                                                         \
139         if (IS_ERR(val)) {                                              \
140                 ut_failf(uts, __FILE__, __LINE__, __func__,             \
141                          #expr " = NULL",                               \
142                          "Expected pointer, got error %ld",             \
143                          PTR_ERR(val));                                 \
144                 return CMD_RET_FAILURE;                                 \
145         }                                                               \
146 }
147
148 /* Assert that an operation succeeds (returns 0) */
149 #define ut_assertok(cond)       ut_asserteq(0, cond)
150
151 #endif