When running parametrized test cases, diagnostic messages
are not properly aligned with the test result lines:

    $ ./tools/testing/kunit/kunit.py run --raw_output \
        --kunitconfig ./lib/kunit/.kunitconfig *.example_params*

    KTAP version 1
    1..1
    # example: initializing suite
        KTAP version 1
        # Subtest: example
        # module: kunit_example_test
        1..1
            KTAP version 1
            # Subtest: example_params_test
        # example_params_test: initializing
        # example_params_test: cleaning up
            ok 1 example value 3 # SKIP unsupported param value 3
        # example_params_test: initializing
        # example_params_test: cleaning up
            ok 2 example value 2
        # example_params_test: initializing
        # example_params_test: cleaning up
            ok 3 example value 1
        # example_params_test: initializing
        # example_params_test: cleaning up
            ok 4 example value 0 # SKIP unsupported param value 0
        # example_params_test: pass:2 fail:0 skip:2 total:4
        ok 1 example_params_test
    # example: exiting suite
    # Totals: pass:2 fail:0 skip:2 total:4
    ok 1 example

Add test level attribute and use it to generate proper indent
at the runtime:

    KTAP version 1
    1..1
    # example: initializing suite
        KTAP version 1
        # Subtest: example
        # module: kunit_example_test
        1..1
            KTAP version 1
            # Subtest: example_params_test
            # example_params_test: initializing
            # example_params_test: cleaning up
            ok 1 example value 3 # SKIP unsupported param value 3
            # example_params_test: initializing
            # example_params_test: cleaning up
            ok 2 example value 2
            # example_params_test: initializing
            # example_params_test: cleaning up
            ok 3 example value 1
            # example_params_test: initializing
            # example_params_test: cleaning up
            ok 4 example value 0 # SKIP unsupported param value 0
        # example_params_test: pass:2 fail:0 skip:2 total:4
        ok 1 example_params_test
    # example: exiting suite
    # Totals: pass:2 fail:0 skip:2 total:4
    ok 1 example

Signed-off-by: Michal Wajdeczko <michal.wajdec...@intel.com>
Cc: David Gow <david...@google.com>
Cc: Rae Moar <rm...@google.com>
---
 include/kunit/test.h |  3 ++-
 lib/kunit/test.c     | 52 ++++++++++++++++++++------------------------
 2 files changed, 26 insertions(+), 29 deletions(-)

diff --git a/include/kunit/test.h b/include/kunit/test.h
index 158876c4cb43..4804d539e10f 100644
--- a/include/kunit/test.h
+++ b/include/kunit/test.h
@@ -276,6 +276,7 @@ struct kunit {
        void *priv;
 
        /* private: internal use only. */
+       unsigned int level; /* Helps in proper log indent */
        const char *name; /* Read only after initialization! */
        struct string_stream *log; /* Points at case log after initialization */
        struct kunit_try_catch try_catch;
@@ -519,7 +520,7 @@ enum {
 #define kunit_level(test_or_suite)                                     \
        _Generic((test_or_suite),                                       \
                 struct kunit_suite * : KUNIT_LEVEL_SUITE,              \
-                struct kunit * : KUNIT_LEVEL_CASE)
+                struct kunit * : ((struct kunit *)(test_or_suite))->level)
 
 #define kunit_indent_level(test_or_suite)                              \
        (KUNIT_INDENT_LEN * kunit_level(test_or_suite))
diff --git a/lib/kunit/test.c b/lib/kunit/test.c
index d10e6d610e20..43c3efc286e4 100644
--- a/lib/kunit/test.c
+++ b/lib/kunit/test.c
@@ -99,14 +99,13 @@ static void kunit_print_test_stats(struct kunit *test,
        if (!kunit_should_print_stats(stats))
                return;
 
-       kunit_log(KERN_INFO, test,
-                 KUNIT_SUBTEST_INDENT
-                 "# %s: pass:%lu fail:%lu skip:%lu total:%lu",
-                 test->name,
-                 stats.passed,
-                 stats.failed,
-                 stats.skipped,
-                 stats.total);
+       kunit_log_indent(KERN_INFO, test,
+                        "# %s: pass:%lu fail:%lu skip:%lu total:%lu",
+                        test->name,
+                        stats.passed,
+                        stats.failed,
+                        stats.skipped,
+                        stats.total);
 }
 
 /* Append formatted message to log. */
@@ -154,7 +153,6 @@ static void kunit_print_suite_start(struct kunit_suite 
*suite)
 }
 
 static void kunit_print_ok_not_ok(struct kunit *test,
-                                 unsigned int test_level,
                                  enum kunit_status status,
                                  size_t test_number,
                                  const char *description,
@@ -163,12 +161,6 @@ static void kunit_print_ok_not_ok(struct kunit *test,
        const char *directive_header = (status == KUNIT_SKIPPED) ? " # SKIP " : 
"";
        const char *directive_body = (status == KUNIT_SKIPPED) ? directive : "";
 
-       /*
-        * When test is NULL assume that results are from the suite
-        * and today suite results are expected at level 0 only.
-        */
-       WARN(!test && test_level, "suite test level can't be %u!\n", 
test_level);
-
        /*
         * We do not log the test suite results as doing so would
         * mean debugfs display would consist of an incorrect test
@@ -182,12 +174,11 @@ static void kunit_print_ok_not_ok(struct kunit *test,
                        test_number, description, directive_header,
                        directive_body);
        else
-               kunit_log(KERN_INFO, test,
-                         "%*s%s %zd %s%s%s",
-                         KUNIT_INDENT_LEN * test_level, "",
-                         kunit_status_to_ok_not_ok(status),
-                         test_number, description, directive_header,
-                         directive_body);
+               kunit_log_indent(KERN_INFO, test,
+                                "%s %zd %s%s%s",
+                                kunit_status_to_ok_not_ok(status),
+                                test_number, description, directive_header,
+                                directive_body);
 }
 
 enum kunit_status kunit_suite_has_succeeded(struct kunit_suite *suite)
@@ -213,7 +204,7 @@ static size_t kunit_suite_counter = 1;
 
 static void kunit_print_suite_end(struct kunit_suite *suite)
 {
-       kunit_print_ok_not_ok(NULL, KUNIT_LEVEL_SUITE,
+       kunit_print_ok_not_ok(NULL,
                              kunit_suite_has_succeeded(suite),
                              kunit_suite_counter++,
                              suite->name,
@@ -322,6 +313,7 @@ void kunit_init_test(struct kunit *test, const char *name, 
struct string_stream
 {
        spin_lock_init(&test->lock);
        INIT_LIST_HEAD(&test->resources);
+       test->level = KUNIT_LEVEL_CASE;
        test->name = name;
        test->log = log;
        if (test->log)
@@ -584,14 +576,15 @@ int kunit_run_tests(struct kunit_suite *suite)
                        kunit_run_case_catch_errors(suite, test_case, &test);
                        kunit_update_stats(&param_stats, test.status);
                } else {
+                       /* Parameterized test is one level up from simple 
test-case. */
+                       test.level++;
+
                        /* Get initial param. */
                        param_desc[0] = '\0';
                        test.param_value = test_case->generate_params(NULL, 
param_desc);
                        test_case->status = KUNIT_SKIPPED;
-                       kunit_log(KERN_INFO, &test, KUNIT_SUBTEST_INDENT 
KUNIT_SUBTEST_INDENT
-                                 "KTAP version 1\n");
-                       kunit_log(KERN_INFO, &test, KUNIT_SUBTEST_INDENT 
KUNIT_SUBTEST_INDENT
-                                 "# Subtest: %s", test_case->name);
+                       kunit_log_indent(KERN_INFO, &test, "KTAP version 1\n");
+                       kunit_log_indent(KERN_INFO, &test, "# Subtest: %s", 
test_case->name);
 
                        while (test.param_value) {
                                kunit_run_case_catch_errors(suite, test_case, 
&test);
@@ -601,7 +594,7 @@ int kunit_run_tests(struct kunit_suite *suite)
                                                 "param-%d", test.param_index);
                                }
 
-                               kunit_print_ok_not_ok(&test, 
KUNIT_LEVEL_CASE_PARAM,
+                               kunit_print_ok_not_ok(&test,
                                                      test.status,
                                                      test.param_index + 1,
                                                      param_desc,
@@ -616,13 +609,16 @@ int kunit_run_tests(struct kunit_suite *suite)
                                test.status = KUNIT_SUCCESS;
                                test.status_comment[0] = '\0';
                        }
+
+                       /* Return to parent (test-case) level. */
+                       test.level--;
                }
 
                kunit_print_attr((void *)test_case, true, KUNIT_LEVEL_CASE);
 
                kunit_print_test_stats(&test, param_stats);
 
-               kunit_print_ok_not_ok(&test, KUNIT_LEVEL_CASE, 
test_case->status,
+               kunit_print_ok_not_ok(&test, test_case->status,
                                      kunit_test_case_num(suite, test_case),
                                      test_case->name,
                                      test.status_comment);
-- 
2.25.1

Reply via email to