Message ID | 20230307223937.2892762-1-rmoar@google.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 887d85a0736ff346cbfe5efaf51cf20c7ca195a3 |
Delegated to: | Brendan Higgins |
Headers | show |
Series | [v3,1/3] kunit: fix bug in debugfs logs of parameterized tests | expand |
On Wed, 8 Mar 2023 at 06:39, Rae Moar <rmoar@google.com> wrote: > > Fix bug in debugfs logs that causes individual parameterized results to not > appear because the log is reinitialized (cleared) when each parameter is > run. > > Ensure these results appear in the debugfs logs, increase log size to > allow for the size of parameterized results. As a result, append lines to > the log directly rather than using an intermediate variable that can cause > stack size warnings due to the increased log size. > > Here is the debugfs log of ext4_inode_test which uses parameterized tests > before the fix: > > KTAP version 1 > > # Subtest: ext4_inode_test > 1..1 > # Totals: pass:16 fail:0 skip:0 total:16 > ok 1 ext4_inode_test > > As you can see, this log does not include any of the individual > parametrized results. > > After (in combination with the next two fixes to remove extra empty line > and ensure KTAP valid format): > > KTAP version 1 > 1..1 > KTAP version 1 > # Subtest: ext4_inode_test > 1..1 > KTAP version 1 > # Subtest: inode_test_xtimestamp_decoding > ok 1 1901-12-13 Lower bound of 32bit < 0 timestamp, no extra bits > ... (the rest of the individual parameterized tests) > ok 16 2446-05-10 Upper bound of 32bit >=0 timestamp. All extra > # inode_test_xtimestamp_decoding: pass:16 fail:0 skip:0 total:16 > ok 1 inode_test_xtimestamp_decoding > # Totals: pass:16 fail:0 skip:0 total:16 > ok 1 ext4_inode_test > > Signed-off-by: Rae Moar <rmoar@google.com> > Reviewed-by: David Gow <davidgow@google.com> > --- Thanks, this is working fine here! Reviewed-by: David Gow <davidgow@google.com> Cheers, -- David > > Changes from v2 -> v3: > - Fix a off-by-one bug in the kunit_log_append method. > > Changes from v1 -> v2: > - Remove the use of the line variable in kunit_log_append that was causing > stack size warnings. > - Add before and after to the commit message. > > include/kunit/test.h | 2 +- > lib/kunit/test.c | 18 ++++++++++++------ > 2 files changed, 13 insertions(+), 7 deletions(-) > > diff --git a/include/kunit/test.h b/include/kunit/test.h > index 08d3559dd703..0668d29f3453 100644 > --- a/include/kunit/test.h > +++ b/include/kunit/test.h > @@ -34,7 +34,7 @@ DECLARE_STATIC_KEY_FALSE(kunit_running); > struct kunit; > > /* Size of log associated with test. */ > -#define KUNIT_LOG_SIZE 512 > +#define KUNIT_LOG_SIZE 1500 > > /* Maximum size of parameter description string. */ > #define KUNIT_PARAM_DESC_SIZE 128 > diff --git a/lib/kunit/test.c b/lib/kunit/test.c > index c9e15bb60058..c4d6304edd61 100644 > --- a/lib/kunit/test.c > +++ b/lib/kunit/test.c > @@ -114,22 +114,27 @@ static void kunit_print_test_stats(struct kunit *test, > */ > void kunit_log_append(char *log, const char *fmt, ...) > { > - char line[KUNIT_LOG_SIZE]; > va_list args; > - int len_left; > + int len, log_len, len_left; > > if (!log) > return; > > - len_left = KUNIT_LOG_SIZE - strlen(log) - 1; > + log_len = strlen(log); > + len_left = KUNIT_LOG_SIZE - log_len - 1; > if (len_left <= 0) > return; > > + /* Evaluate length of line to add to log */ > va_start(args, fmt); > - vsnprintf(line, sizeof(line), fmt, args); > + len = vsnprintf(NULL, 0, fmt, args) + 1; > + va_end(args); > + > + /* Print formatted line to the log */ > + va_start(args, fmt); > + vsnprintf(log + log_len, min(len, len_left), fmt, args); > va_end(args); > > - strncat(log, line, len_left); > } > EXPORT_SYMBOL_GPL(kunit_log_append); > > @@ -437,7 +442,6 @@ static void kunit_run_case_catch_errors(struct kunit_suite *suite, > struct kunit_try_catch_context context; > struct kunit_try_catch *try_catch; > > - kunit_init_test(test, test_case->name, test_case->log); > try_catch = &test->try_catch; > > kunit_try_catch_init(try_catch, > @@ -533,6 +537,8 @@ int kunit_run_tests(struct kunit_suite *suite) > struct kunit_result_stats param_stats = { 0 }; > test_case->status = KUNIT_SKIPPED; > > + kunit_init_test(&test, test_case->name, test_case->log); > + > if (!test_case->generate_params) { > /* Non-parameterised test. */ > kunit_run_case_catch_errors(suite, test_case, &test); > > base-commit: 60684c2bd35064043360e6f716d1b7c20e967b7d > -- > 2.40.0.rc0.216.gc4246ad0f0-goog >
diff --git a/include/kunit/test.h b/include/kunit/test.h index 08d3559dd703..0668d29f3453 100644 --- a/include/kunit/test.h +++ b/include/kunit/test.h @@ -34,7 +34,7 @@ DECLARE_STATIC_KEY_FALSE(kunit_running); struct kunit; /* Size of log associated with test. */ -#define KUNIT_LOG_SIZE 512 +#define KUNIT_LOG_SIZE 1500 /* Maximum size of parameter description string. */ #define KUNIT_PARAM_DESC_SIZE 128 diff --git a/lib/kunit/test.c b/lib/kunit/test.c index c9e15bb60058..c4d6304edd61 100644 --- a/lib/kunit/test.c +++ b/lib/kunit/test.c @@ -114,22 +114,27 @@ static void kunit_print_test_stats(struct kunit *test, */ void kunit_log_append(char *log, const char *fmt, ...) { - char line[KUNIT_LOG_SIZE]; va_list args; - int len_left; + int len, log_len, len_left; if (!log) return; - len_left = KUNIT_LOG_SIZE - strlen(log) - 1; + log_len = strlen(log); + len_left = KUNIT_LOG_SIZE - log_len - 1; if (len_left <= 0) return; + /* Evaluate length of line to add to log */ va_start(args, fmt); - vsnprintf(line, sizeof(line), fmt, args); + len = vsnprintf(NULL, 0, fmt, args) + 1; + va_end(args); + + /* Print formatted line to the log */ + va_start(args, fmt); + vsnprintf(log + log_len, min(len, len_left), fmt, args); va_end(args); - strncat(log, line, len_left); } EXPORT_SYMBOL_GPL(kunit_log_append); @@ -437,7 +442,6 @@ static void kunit_run_case_catch_errors(struct kunit_suite *suite, struct kunit_try_catch_context context; struct kunit_try_catch *try_catch; - kunit_init_test(test, test_case->name, test_case->log); try_catch = &test->try_catch; kunit_try_catch_init(try_catch, @@ -533,6 +537,8 @@ int kunit_run_tests(struct kunit_suite *suite) struct kunit_result_stats param_stats = { 0 }; test_case->status = KUNIT_SKIPPED; + kunit_init_test(&test, test_case->name, test_case->log); + if (!test_case->generate_params) { /* Non-parameterised test. */ kunit_run_case_catch_errors(suite, test_case, &test);