1e721b882SJoe Hershberger /* 2e721b882SJoe Hershberger * Simple unit test library 3e721b882SJoe Hershberger * 4e721b882SJoe Hershberger * Copyright (c) 2013 Google, Inc 5e721b882SJoe Hershberger * 6e721b882SJoe Hershberger * SPDX-License-Identifier: GPL-2.0+ 7e721b882SJoe Hershberger */ 8e721b882SJoe Hershberger 9e721b882SJoe Hershberger #ifndef __TEST_UT_H 10e721b882SJoe Hershberger #define __TEST_UT_H 11e721b882SJoe Hershberger 1285aeda4aSSimon Glass #include <linux/err.h> 1385aeda4aSSimon Glass 14e721b882SJoe Hershberger struct unit_test_state; 15e721b882SJoe Hershberger 16e721b882SJoe Hershberger /** 17e721b882SJoe Hershberger * ut_fail() - Record failure of a unit test 18e721b882SJoe Hershberger * 19e721b882SJoe Hershberger * @uts: Test state 20*eae4b2b6SVagrant Cascadian * @fname: Filename where the error occurred 21*eae4b2b6SVagrant Cascadian * @line: Line number where the error occurred 22*eae4b2b6SVagrant Cascadian * @func: Function name where the error occurred 23e721b882SJoe Hershberger * @cond: The condition that failed 24e721b882SJoe Hershberger */ 25e721b882SJoe Hershberger void ut_fail(struct unit_test_state *uts, const char *fname, int line, 26e721b882SJoe Hershberger const char *func, const char *cond); 27e721b882SJoe Hershberger 28e721b882SJoe Hershberger /** 29e721b882SJoe Hershberger * ut_failf() - Record failure of a unit test 30e721b882SJoe Hershberger * 31e721b882SJoe Hershberger * @uts: Test state 32*eae4b2b6SVagrant Cascadian * @fname: Filename where the error occurred 33*eae4b2b6SVagrant Cascadian * @line: Line number where the error occurred 34*eae4b2b6SVagrant Cascadian * @func: Function name where the error occurred 35e721b882SJoe Hershberger * @cond: The condition that failed 36e721b882SJoe Hershberger * @fmt: printf() format string for the error, followed by args 37e721b882SJoe Hershberger */ 38e721b882SJoe Hershberger void ut_failf(struct unit_test_state *uts, const char *fname, int line, 39e721b882SJoe Hershberger const char *func, const char *cond, const char *fmt, ...) 40e721b882SJoe Hershberger __attribute__ ((format (__printf__, 6, 7))); 41e721b882SJoe Hershberger 42e721b882SJoe Hershberger 43e721b882SJoe Hershberger /* Assert that a condition is non-zero */ 44e721b882SJoe Hershberger #define ut_assert(cond) \ 45e721b882SJoe Hershberger if (!(cond)) { \ 46e721b882SJoe Hershberger ut_fail(uts, __FILE__, __LINE__, __func__, #cond); \ 47fe3f6a65SJoe Hershberger return CMD_RET_FAILURE; \ 48e721b882SJoe Hershberger } 49e721b882SJoe Hershberger 50e721b882SJoe Hershberger /* Assert that a condition is non-zero, with printf() string */ 51e721b882SJoe Hershberger #define ut_assertf(cond, fmt, args...) \ 52e721b882SJoe Hershberger if (!(cond)) { \ 53e721b882SJoe Hershberger ut_failf(uts, __FILE__, __LINE__, __func__, #cond, \ 54e721b882SJoe Hershberger fmt, ##args); \ 55fe3f6a65SJoe Hershberger return CMD_RET_FAILURE; \ 56e721b882SJoe Hershberger } 57e721b882SJoe Hershberger 58e721b882SJoe Hershberger /* Assert that two int expressions are equal */ 59e721b882SJoe Hershberger #define ut_asserteq(expr1, expr2) { \ 60e721b882SJoe Hershberger unsigned int val1 = (expr1), val2 = (expr2); \ 61e721b882SJoe Hershberger \ 62e721b882SJoe Hershberger if (val1 != val2) { \ 63e721b882SJoe Hershberger ut_failf(uts, __FILE__, __LINE__, __func__, \ 64e721b882SJoe Hershberger #expr1 " == " #expr2, \ 65e721b882SJoe Hershberger "Expected %d, got %d", val1, val2); \ 66fe3f6a65SJoe Hershberger return CMD_RET_FAILURE; \ 67e721b882SJoe Hershberger } \ 68e721b882SJoe Hershberger } 69e721b882SJoe Hershberger 70e721b882SJoe Hershberger /* Assert that two string expressions are equal */ 71e721b882SJoe Hershberger #define ut_asserteq_str(expr1, expr2) { \ 72e721b882SJoe Hershberger const char *val1 = (expr1), *val2 = (expr2); \ 73e721b882SJoe Hershberger \ 74e721b882SJoe Hershberger if (strcmp(val1, val2)) { \ 75e721b882SJoe Hershberger ut_failf(uts, __FILE__, __LINE__, __func__, \ 76e721b882SJoe Hershberger #expr1 " = " #expr2, \ 77e721b882SJoe Hershberger "Expected \"%s\", got \"%s\"", val1, val2); \ 78fe3f6a65SJoe Hershberger return CMD_RET_FAILURE; \ 79e721b882SJoe Hershberger } \ 80e721b882SJoe Hershberger } 81e721b882SJoe Hershberger 82e721b882SJoe Hershberger /* Assert that two pointers are equal */ 83e721b882SJoe Hershberger #define ut_asserteq_ptr(expr1, expr2) { \ 84e721b882SJoe Hershberger const void *val1 = (expr1), *val2 = (expr2); \ 85e721b882SJoe Hershberger \ 86e721b882SJoe Hershberger if (val1 != val2) { \ 87e721b882SJoe Hershberger ut_failf(uts, __FILE__, __LINE__, __func__, \ 88e721b882SJoe Hershberger #expr1 " = " #expr2, \ 89e721b882SJoe Hershberger "Expected %p, got %p", val1, val2); \ 90fe3f6a65SJoe Hershberger return CMD_RET_FAILURE; \ 91e721b882SJoe Hershberger } \ 92e721b882SJoe Hershberger } 93e721b882SJoe Hershberger 94e721b882SJoe Hershberger /* Assert that a pointer is not NULL */ 95e721b882SJoe Hershberger #define ut_assertnonnull(expr) { \ 96e721b882SJoe Hershberger const void *val = (expr); \ 97e721b882SJoe Hershberger \ 98e721b882SJoe Hershberger if (val == NULL) { \ 99e721b882SJoe Hershberger ut_failf(uts, __FILE__, __LINE__, __func__, \ 100e721b882SJoe Hershberger #expr " = NULL", \ 101e721b882SJoe Hershberger "Expected non-null, got NULL"); \ 102fe3f6a65SJoe Hershberger return CMD_RET_FAILURE; \ 103e721b882SJoe Hershberger } \ 104e721b882SJoe Hershberger } 105e721b882SJoe Hershberger 10685aeda4aSSimon Glass /* Assert that a pointer is not an error pointer */ 10785aeda4aSSimon Glass #define ut_assertok_ptr(expr) { \ 10885aeda4aSSimon Glass const void *val = (expr); \ 10985aeda4aSSimon Glass \ 11085aeda4aSSimon Glass if (IS_ERR(val)) { \ 11185aeda4aSSimon Glass ut_failf(uts, __FILE__, __LINE__, __func__, \ 11285aeda4aSSimon Glass #expr " = NULL", \ 11385aeda4aSSimon Glass "Expected pointer, got error %ld", \ 11485aeda4aSSimon Glass PTR_ERR(val)); \ 11585aeda4aSSimon Glass return CMD_RET_FAILURE; \ 11685aeda4aSSimon Glass } \ 11785aeda4aSSimon Glass } 11885aeda4aSSimon Glass 119e721b882SJoe Hershberger /* Assert that an operation succeeds (returns 0) */ 120e721b882SJoe Hershberger #define ut_assertok(cond) ut_asserteq(0, cond) 121e721b882SJoe Hershberger 122e721b882SJoe Hershberger #endif 123