blob: f7d1d18f7c17b9e77c588321ad095198d63c8d37 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001/* SPDX-License-Identifier: GPL-2.0+ */
Simon Glassb2c1cac2014-02-26 15:59:21 -07002/*
Joe Hershberger3a77be52015-05-20 14:27:27 -05003 * Simple unit test library
Simon Glassb2c1cac2014-02-26 15:59:21 -07004 *
5 * Copyright (c) 2013 Google, Inc
Simon Glassb2c1cac2014-02-26 15:59:21 -07006 */
7
Joe Hershberger3a77be52015-05-20 14:27:27 -05008#ifndef __TEST_UT_H
9#define __TEST_UT_H
Simon Glassb2c1cac2014-02-26 15:59:21 -070010
Simon Glassed38aef2020-05-10 11:40:03 -060011#include <command.h>
Simon Glassc5e7f662020-04-08 16:57:40 -060012#include <hexdump.h>
Simon Glass7e1cebf2015-07-06 12:54:37 -060013#include <linux/err.h>
Simon Glass75c4d412020-07-19 10:15:37 -060014#include <test/test.h>
Simon Glass7e1cebf2015-07-06 12:54:37 -060015
Joe Hershberger3a77be52015-05-20 14:27:27 -050016struct unit_test_state;
Simon Glassb2c1cac2014-02-26 15:59:21 -070017
18/**
19 * ut_fail() - Record failure of a unit test
20 *
Joe Hershberger3a77be52015-05-20 14:27:27 -050021 * @uts: Test state
Vagrant Cascadianedfdb992016-04-30 19:18:00 -070022 * @fname: Filename where the error occurred
23 * @line: Line number where the error occurred
24 * @func: Function name where the error occurred
Simon Glassb2c1cac2014-02-26 15:59:21 -070025 * @cond: The condition that failed
26 */
Joe Hershberger3a77be52015-05-20 14:27:27 -050027void ut_fail(struct unit_test_state *uts, const char *fname, int line,
Simon Glassb2c1cac2014-02-26 15:59:21 -070028 const char *func, const char *cond);
29
30/**
31 * ut_failf() - Record failure of a unit test
32 *
Joe Hershberger3a77be52015-05-20 14:27:27 -050033 * @uts: Test state
Vagrant Cascadianedfdb992016-04-30 19:18:00 -070034 * @fname: Filename where the error occurred
35 * @line: Line number where the error occurred
36 * @func: Function name where the error occurred
Simon Glassb2c1cac2014-02-26 15:59:21 -070037 * @cond: The condition that failed
38 * @fmt: printf() format string for the error, followed by args
39 */
Joe Hershberger3a77be52015-05-20 14:27:27 -050040void ut_failf(struct unit_test_state *uts, const char *fname, int line,
Simon Glassb2c1cac2014-02-26 15:59:21 -070041 const char *func, const char *cond, const char *fmt, ...)
42 __attribute__ ((format (__printf__, 6, 7)));
43
Simon Glassd856e912020-01-27 08:49:56 -070044/**
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
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +010055 * Return: 0 if OK, other value on error
Simon Glassd856e912020-01-27 08:49:56 -070056 */
57int ut_check_console_line(struct unit_test_state *uts, const char *fmt, ...)
58 __attribute__ ((format (__printf__, 2, 3)));
59
60/**
Simon Glassc963df92020-07-28 19:41:10 -060061 * 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
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +010072 * Return: 0 if OK, other value on error
Simon Glassc963df92020-07-28 19:41:10 -060073 */
74int 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
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +010081 * Return: 0 if OK, other value on error
Simon Glassc963df92020-07-28 19:41:10 -060082 */
83int ut_check_skipline(struct unit_test_state *uts);
84
85/**
Simon Glass12892b02021-08-18 21:40:33 -060086 * ut_check_skip_to_line() - skip output until a line is found
87 *
88 * This creates a string and then checks it against the following lines of
89 * console output obtained with console_record_readline() until it is found.
90 *
91 * After the function returns, uts->expect_str holds the expected string and
92 * uts->actual_str holds the actual string read from the console.
93 *
94 * @uts: Test state
95 * @fmt: printf() format string to look for, followed by args
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +010096 * Return: 0 if OK, -ENOENT if not found, other value on error
Simon Glass12892b02021-08-18 21:40:33 -060097 */
98int ut_check_skip_to_line(struct unit_test_state *uts, const char *fmt, ...);
99
100/**
Simon Glassd856e912020-01-27 08:49:56 -0700101 * ut_check_console_end() - Check there is no more console output
102 *
103 * After the function returns, uts->actual_str holds the actual string read
104 * from the console
105 *
106 * @uts: Test state
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100107 * Return: 0 if OK (console has no output), other value on error
Simon Glassd856e912020-01-27 08:49:56 -0700108 */
109int ut_check_console_end(struct unit_test_state *uts);
110
111/**
112 * ut_check_console_dump() - Check that next lines have a print_buffer() dump
113 *
114 * This only supports a byte dump.
115 *
116 * @total_bytes: Size of the expected dump in bytes`
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100117 * Return: 0 if OK (looks like a dump and the length matches), other value on
Simon Glassd856e912020-01-27 08:49:56 -0700118 * error
119 */
120int ut_check_console_dump(struct unit_test_state *uts, int total_bytes);
Simon Glassb2c1cac2014-02-26 15:59:21 -0700121
122/* Assert that a condition is non-zero */
123#define ut_assert(cond) \
124 if (!(cond)) { \
Joe Hershberger3a77be52015-05-20 14:27:27 -0500125 ut_fail(uts, __FILE__, __LINE__, __func__, #cond); \
Joe Hershberger436cfc72015-05-20 14:27:34 -0500126 return CMD_RET_FAILURE; \
Simon Glassb2c1cac2014-02-26 15:59:21 -0700127 }
128
129/* Assert that a condition is non-zero, with printf() string */
130#define ut_assertf(cond, fmt, args...) \
131 if (!(cond)) { \
Joe Hershberger3a77be52015-05-20 14:27:27 -0500132 ut_failf(uts, __FILE__, __LINE__, __func__, #cond, \
Simon Glassb2c1cac2014-02-26 15:59:21 -0700133 fmt, ##args); \
Joe Hershberger436cfc72015-05-20 14:27:34 -0500134 return CMD_RET_FAILURE; \
Simon Glassb2c1cac2014-02-26 15:59:21 -0700135 }
136
137/* Assert that two int expressions are equal */
138#define ut_asserteq(expr1, expr2) { \
Simon Glass43c336b2020-01-27 08:49:41 -0700139 unsigned int _val1 = (expr1), _val2 = (expr2); \
Simon Glassb2c1cac2014-02-26 15:59:21 -0700140 \
Simon Glass43c336b2020-01-27 08:49:41 -0700141 if (_val1 != _val2) { \
Joe Hershberger3a77be52015-05-20 14:27:27 -0500142 ut_failf(uts, __FILE__, __LINE__, __func__, \
Simon Glassb2c1cac2014-02-26 15:59:21 -0700143 #expr1 " == " #expr2, \
Simon Glass43c336b2020-01-27 08:49:41 -0700144 "Expected %#x (%d), got %#x (%d)", \
145 _val1, _val1, _val2, _val2); \
Joe Hershberger436cfc72015-05-20 14:27:34 -0500146 return CMD_RET_FAILURE; \
Simon Glassb2c1cac2014-02-26 15:59:21 -0700147 } \
148}
149
Dario Binacchi421e81e2020-03-29 18:04:40 +0200150/* Assert that two 64 int expressions are equal */
151#define ut_asserteq_64(expr1, expr2) { \
152 u64 _val1 = (expr1), _val2 = (expr2); \
153 \
154 if (_val1 != _val2) { \
155 ut_failf(uts, __FILE__, __LINE__, __func__, \
156 #expr1 " == " #expr2, \
157 "Expected %#llx (%lld), got %#llx (%lld)", \
158 (unsigned long long)_val1, \
159 (unsigned long long)_val1, \
160 (unsigned long long)_val2, \
161 (unsigned long long)_val2); \
162 return CMD_RET_FAILURE; \
163 } \
164}
165
Simon Glassb2c1cac2014-02-26 15:59:21 -0700166/* Assert that two string expressions are equal */
167#define ut_asserteq_str(expr1, expr2) { \
Simon Glass43c336b2020-01-27 08:49:41 -0700168 const char *_val1 = (expr1), *_val2 = (expr2); \
Simon Glassb2c1cac2014-02-26 15:59:21 -0700169 \
Simon Glass43c336b2020-01-27 08:49:41 -0700170 if (strcmp(_val1, _val2)) { \
Joe Hershberger3a77be52015-05-20 14:27:27 -0500171 ut_failf(uts, __FILE__, __LINE__, __func__, \
Simon Glassb2c1cac2014-02-26 15:59:21 -0700172 #expr1 " = " #expr2, \
Simon Glass43c336b2020-01-27 08:49:41 -0700173 "Expected \"%s\", got \"%s\"", _val1, _val2); \
Joe Hershberger436cfc72015-05-20 14:27:34 -0500174 return CMD_RET_FAILURE; \
Simon Glassb2c1cac2014-02-26 15:59:21 -0700175 } \
176}
177
Simon Glass0dc3d512020-07-07 13:11:54 -0600178/*
179 * Assert that two string expressions are equal, up to length of the
180 * first
181 */
182#define ut_asserteq_strn(expr1, expr2) { \
183 const char *_val1 = (expr1), *_val2 = (expr2); \
184 int _len = strlen(_val1); \
185 \
186 if (memcmp(_val1, _val2, _len)) { \
187 ut_failf(uts, __FILE__, __LINE__, __func__, \
188 #expr1 " = " #expr2, \
189 "Expected \"%.*s\", got \"%.*s\"", \
190 _len, _val1, _len, _val2); \
191 return CMD_RET_FAILURE; \
192 } \
193}
194
Mario Sixffdf8ab2018-09-27 09:19:32 +0200195/* Assert that two memory areas are equal */
196#define ut_asserteq_mem(expr1, expr2, len) { \
Simon Glass43c336b2020-01-27 08:49:41 -0700197 const u8 *_val1 = (u8 *)(expr1), *_val2 = (u8 *)(expr2); \
Mario Sixffdf8ab2018-09-27 09:19:32 +0200198 const uint __len = len; \
199 \
Simon Glass43c336b2020-01-27 08:49:41 -0700200 if (memcmp(_val1, _val2, __len)) { \
Mario Sixffdf8ab2018-09-27 09:19:32 +0200201 char __buf1[64 + 1] = "\0"; \
202 char __buf2[64 + 1] = "\0"; \
Simon Glass43c336b2020-01-27 08:49:41 -0700203 bin2hex(__buf1, _val1, min(__len, (uint)32)); \
204 bin2hex(__buf2, _val2, min(__len, (uint)32)); \
Mario Sixffdf8ab2018-09-27 09:19:32 +0200205 ut_failf(uts, __FILE__, __LINE__, __func__, \
206 #expr1 " = " #expr2, \
207 "Expected \"%s\", got \"%s\"", \
208 __buf1, __buf2); \
209 return CMD_RET_FAILURE; \
210 } \
211}
212
Simon Glassb2c1cac2014-02-26 15:59:21 -0700213/* Assert that two pointers are equal */
214#define ut_asserteq_ptr(expr1, expr2) { \
Simon Glass43c336b2020-01-27 08:49:41 -0700215 const void *_val1 = (expr1), *_val2 = (expr2); \
Simon Glassb2c1cac2014-02-26 15:59:21 -0700216 \
Simon Glass43c336b2020-01-27 08:49:41 -0700217 if (_val1 != _val2) { \
Joe Hershberger3a77be52015-05-20 14:27:27 -0500218 ut_failf(uts, __FILE__, __LINE__, __func__, \
Simon Glassb2c1cac2014-02-26 15:59:21 -0700219 #expr1 " = " #expr2, \
Simon Glass43c336b2020-01-27 08:49:41 -0700220 "Expected %p, got %p", _val1, _val2); \
Joe Hershberger436cfc72015-05-20 14:27:34 -0500221 return CMD_RET_FAILURE; \
Simon Glassb2c1cac2014-02-26 15:59:21 -0700222 } \
223}
224
Simon Glass7c58b082020-09-19 18:49:27 -0600225/* Assert that two addresses (converted from pointers) are equal */
226#define ut_asserteq_addr(expr1, expr2) { \
227 ulong _val1 = map_to_sysmem(expr1); \
228 ulong _val2 = map_to_sysmem(expr2); \
229 \
230 if (_val1 != _val2) { \
231 ut_failf(uts, __FILE__, __LINE__, __func__, \
232 #expr1 " = " #expr2, \
233 "Expected %lx, got %lx", _val1, _val2); \
234 return CMD_RET_FAILURE; \
235 } \
236}
237
Ramon Friedbecc3e02018-06-21 17:47:16 +0300238/* Assert that a pointer is NULL */
239#define ut_assertnull(expr) { \
Simon Glass43c336b2020-01-27 08:49:41 -0700240 const void *_val = (expr); \
Ramon Friedbecc3e02018-06-21 17:47:16 +0300241 \
Simon Glass43c336b2020-01-27 08:49:41 -0700242 if (_val) { \
Ramon Friedbecc3e02018-06-21 17:47:16 +0300243 ut_failf(uts, __FILE__, __LINE__, __func__, \
244 #expr " != NULL", \
Simon Glass43c336b2020-01-27 08:49:41 -0700245 "Expected NULL, got %p", _val); \
Ramon Friedbecc3e02018-06-21 17:47:16 +0300246 return CMD_RET_FAILURE; \
247 } \
248}
249
Simon Glass7df766e2014-12-10 08:55:55 -0700250/* Assert that a pointer is not NULL */
251#define ut_assertnonnull(expr) { \
Simon Glass43c336b2020-01-27 08:49:41 -0700252 const void *_val = (expr); \
Simon Glass7df766e2014-12-10 08:55:55 -0700253 \
Simon Glass43c336b2020-01-27 08:49:41 -0700254 if (!_val) { \
Joe Hershberger3a77be52015-05-20 14:27:27 -0500255 ut_failf(uts, __FILE__, __LINE__, __func__, \
Simon Glass7df766e2014-12-10 08:55:55 -0700256 #expr " = NULL", \
257 "Expected non-null, got NULL"); \
Joe Hershberger436cfc72015-05-20 14:27:34 -0500258 return CMD_RET_FAILURE; \
Simon Glass7df766e2014-12-10 08:55:55 -0700259 } \
260}
261
Simon Glass7e1cebf2015-07-06 12:54:37 -0600262/* Assert that a pointer is not an error pointer */
Simon Glassd21afd52017-05-18 20:10:00 -0600263#define ut_assertok_ptr(expr) { \
Simon Glass43c336b2020-01-27 08:49:41 -0700264 const void *_val = (expr); \
Simon Glass7e1cebf2015-07-06 12:54:37 -0600265 \
Simon Glass43c336b2020-01-27 08:49:41 -0700266 if (IS_ERR(_val)) { \
Simon Glass7e1cebf2015-07-06 12:54:37 -0600267 ut_failf(uts, __FILE__, __LINE__, __func__, \
268 #expr " = NULL", \
269 "Expected pointer, got error %ld", \
Simon Glass43c336b2020-01-27 08:49:41 -0700270 PTR_ERR(_val)); \
Simon Glass7e1cebf2015-07-06 12:54:37 -0600271 return CMD_RET_FAILURE; \
272 } \
273}
274
Simon Glassb2c1cac2014-02-26 15:59:21 -0700275/* Assert that an operation succeeds (returns 0) */
276#define ut_assertok(cond) ut_asserteq(0, cond)
277
Simon Glassd856e912020-01-27 08:49:56 -0700278/* Assert that the next console output line matches */
279#define ut_assert_nextline(fmt, args...) \
280 if (ut_check_console_line(uts, fmt, ##args)) { \
281 ut_failf(uts, __FILE__, __LINE__, __func__, \
282 "console", "\nExpected '%s',\n got '%s'", \
283 uts->expect_str, uts->actual_str); \
284 return CMD_RET_FAILURE; \
285 } \
286
Simon Glassc963df92020-07-28 19:41:10 -0600287/* Assert that the next console output line matches up to the length */
288#define ut_assert_nextlinen(fmt, args...) \
289 if (ut_check_console_linen(uts, fmt, ##args)) { \
290 ut_failf(uts, __FILE__, __LINE__, __func__, \
291 "console", "\nExpected '%s',\n got '%s'", \
292 uts->expect_str, uts->actual_str); \
293 return CMD_RET_FAILURE; \
294 } \
295
296/* Assert that there is a 'next' console output line, and skip it */
297#define ut_assert_skipline() \
298 if (ut_check_skipline(uts)) { \
299 ut_failf(uts, __FILE__, __LINE__, __func__, \
300 "console", "\nExpected a line, got end"); \
301 return CMD_RET_FAILURE; \
302 } \
303
Simon Glass12892b02021-08-18 21:40:33 -0600304/* Assert that a following console output line matches */
305#define ut_assert_skip_to_line(fmt, args...) \
306 if (ut_check_skip_to_line(uts, fmt, ##args)) { \
307 ut_failf(uts, __FILE__, __LINE__, __func__, \
308 "console", "\nExpected '%s',\n got to '%s'", \
309 uts->expect_str, uts->actual_str); \
310 return CMD_RET_FAILURE; \
311 } \
312
Simon Glassd856e912020-01-27 08:49:56 -0700313/* Assert that there is no more console output */
314#define ut_assert_console_end() \
315 if (ut_check_console_end(uts)) { \
316 ut_failf(uts, __FILE__, __LINE__, __func__, \
317 "console", "Expected no more output, got '%s'",\
318 uts->actual_str); \
319 return CMD_RET_FAILURE; \
320 } \
321
322/* Assert that the next lines are print_buffer() dump at an address */
323#define ut_assert_nextlines_are_dump(total_bytes) \
324 if (ut_check_console_dump(uts, total_bytes)) { \
325 ut_failf(uts, __FILE__, __LINE__, __func__, \
326 "console", \
327 "Expected dump of length %x bytes, got '%s'", \
328 total_bytes, uts->actual_str); \
329 return CMD_RET_FAILURE; \
330 } \
331
Simon Glass19920d72019-12-29 21:19:23 -0700332/**
333 * ut_check_free() - Return the number of bytes free in the malloc() pool
334 *
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100335 * Return: bytes free
Simon Glass19920d72019-12-29 21:19:23 -0700336 */
337ulong ut_check_free(void);
338
339/**
340 * ut_check_delta() - Return the number of bytes allocated/freed
341 *
342 * @last: Last value from ut_check_free
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100343 * Return: free memory delta from @last; positive means more memory has been
Simon Glass19920d72019-12-29 21:19:23 -0700344 * allocated, negative means less has been allocated (i.e. some is freed)
345 */
346long ut_check_delta(ulong last);
347
Simon Glassb8f00822020-11-08 21:08:43 -0700348/**
349 * ut_silence_console() - Silence the console if requested by the user
350 *
351 * This stops test output from appear on the console. It is the default on
352 * sandbox, unless the -v flag is given. For other boards, this does nothing.
353 *
354 * @uts: Test state (in case in future we want to keep state here)
355 */
356void ut_silence_console(struct unit_test_state *uts);
357
358/**
359 * ut_unsilence_console() - Unsilence the console after a test
360 *
361 * This restarts console output again and turns off console recording. This
362 * happens on all boards, including sandbox.
363 */
364void ut_unsilence_console(struct unit_test_state *uts);
365
Simon Glass5722fb22021-03-07 17:34:47 -0700366/**
Simon Glass59cad962021-03-07 17:34:55 -0700367 * ut_set_skip_delays() - Sets whether delays should be skipped
368 *
369 * Normally functions like mdelay() cause U-Boot to wait for a while. This
370 * allows all such delays to be skipped on sandbox, to speed up tests
371 *
372 * @uts: Test state (in case in future we want to keep state here)
373 * @skip_delays: true to skip delays, false to process them normally
374 */
375void ut_set_skip_delays(struct unit_test_state *uts, bool skip_delays);
376
377/**
Simon Glass4066d8d2021-03-07 17:35:04 -0700378 * test_get_state() - Get the active test state
379 *
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100380 * Return: the currently active test state, or NULL if none
Simon Glass4066d8d2021-03-07 17:35:04 -0700381 */
382struct unit_test_state *test_get_state(void);
383
384/**
385 * test_set_state() - Set the active test state
386 *
387 * @uts: Test state to use as currently active test state, or NULL if none
388 */
389void test_set_state(struct unit_test_state *uts);
390
391/**
Simon Glass5722fb22021-03-07 17:34:47 -0700392 * ut_run_tests() - Run a set of tests
393 *
394 * This runs the test, handling any preparation and clean-up needed. It prints
395 * the name of each test before running it.
396 *
397 * @category: Category of these tests. This is a string printed at the start to
398 * announce the the number of tests
399 * @prefix: String prefix for the tests. Any tests that have this prefix will be
400 * printed without the prefix, so that it is easier to see the unique part
401 * of the test name. If NULL, no prefix processing is done
402 * @tests: List of tests to run
403 * @count: Number of tests to run
404 * @select_name: Name of a single test to run (from the list provided). If NULL
405 * then all tests are run
Simon Glass91a187b2022-08-01 07:58:45 -0600406 * @runs_per_test: Number of times to run each test (typically 1)
Heinrich Schuchardt47b4c022022-01-19 18:05:50 +0100407 * Return: 0 if all tests passed, -1 if any failed
Simon Glass5722fb22021-03-07 17:34:47 -0700408 */
409int ut_run_list(const char *name, const char *prefix, struct unit_test *tests,
Simon Glass91a187b2022-08-01 07:58:45 -0600410 int count, const char *select_name, int runs_per_test);
Simon Glass5722fb22021-03-07 17:34:47 -0700411
Simon Glassb2c1cac2014-02-26 15:59:21 -0700412#endif