test: Add a way to check part of a console line or skip it
Some lines of the output are not worth testing, or not worth testing in their entirety. For example, when checking a hex dump we know that the hex-dump routine can display ASCII so we only need to check the hex bytes, not the ASCII dump. Add a new test macros which can check only part of a console line. Sometimes it is useful to skip a line altogether, so add a macro for that also. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
		
							parent
							
								
									7d914bc76b
								
							
						
					
					
						commit
						33d7edfd5f
					
				|  | @ -57,6 +57,31 @@ void ut_failf(struct unit_test_state *uts, const char *fname, int line, | ||||||
| int ut_check_console_line(struct unit_test_state *uts, const char *fmt, ...) | int ut_check_console_line(struct unit_test_state *uts, const char *fmt, ...) | ||||||
| 			__attribute__ ((format (__printf__, 2, 3))); | 			__attribute__ ((format (__printf__, 2, 3))); | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * ut_check_console_linen() - Check part of the next console line | ||||||
|  |  * | ||||||
|  |  * This creates a string and then checks it against the next line of console | ||||||
|  |  * output obtained with console_record_readline(). Only the length of the | ||||||
|  |  * string is checked | ||||||
|  |  * | ||||||
|  |  * After the function returns, uts->expect_str holds the expected string and | ||||||
|  |  * uts->actual_str holds the actual string read from the console. | ||||||
|  |  * | ||||||
|  |  * @uts: Test state | ||||||
|  |  * @fmt: printf() format string for the error, followed by args | ||||||
|  |  * @return 0 if OK, other value on error | ||||||
|  |  */ | ||||||
|  | int ut_check_console_linen(struct unit_test_state *uts, const char *fmt, ...) | ||||||
|  | 			__attribute__ ((format (__printf__, 2, 3))); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * ut_check_skipline() - Check that the next console line exists and skip it | ||||||
|  |  * | ||||||
|  |  * @uts: Test state | ||||||
|  |  * @return 0 if OK, other value on error | ||||||
|  |  */ | ||||||
|  | int ut_check_skipline(struct unit_test_state *uts); | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * ut_check_console_end() - Check there is no more console output |  * ut_check_console_end() - Check there is no more console output | ||||||
|  * |  * | ||||||
|  | @ -152,6 +177,23 @@ int ut_check_console_dump(struct unit_test_state *uts, int total_bytes); | ||||||
| 	}								\ | 	}								\ | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /*
 | ||||||
|  |  * Assert that two string expressions are equal, up to length of the | ||||||
|  |  * first | ||||||
|  |  */ | ||||||
|  | #define ut_asserteq_strn(expr1, expr2) {				\ | ||||||
|  | 	const char *_val1 = (expr1), *_val2 = (expr2);			\ | ||||||
|  | 	int _len = strlen(_val1);					\ | ||||||
|  | 									\ | ||||||
|  | 	if (memcmp(_val1, _val2, _len)) {				\ | ||||||
|  | 		ut_failf(uts, __FILE__, __LINE__, __func__,		\ | ||||||
|  | 			 #expr1 " = " #expr2,				\ | ||||||
|  | 			 "Expected \"%.*s\", got \"%.*s\"",		\ | ||||||
|  | 			 _len, _val1, _len, _val2);			\ | ||||||
|  | 		return CMD_RET_FAILURE;					\ | ||||||
|  | 	}								\ | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /* Assert that two memory areas are equal */ | /* Assert that two memory areas are equal */ | ||||||
| #define ut_asserteq_mem(expr1, expr2, len) {				\ | #define ut_asserteq_mem(expr1, expr2, len) {				\ | ||||||
| 	const u8 *_val1 = (u8 *)(expr1), *_val2 = (u8 *)(expr2);	\ | 	const u8 *_val1 = (u8 *)(expr1), *_val2 = (u8 *)(expr2);	\ | ||||||
|  | @ -231,6 +273,23 @@ int ut_check_console_dump(struct unit_test_state *uts, int total_bytes); | ||||||
| 		return CMD_RET_FAILURE;					\ | 		return CMD_RET_FAILURE;					\ | ||||||
| 	}								\ | 	}								\ | ||||||
| 
 | 
 | ||||||
|  | /* Assert that the next console output line matches up to the length */ | ||||||
|  | #define ut_assert_nextlinen(fmt, args...)				\ | ||||||
|  | 	if (ut_check_console_linen(uts, fmt, ##args)) {			\ | ||||||
|  | 		ut_failf(uts, __FILE__, __LINE__, __func__,		\ | ||||||
|  | 			 "console", "\nExpected '%s',\n     got '%s'",	\ | ||||||
|  | 			 uts->expect_str, uts->actual_str);		\ | ||||||
|  | 		return CMD_RET_FAILURE;					\ | ||||||
|  | 	}								\ | ||||||
|  | 
 | ||||||
|  | /* Assert that there is a 'next' console output line, and skip it */ | ||||||
|  | #define ut_assert_skipline()						\ | ||||||
|  | 	if (ut_check_skipline(uts)) {					\ | ||||||
|  | 		ut_failf(uts, __FILE__, __LINE__, __func__,		\ | ||||||
|  | 			 "console", "\nExpected a line, got end");	\ | ||||||
|  | 		return CMD_RET_FAILURE;					\ | ||||||
|  | 	}								\ | ||||||
|  | 
 | ||||||
| /* Assert that there is no more console output */ | /* Assert that there is no more console output */ | ||||||
| #define ut_assert_console_end()						\ | #define ut_assert_console_end()						\ | ||||||
| 	if (ut_check_console_end(uts)) {				\ | 	if (ut_check_console_end(uts)) {				\ | ||||||
|  |  | ||||||
							
								
								
									
										22
									
								
								test/ut.c
								
								
								
								
							
							
						
						
									
										22
									
								
								test/ut.c
								
								
								
								
							|  | @ -59,6 +59,28 @@ int ut_check_console_line(struct unit_test_state *uts, const char *fmt, ...) | ||||||
| 	return strcmp(uts->expect_str, uts->actual_str); | 	return strcmp(uts->expect_str, uts->actual_str); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | int ut_check_console_linen(struct unit_test_state *uts, const char *fmt, ...) | ||||||
|  | { | ||||||
|  | 	va_list args; | ||||||
|  | 
 | ||||||
|  | 	va_start(args, fmt); | ||||||
|  | 	vsnprintf(uts->expect_str, sizeof(uts->expect_str), fmt, args); | ||||||
|  | 	va_end(args); | ||||||
|  | 	console_record_readline(uts->actual_str, sizeof(uts->actual_str)); | ||||||
|  | 
 | ||||||
|  | 	return strncmp(uts->expect_str, uts->actual_str, | ||||||
|  | 		       strlen(uts->expect_str)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int ut_check_skipline(struct unit_test_state *uts) | ||||||
|  | { | ||||||
|  | 	if (!console_record_avail()) | ||||||
|  | 		return -ENFILE; | ||||||
|  | 	console_record_readline(uts->actual_str, sizeof(uts->actual_str)); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| int ut_check_console_end(struct unit_test_state *uts) | int ut_check_console_end(struct unit_test_state *uts) | ||||||
| { | { | ||||||
| 	if (!console_record_avail()) | 	if (!console_record_avail()) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue