test: Allow preserving console recording on failure
Update the 'ut' command to have a -R command option to prevent ut_fail() and ut_failf() from clearing GD_FLG_RECORD. This is useful when testing the test framework itself, where error messages need to be captured. Refactor ut_fail() and ut_failf() to call ut_unsilence_console() instead of duplicating the flag-clearing logic. Co-developed-by: Claude <noreply@anthropic.com> Signed-off-by: Simon Glass <simon.glass@canonical.com>
This commit is contained in:
@@ -96,6 +96,7 @@ struct ut_arg {
|
|||||||
* @args: Parsed argument values for current test
|
* @args: Parsed argument values for current test
|
||||||
* @arg_count: Number of parsed arguments
|
* @arg_count: Number of parsed arguments
|
||||||
* @arg_error: Set if ut_str/int/bool() detects a type mismatch
|
* @arg_error: Set if ut_str/int/bool() detects a type mismatch
|
||||||
|
* @keep_record: Preserve console recording when ut_fail() is called
|
||||||
* @priv: Private data for tests to use as needed
|
* @priv: Private data for tests to use as needed
|
||||||
*/
|
*/
|
||||||
struct unit_test_state {
|
struct unit_test_state {
|
||||||
@@ -126,6 +127,7 @@ struct unit_test_state {
|
|||||||
struct ut_arg args[UT_MAX_ARGS];
|
struct ut_arg args[UT_MAX_ARGS];
|
||||||
int arg_count;
|
int arg_count;
|
||||||
bool arg_error;
|
bool arg_error;
|
||||||
|
bool keep_record;
|
||||||
char priv[UT_PRIV_SIZE];
|
char priv[UT_PRIV_SIZE];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -252,6 +252,7 @@ static int do_ut(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
|
|||||||
struct unit_test_state uts;
|
struct unit_test_state uts;
|
||||||
bool show_suites = false;
|
bool show_suites = false;
|
||||||
bool force_run = false;
|
bool force_run = false;
|
||||||
|
bool keep_record = false;
|
||||||
int runs_per_text = 1;
|
int runs_per_text = 1;
|
||||||
struct suite *ste;
|
struct suite *ste;
|
||||||
char *name;
|
char *name;
|
||||||
@@ -276,6 +277,9 @@ static int do_ut(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
|
|||||||
if (!strchr(test_insert, ':'))
|
if (!strchr(test_insert, ':'))
|
||||||
return CMD_RET_USAGE;
|
return CMD_RET_USAGE;
|
||||||
break;
|
break;
|
||||||
|
case 'R':
|
||||||
|
keep_record = true;
|
||||||
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
show_suites = true;
|
show_suites = true;
|
||||||
break;
|
break;
|
||||||
@@ -288,6 +292,7 @@ static int do_ut(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
|
|||||||
return CMD_RET_USAGE;
|
return CMD_RET_USAGE;
|
||||||
|
|
||||||
ut_init_state(&uts);
|
ut_init_state(&uts);
|
||||||
|
uts.keep_record = keep_record;
|
||||||
name = argv[0];
|
name = argv[0];
|
||||||
select_name = cmd_arg1(argc, argv);
|
select_name = cmd_arg1(argc, argv);
|
||||||
|
|
||||||
@@ -333,10 +338,11 @@ static int do_ut(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
U_BOOT_LONGHELP(ut,
|
U_BOOT_LONGHELP(ut,
|
||||||
"[-rs] [-f] [-I<n>:<one_test>] <suite> [<test> [<args>...]] - run unit tests\n"
|
"[-rs] [-f] [-R] [-I<n>:<one_test>] <suite> [<test> [<args>...]] - run unit tests\n"
|
||||||
" -r<runs> Number of times to run each test\n"
|
" -r<runs> Number of times to run each test\n"
|
||||||
" -f Force 'manual' tests to run as well\n"
|
" -f Force 'manual' tests to run as well\n"
|
||||||
" -I Test to run after <n> other tests have run\n"
|
" -I Test to run after <n> other tests have run\n"
|
||||||
|
" -R Preserve console recording on test failure\n"
|
||||||
" -s Show all suites with ut info\n"
|
" -s Show all suites with ut info\n"
|
||||||
" <suite> Test suite to run (or comma-separated list)\n"
|
" <suite> Test suite to run (or comma-separated list)\n"
|
||||||
" <test> Specific test to run (optional)\n"
|
" <test> Specific test to run (optional)\n"
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ DECLARE_GLOBAL_DATA_PTR;
|
|||||||
void ut_fail(struct unit_test_state *uts, const char *fname, int line,
|
void ut_fail(struct unit_test_state *uts, const char *fname, int line,
|
||||||
const char *func, const char *cond)
|
const char *func, const char *cond)
|
||||||
{
|
{
|
||||||
gd->flags &= ~(GD_FLG_SILENT | GD_FLG_RECORD);
|
ut_unsilence_console(uts);
|
||||||
printf("%s:%d, %s(): %s\n", fname, line, func, cond);
|
printf("%s:%d, %s(): %s\n", fname, line, func, cond);
|
||||||
uts->cur.fail_count++;
|
uts->cur.fail_count++;
|
||||||
}
|
}
|
||||||
@@ -33,7 +33,7 @@ void ut_failf(struct unit_test_state *uts, const char *fname, int line,
|
|||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
|
|
||||||
gd->flags &= ~(GD_FLG_SILENT | GD_FLG_RECORD);
|
ut_unsilence_console(uts);
|
||||||
printf("%s:%d, %s(): %s: ", fname, line, func, cond);
|
printf("%s:%d, %s(): %s: ", fname, line, func, cond);
|
||||||
va_start(args, fmt);
|
va_start(args, fmt);
|
||||||
vprintf(fmt, args);
|
vprintf(fmt, args);
|
||||||
@@ -286,6 +286,7 @@ void ut_silence_console(struct unit_test_state *uts)
|
|||||||
|
|
||||||
void ut_unsilence_console(struct unit_test_state *uts)
|
void ut_unsilence_console(struct unit_test_state *uts)
|
||||||
{
|
{
|
||||||
|
if (!uts->keep_record)
|
||||||
gd->flags &= ~(GD_FLG_SILENT | GD_FLG_RECORD);
|
gd->flags &= ~(GD_FLG_SILENT | GD_FLG_RECORD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user