This makes it visually simpler to follow the output. Also, highlight with red color failures when outputting to tty. Before: #1 attach_probe:FAIL #2 bpf_obj_id:OK #3/1 bpf_verif_scale:loop3.o:OK #3/2 bpf_verif_scale:test_verif_scale1.o:OK #3/3 bpf_verif_scale:test_verif_scale2.o:OK #3/4 bpf_verif_scale:test_verif_scale3.o:OK #3/5 bpf_verif_scale:pyperf50.o:OK #3/6 bpf_verif_scale:pyperf100.o:OK #3/7 bpf_verif_scale:pyperf180.o:OK #3/8 bpf_verif_scale:pyperf600.o:OK #3/9 bpf_verif_scale:pyperf600_nounroll.o:OK #3/10 bpf_verif_scale:loop1.o:OK #3/11 bpf_verif_scale:loop2.o:OK #3/12 bpf_verif_scale:loop4.o:OK #3/13 bpf_verif_scale:loop5.o:OK #3/14 bpf_verif_scale:strobemeta.o:OK #3/15 bpf_verif_scale:strobemeta_nounroll1.o:OK #3/16 bpf_verif_scale:strobemeta_nounroll2.o:OK #3/17 bpf_verif_scale:test_sysctl_loop1.o:OK #3/18 bpf_verif_scale:test_sysctl_loop2.o:OK #3/19 bpf_verif_scale:test_xdp_loop.o:OK #3/20 bpf_verif_scale:test_seg6_loop.o:OK #3 bpf_verif_scale:OK #4 flow_dissector:OK After: # 1 FAIL attach_probe # 2 OK bpf_obj_id # 3/1 OK bpf_verif_scale:loop3.o # 3/2 OK bpf_verif_scale:test_verif_scale1.o # 3/3 OK bpf_verif_scale:test_verif_scale2.o # 3/4 OK bpf_verif_scale:test_verif_scale3.o # 3/5 OK bpf_verif_scale:pyperf50.o # 3/6 OK bpf_verif_scale:pyperf100.o # 3/7 OK bpf_verif_scale:pyperf180.o # 3/8 OK bpf_verif_scale:pyperf600.o # 3/9 OK bpf_verif_scale:pyperf600_nounroll.o # 3/10 OK bpf_verif_scale:loop1.o # 3/11 OK bpf_verif_scale:loop2.o # 3/12 OK bpf_verif_scale:loop4.o # 3/13 OK bpf_verif_scale:loop5.o # 3/14 OK bpf_verif_scale:strobemeta.o # 3/15 OK bpf_verif_scale:strobemeta_nounroll1.o # 3/16 OK bpf_verif_scale:strobemeta_nounroll2.o # 3/17 OK bpf_verif_scale:test_sysctl_loop1.o # 3/18 OK bpf_verif_scale:test_sysctl_loop2.o # 3/19 OK bpf_verif_scale:test_xdp_loop.o # 3/20 OK bpf_verif_scale:test_seg6_loop.o # 3 OK bpf_verif_scale # 4 OK flow_dissector Cc: Andrii Nakryiko <andriin@xxxxxx> Signed-off-by: Stanislav Fomichev <sdf@xxxxxxxxxx> --- tools/testing/selftests/bpf/test_progs.c | 29 +++++++++++++++++++----- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c index 12895d03d58b..1a7a2a0c0a11 100644 --- a/tools/testing/selftests/bpf/test_progs.c +++ b/tools/testing/selftests/bpf/test_progs.c @@ -56,6 +56,21 @@ static void dump_test_log(const struct prog_test_def *test, bool failed) fseeko(stdout, 0, SEEK_SET); /* rewind */ } +static const char *test_status_string(bool success) +{ +#define COLOR_RED "\033[31m" +#define COLOR_RESET "\033[m" + if (success) + return "OK"; + + if (isatty(fileno(env.stdout))) + return COLOR_RED "FAIL" COLOR_RESET; + else + return "FAIL"; +#undef COLOR_RED +#undef COLOR_RESET +} + void test__end_subtest() { struct prog_test_def *test = env.test; @@ -68,9 +83,10 @@ void test__end_subtest() dump_test_log(test, sub_error_cnt); - fprintf(env.stdout, "#%d/%d %s:%s\n", - test->test_num, test->subtest_num, - test->subtest_name, sub_error_cnt ? "FAIL" : "OK"); + fprintf(env.stdout, "#%3d/%-3d %4s %s:%s\n", + test->test_num, test->subtest_num, + test_status_string(test->fail_cnt == 0), + test->test_name, test->subtest_name); } bool test__start_subtest(const char *name) @@ -513,9 +529,10 @@ int main(int argc, char **argv) dump_test_log(test, test->error_cnt); - fprintf(env.stdout, "#%d %s:%s\n", - test->test_num, test->test_name, - test->error_cnt ? "FAIL" : "OK"); + fprintf(env.stdout, "#%3d %4s %s\n", + test->test_num, + test_status_string(test->fail_cnt == 0), + test->test_name); } stdio_restore(); printf("Summary: %d/%d PASSED, %d FAILED\n", -- 2.23.0.rc1.153.gdeed80330f-goog