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