]>
Commit | Line | Data |
---|---|---|
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 %#x (%d), got %#x (%d)", val1, val1, \ | |
65 | val2, val2); \ | |
66 | return CMD_RET_FAILURE; \ | |
67 | } \ | |
68 | } | |
69 | ||
70 | /* Assert that two string expressions are equal */ | |
71 | #define ut_asserteq_str(expr1, expr2) { \ | |
72 | const char *val1 = (expr1), *val2 = (expr2); \ | |
73 | \ | |
74 | if (strcmp(val1, val2)) { \ | |
75 | ut_failf(uts, __FILE__, __LINE__, __func__, \ | |
76 | #expr1 " = " #expr2, \ | |
77 | "Expected \"%s\", got \"%s\"", val1, val2); \ | |
78 | return CMD_RET_FAILURE; \ | |
79 | } \ | |
80 | } | |
81 | ||
82 | /* Assert that two memory areas are equal */ | |
83 | #define ut_asserteq_mem(expr1, expr2, len) { \ | |
84 | const u8 *val1 = (u8 *)(expr1), *val2 = (u8 *)(expr2); \ | |
85 | const uint __len = len; \ | |
86 | \ | |
87 | if (memcmp(val1, val2, __len)) { \ | |
88 | char __buf1[64 + 1] = "\0"; \ | |
89 | char __buf2[64 + 1] = "\0"; \ | |
90 | bin2hex(__buf1, val1, min(__len, (uint)32)); \ | |
91 | bin2hex(__buf2, val2, min(__len, (uint)32)); \ | |
92 | ut_failf(uts, __FILE__, __LINE__, __func__, \ | |
93 | #expr1 " = " #expr2, \ | |
94 | "Expected \"%s\", got \"%s\"", \ | |
95 | __buf1, __buf2); \ | |
96 | return CMD_RET_FAILURE; \ | |
97 | } \ | |
98 | } | |
99 | ||
100 | /* Assert that two pointers are equal */ | |
101 | #define ut_asserteq_ptr(expr1, expr2) { \ | |
102 | const void *val1 = (expr1), *val2 = (expr2); \ | |
103 | \ | |
104 | if (val1 != val2) { \ | |
105 | ut_failf(uts, __FILE__, __LINE__, __func__, \ | |
106 | #expr1 " = " #expr2, \ | |
107 | "Expected %p, got %p", val1, val2); \ | |
108 | return CMD_RET_FAILURE; \ | |
109 | } \ | |
110 | } | |
111 | ||
112 | /* Assert that a pointer is NULL */ | |
113 | #define ut_assertnull(expr) { \ | |
114 | const void *val = (expr); \ | |
115 | \ | |
116 | if (val != NULL) { \ | |
117 | ut_failf(uts, __FILE__, __LINE__, __func__, \ | |
118 | #expr " != NULL", \ | |
119 | "Expected NULL, got %p", val); \ | |
120 | return CMD_RET_FAILURE; \ | |
121 | } \ | |
122 | } | |
123 | ||
124 | /* Assert that a pointer is not NULL */ | |
125 | #define ut_assertnonnull(expr) { \ | |
126 | const void *val = (expr); \ | |
127 | \ | |
128 | if (val == NULL) { \ | |
129 | ut_failf(uts, __FILE__, __LINE__, __func__, \ | |
130 | #expr " = NULL", \ | |
131 | "Expected non-null, got NULL"); \ | |
132 | return CMD_RET_FAILURE; \ | |
133 | } \ | |
134 | } | |
135 | ||
136 | /* Assert that a pointer is not an error pointer */ | |
137 | #define ut_assertok_ptr(expr) { \ | |
138 | const void *val = (expr); \ | |
139 | \ | |
140 | if (IS_ERR(val)) { \ | |
141 | ut_failf(uts, __FILE__, __LINE__, __func__, \ | |
142 | #expr " = NULL", \ | |
143 | "Expected pointer, got error %ld", \ | |
144 | PTR_ERR(val)); \ | |
145 | return CMD_RET_FAILURE; \ | |
146 | } \ | |
147 | } | |
148 | ||
149 | /* Assert that an operation succeeds (returns 0) */ | |
150 | #define ut_assertok(cond) ut_asserteq(0, cond) | |
151 | ||
152 | #endif |