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 <command.h> 12 #include <hexdump.h> 13 #include <linux/err.h> 14 #include <test/test.h> 15 16 struct unit_test_state; 17 18 /** 19 * ut_fail() - Record failure of a unit test 20 * 21 * @uts: Test state 22 * @fname: Filename where the error occurred 23 * @line: Line number where the error occurred 24 * @func: Function name where the error occurred 25 * @cond: The condition that failed 26 */ 27 void ut_fail(struct unit_test_state *uts, const char *fname, int line, 28 const char *func, const char *cond); 29 30 /** 31 * ut_failf() - Record failure of a unit test 32 * 33 * @uts: Test state 34 * @fname: Filename where the error occurred 35 * @line: Line number where the error occurred 36 * @func: Function name where the error occurred 37 * @cond: The condition that failed 38 * @fmt: printf() format string for the error, followed by args 39 */ 40 void ut_failf(struct unit_test_state *uts, const char *fname, int line, 41 const char *func, const char *cond, const char *fmt, ...) 42 __attribute__ ((format (__printf__, 6, 7))); 43 44 /** 45 * ut_check_console_line() - Check the next console line against expectations 46 * 47 * This creates a string and then checks it against the next line of console 48 * output obtained with console_record_readline(). 49 * 50 * After the function returns, uts->expect_str holds the expected string and 51 * uts->actual_str holds the actual string read from the console. 52 * 53 * @uts: Test state 54 * @fmt: printf() format string for the error, followed by args 55 * @return 0 if OK, other value on error 56 */ 57 int ut_check_console_line(struct unit_test_state *uts, const char *fmt, ...) 58 __attribute__ ((format (__printf__, 2, 3))); 59 60 /** 61 * ut_check_console_linen() - Check part of the next console line 62 * 63 * This creates a string and then checks it against the next line of console 64 * output obtained with console_record_readline(). Only the length of the 65 * string is checked 66 * 67 * After the function returns, uts->expect_str holds the expected string and 68 * uts->actual_str holds the actual string read from the console. 69 * 70 * @uts: Test state 71 * @fmt: printf() format string for the error, followed by args 72 * @return 0 if OK, other value on error 73 */ 74 int ut_check_console_linen(struct unit_test_state *uts, const char *fmt, ...) 75 __attribute__ ((format (__printf__, 2, 3))); 76 77 /** 78 * ut_check_skipline() - Check that the next console line exists and skip it 79 * 80 * @uts: Test state 81 * @return 0 if OK, other value on error 82 */ 83 int ut_check_skipline(struct unit_test_state *uts); 84 85 /** 86 * ut_check_console_end() - Check there is no more console output 87 * 88 * After the function returns, uts->actual_str holds the actual string read 89 * from the console 90 * 91 * @uts: Test state 92 * @return 0 if OK (console has no output), other value on error 93 */ 94 int ut_check_console_end(struct unit_test_state *uts); 95 96 /** 97 * ut_check_console_dump() - Check that next lines have a print_buffer() dump 98 * 99 * This only supports a byte dump. 100 * 101 * @total_bytes: Size of the expected dump in bytes` 102 * @return 0 if OK (looks like a dump and the length matches), other value on 103 * error 104 */ 105 int ut_check_console_dump(struct unit_test_state *uts, int total_bytes); 106 107 /* Assert that a condition is non-zero */ 108 #define ut_assert(cond) \ 109 if (!(cond)) { \ 110 ut_fail(uts, __FILE__, __LINE__, __func__, #cond); \ 111 return CMD_RET_FAILURE; \ 112 } 113 114 /* Assert that a condition is non-zero, with printf() string */ 115 #define ut_assertf(cond, fmt, args...) \ 116 if (!(cond)) { \ 117 ut_failf(uts, __FILE__, __LINE__, __func__, #cond, \ 118 fmt, ##args); \ 119 return CMD_RET_FAILURE; \ 120 } 121 122 /* Assert that two int expressions are equal */ 123 #define ut_asserteq(expr1, expr2) { \ 124 unsigned int _val1 = (expr1), _val2 = (expr2); \ 125 \ 126 if (_val1 != _val2) { \ 127 ut_failf(uts, __FILE__, __LINE__, __func__, \ 128 #expr1 " == " #expr2, \ 129 "Expected %#x (%d), got %#x (%d)", \ 130 _val1, _val1, _val2, _val2); \ 131 return CMD_RET_FAILURE; \ 132 } \ 133 } 134 135 /* Assert that two 64 int expressions are equal */ 136 #define ut_asserteq_64(expr1, expr2) { \ 137 u64 _val1 = (expr1), _val2 = (expr2); \ 138 \ 139 if (_val1 != _val2) { \ 140 ut_failf(uts, __FILE__, __LINE__, __func__, \ 141 #expr1 " == " #expr2, \ 142 "Expected %#llx (%lld), got %#llx (%lld)", \ 143 (unsigned long long)_val1, \ 144 (unsigned long long)_val1, \ 145 (unsigned long long)_val2, \ 146 (unsigned long long)_val2); \ 147 return CMD_RET_FAILURE; \ 148 } \ 149 } 150 151 /* Assert that two string expressions are equal */ 152 #define ut_asserteq_str(expr1, expr2) { \ 153 const char *_val1 = (expr1), *_val2 = (expr2); \ 154 \ 155 if (strcmp(_val1, _val2)) { \ 156 ut_failf(uts, __FILE__, __LINE__, __func__, \ 157 #expr1 " = " #expr2, \ 158 "Expected \"%s\", got \"%s\"", _val1, _val2); \ 159 return CMD_RET_FAILURE; \ 160 } \ 161 } 162 163 /* 164 * Assert that two string expressions are equal, up to length of the 165 * first 166 */ 167 #define ut_asserteq_strn(expr1, expr2) { \ 168 const char *_val1 = (expr1), *_val2 = (expr2); \ 169 int _len = strlen(_val1); \ 170 \ 171 if (memcmp(_val1, _val2, _len)) { \ 172 ut_failf(uts, __FILE__, __LINE__, __func__, \ 173 #expr1 " = " #expr2, \ 174 "Expected \"%.*s\", got \"%.*s\"", \ 175 _len, _val1, _len, _val2); \ 176 return CMD_RET_FAILURE; \ 177 } \ 178 } 179 180 /* Assert that two memory areas are equal */ 181 #define ut_asserteq_mem(expr1, expr2, len) { \ 182 const u8 *_val1 = (u8 *)(expr1), *_val2 = (u8 *)(expr2); \ 183 const uint __len = len; \ 184 \ 185 if (memcmp(_val1, _val2, __len)) { \ 186 char __buf1[64 + 1] = "\0"; \ 187 char __buf2[64 + 1] = "\0"; \ 188 bin2hex(__buf1, _val1, min(__len, (uint)32)); \ 189 bin2hex(__buf2, _val2, min(__len, (uint)32)); \ 190 ut_failf(uts, __FILE__, __LINE__, __func__, \ 191 #expr1 " = " #expr2, \ 192 "Expected \"%s\", got \"%s\"", \ 193 __buf1, __buf2); \ 194 return CMD_RET_FAILURE; \ 195 } \ 196 } 197 198 /* Assert that two pointers are equal */ 199 #define ut_asserteq_ptr(expr1, expr2) { \ 200 const void *_val1 = (expr1), *_val2 = (expr2); \ 201 \ 202 if (_val1 != _val2) { \ 203 ut_failf(uts, __FILE__, __LINE__, __func__, \ 204 #expr1 " = " #expr2, \ 205 "Expected %p, got %p", _val1, _val2); \ 206 return CMD_RET_FAILURE; \ 207 } \ 208 } 209 210 /* Assert that two addresses (converted from pointers) are equal */ 211 #define ut_asserteq_addr(expr1, expr2) { \ 212 ulong _val1 = map_to_sysmem(expr1); \ 213 ulong _val2 = map_to_sysmem(expr2); \ 214 \ 215 if (_val1 != _val2) { \ 216 ut_failf(uts, __FILE__, __LINE__, __func__, \ 217 #expr1 " = " #expr2, \ 218 "Expected %lx, got %lx", _val1, _val2); \ 219 return CMD_RET_FAILURE; \ 220 } \ 221 } 222 223 /* Assert that a pointer is NULL */ 224 #define ut_assertnull(expr) { \ 225 const void *_val = (expr); \ 226 \ 227 if (_val) { \ 228 ut_failf(uts, __FILE__, __LINE__, __func__, \ 229 #expr " != NULL", \ 230 "Expected NULL, got %p", _val); \ 231 return CMD_RET_FAILURE; \ 232 } \ 233 } 234 235 /* Assert that a pointer is not NULL */ 236 #define ut_assertnonnull(expr) { \ 237 const void *_val = (expr); \ 238 \ 239 if (!_val) { \ 240 ut_failf(uts, __FILE__, __LINE__, __func__, \ 241 #expr " = NULL", \ 242 "Expected non-null, got NULL"); \ 243 return CMD_RET_FAILURE; \ 244 } \ 245 } 246 247 /* Assert that a pointer is not an error pointer */ 248 #define ut_assertok_ptr(expr) { \ 249 const void *_val = (expr); \ 250 \ 251 if (IS_ERR(_val)) { \ 252 ut_failf(uts, __FILE__, __LINE__, __func__, \ 253 #expr " = NULL", \ 254 "Expected pointer, got error %ld", \ 255 PTR_ERR(_val)); \ 256 return CMD_RET_FAILURE; \ 257 } \ 258 } 259 260 /* Assert that an operation succeeds (returns 0) */ 261 #define ut_assertok(cond) ut_asserteq(0, cond) 262 263 /* Assert that the next console output line matches */ 264 #define ut_assert_nextline(fmt, args...) \ 265 if (ut_check_console_line(uts, fmt, ##args)) { \ 266 ut_failf(uts, __FILE__, __LINE__, __func__, \ 267 "console", "\nExpected '%s',\n got '%s'", \ 268 uts->expect_str, uts->actual_str); \ 269 return CMD_RET_FAILURE; \ 270 } \ 271 272 /* Assert that the next console output line matches up to the length */ 273 #define ut_assert_nextlinen(fmt, args...) \ 274 if (ut_check_console_linen(uts, fmt, ##args)) { \ 275 ut_failf(uts, __FILE__, __LINE__, __func__, \ 276 "console", "\nExpected '%s',\n got '%s'", \ 277 uts->expect_str, uts->actual_str); \ 278 return CMD_RET_FAILURE; \ 279 } \ 280 281 /* Assert that there is a 'next' console output line, and skip it */ 282 #define ut_assert_skipline() \ 283 if (ut_check_skipline(uts)) { \ 284 ut_failf(uts, __FILE__, __LINE__, __func__, \ 285 "console", "\nExpected a line, got end"); \ 286 return CMD_RET_FAILURE; \ 287 } \ 288 289 /* Assert that there is no more console output */ 290 #define ut_assert_console_end() \ 291 if (ut_check_console_end(uts)) { \ 292 ut_failf(uts, __FILE__, __LINE__, __func__, \ 293 "console", "Expected no more output, got '%s'",\ 294 uts->actual_str); \ 295 return CMD_RET_FAILURE; \ 296 } \ 297 298 /* Assert that the next lines are print_buffer() dump at an address */ 299 #define ut_assert_nextlines_are_dump(total_bytes) \ 300 if (ut_check_console_dump(uts, total_bytes)) { \ 301 ut_failf(uts, __FILE__, __LINE__, __func__, \ 302 "console", \ 303 "Expected dump of length %x bytes, got '%s'", \ 304 total_bytes, uts->actual_str); \ 305 return CMD_RET_FAILURE; \ 306 } \ 307 308 /** 309 * ut_check_free() - Return the number of bytes free in the malloc() pool 310 * 311 * @return bytes free 312 */ 313 ulong ut_check_free(void); 314 315 /** 316 * ut_check_delta() - Return the number of bytes allocated/freed 317 * 318 * @last: Last value from ut_check_free 319 * @return free memory delta from @last; positive means more memory has been 320 * allocated, negative means less has been allocated (i.e. some is freed) 321 */ 322 long ut_check_delta(ulong last); 323 324 /** 325 * ut_silence_console() - Silence the console if requested by the user 326 * 327 * This stops test output from appear on the console. It is the default on 328 * sandbox, unless the -v flag is given. For other boards, this does nothing. 329 * 330 * @uts: Test state (in case in future we want to keep state here) 331 */ 332 void ut_silence_console(struct unit_test_state *uts); 333 334 /** 335 * ut_unsilence_console() - Unsilence the console after a test 336 * 337 * This restarts console output again and turns off console recording. This 338 * happens on all boards, including sandbox. 339 */ 340 void ut_unsilence_console(struct unit_test_state *uts); 341 342 /** 343 * ut_set_skip_delays() - Sets whether delays should be skipped 344 * 345 * Normally functions like mdelay() cause U-Boot to wait for a while. This 346 * allows all such delays to be skipped on sandbox, to speed up tests 347 * 348 * @uts: Test state (in case in future we want to keep state here) 349 * @skip_delays: true to skip delays, false to process them normally 350 */ 351 void ut_set_skip_delays(struct unit_test_state *uts, bool skip_delays); 352 353 /** 354 * test_get_state() - Get the active test state 355 * 356 * @return the currently active test state, or NULL if none 357 */ 358 struct unit_test_state *test_get_state(void); 359 360 /** 361 * test_set_state() - Set the active test state 362 * 363 * @uts: Test state to use as currently active test state, or NULL if none 364 */ 365 void test_set_state(struct unit_test_state *uts); 366 367 /** 368 * ut_run_tests() - Run a set of tests 369 * 370 * This runs the test, handling any preparation and clean-up needed. It prints 371 * the name of each test before running it. 372 * 373 * @category: Category of these tests. This is a string printed at the start to 374 * announce the the number of tests 375 * @prefix: String prefix for the tests. Any tests that have this prefix will be 376 * printed without the prefix, so that it is easier to see the unique part 377 * of the test name. If NULL, no prefix processing is done 378 * @tests: List of tests to run 379 * @count: Number of tests to run 380 * @select_name: Name of a single test to run (from the list provided). If NULL 381 * then all tests are run 382 * @return 0 if all tests passed, -1 if any failed 383 */ 384 int ut_run_list(const char *name, const char *prefix, struct unit_test *tests, 385 int count, const char *select_name); 386 387 #endif 388