linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 1/3] kunit: fix bug in debugfs logs of parameterized tests
@ 2023-03-07 22:39 Rae Moar
  2023-03-07 22:39 ` [PATCH v3 2/3] kunit: fix bug in the order of lines in debugfs logs Rae Moar
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Rae Moar @ 2023-03-07 22:39 UTC (permalink / raw)
  To: brendanhiggins, davidgow, dlatypov
  Cc: skhan, kunit-dev, linux-kernel, linux-kselftest, Rae Moar

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>
---

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


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v3 2/3] kunit: fix bug in the order of lines in debugfs logs
  2023-03-07 22:39 [PATCH v3 1/3] kunit: fix bug in debugfs logs of parameterized tests Rae Moar
@ 2023-03-07 22:39 ` Rae Moar
  2023-03-08  5:04   ` David Gow
  2023-03-07 22:39 ` [PATCH v3 3/3] kunit: fix bug of extra newline characters " Rae Moar
  2023-03-08  5:04 ` [PATCH v3 1/3] kunit: fix bug in debugfs logs of parameterized tests David Gow
  2 siblings, 1 reply; 6+ messages in thread
From: Rae Moar @ 2023-03-07 22:39 UTC (permalink / raw)
  To: brendanhiggins, davidgow, dlatypov
  Cc: skhan, kunit-dev, linux-kernel, linux-kselftest, Rae Moar

Fix bug in debugfs logs that causes an incorrect order of lines in the
debugfs log.

Currently, the test counts lines that show the number of tests passed,
failed, and skipped, as well as any suite diagnostic lines,
appear prior to the individual results, which is a bug.

Ensure the order of printing for the debugfs log is correct. Additionally,
add a KTAP header to so the debugfs logs can be valid KTAP.

This is an example of a log prior to these fixes:

     KTAP version 1

     # Subtest: kunit_status
     1..2
 # kunit_status: pass:2 fail:0 skip:0 total:2
 # Totals: pass:2 fail:0 skip:0 total:2
     ok 1 kunit_status_set_failure_test
     ok 2 kunit_status_mark_skipped_test
 ok 1 kunit_status

Note the two lines with stats are out of order. This is the same debugfs
log after the fixes (in combination with the third patch to remove the
extra line):

 KTAP version 1
 1..1
     KTAP version 1
     # Subtest: kunit_status
     1..2
     ok 1 kunit_status_set_failure_test
     ok 2 kunit_status_mark_skipped_test
 # kunit_status: pass:2 fail:0 skip:0 total:2
 # Totals: pass:2 fail:0 skip:0 total:2
 ok 1 kunit_status

Signed-off-by: Rae Moar <rmoar@google.com>
---

Changes from v2 -> v3:
- No changes.

Changes from v1 -> v2:
- Add KTAP header.
- Ensure test result number is 1.

 lib/kunit/debugfs.c | 14 ++++++++++++--
 lib/kunit/test.c    | 21 ++++++++++++++-------
 2 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/lib/kunit/debugfs.c b/lib/kunit/debugfs.c
index de0ee2e03ed6..b08bb1fba106 100644
--- a/lib/kunit/debugfs.c
+++ b/lib/kunit/debugfs.c
@@ -55,14 +55,24 @@ static int debugfs_print_results(struct seq_file *seq, void *v)
 	enum kunit_status success = kunit_suite_has_succeeded(suite);
 	struct kunit_case *test_case;
 
-	if (!suite || !suite->log)
+	if (!suite)
 		return 0;
 
-	seq_printf(seq, "%s", suite->log);
+	/* Print KTAP header so the debugfs log can be parsed as valid KTAP. */
+	seq_puts(seq, "KTAP version 1\n");
+	seq_puts(seq, "1..1\n");
+
+	/* Print suite header because it is not stored in the test logs. */
+	seq_puts(seq, KUNIT_SUBTEST_INDENT "KTAP version 1\n");
+	seq_printf(seq, KUNIT_SUBTEST_INDENT "# Subtest: %s\n", suite->name);
+	seq_printf(seq, KUNIT_SUBTEST_INDENT "1..%zd\n", kunit_suite_num_test_cases(suite));
 
 	kunit_suite_for_each_test_case(suite, test_case)
 		debugfs_print_result(seq, suite, test_case);
 
+	if (suite->log)
+		seq_printf(seq, "%s", suite->log);
+
 	seq_printf(seq, "%s %d %s\n",
 		   kunit_status_to_ok_not_ok(success), 1, suite->name);
 	return 0;
diff --git a/lib/kunit/test.c b/lib/kunit/test.c
index c4d6304edd61..811fcc376d2f 100644
--- a/lib/kunit/test.c
+++ b/lib/kunit/test.c
@@ -152,10 +152,18 @@ EXPORT_SYMBOL_GPL(kunit_suite_num_test_cases);
 
 static void kunit_print_suite_start(struct kunit_suite *suite)
 {
-	kunit_log(KERN_INFO, suite, KUNIT_SUBTEST_INDENT "KTAP version 1\n");
-	kunit_log(KERN_INFO, suite, KUNIT_SUBTEST_INDENT "# Subtest: %s",
+	/*
+	 * We do not log the test suite header as doing so would
+	 * mean debugfs display would consist of the test suite
+	 * header prior to individual test results.
+	 * Hence directly printk the suite status, and we will
+	 * separately seq_printf() the suite header for the debugfs
+	 * representation.
+	 */
+	pr_info(KUNIT_SUBTEST_INDENT "KTAP version 1\n");
+	pr_info(KUNIT_SUBTEST_INDENT "# Subtest: %s\n",
 		  suite->name);
-	kunit_log(KERN_INFO, suite, KUNIT_SUBTEST_INDENT "1..%zd",
+	pr_info(KUNIT_SUBTEST_INDENT "1..%zd\n",
 		  kunit_suite_num_test_cases(suite));
 }
 
@@ -172,10 +180,9 @@ static void kunit_print_ok_not_ok(void *test_or_suite,
 
 	/*
 	 * We do not log the test suite results as doing so would
-	 * mean debugfs display would consist of the test suite
-	 * description and status prior to individual test results.
-	 * Hence directly printk the suite status, and we will
-	 * separately seq_printf() the suite status for the debugfs
+	 * mean debugfs display would consist of an incorrect test
+	 * number. Hence directly printk the suite result, and we will
+	 * separately seq_printf() the suite results for the debugfs
 	 * representation.
 	 */
 	if (suite)
-- 
2.40.0.rc0.216.gc4246ad0f0-goog


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v3 3/3] kunit: fix bug of extra newline characters in debugfs logs
  2023-03-07 22:39 [PATCH v3 1/3] kunit: fix bug in debugfs logs of parameterized tests Rae Moar
  2023-03-07 22:39 ` [PATCH v3 2/3] kunit: fix bug in the order of lines in debugfs logs Rae Moar
@ 2023-03-07 22:39 ` Rae Moar
  2023-03-08  5:05   ` David Gow
  2023-03-08  5:04 ` [PATCH v3 1/3] kunit: fix bug in debugfs logs of parameterized tests David Gow
  2 siblings, 1 reply; 6+ messages in thread
From: Rae Moar @ 2023-03-07 22:39 UTC (permalink / raw)
  To: brendanhiggins, davidgow, dlatypov
  Cc: skhan, kunit-dev, linux-kernel, linux-kselftest, Rae Moar

Fix bug of the extra newline characters in debugfs logs. When a
line is added to debugfs with a newline character at the end,
an extra line appears in the debugfs log.

This is due to a discrepancy between how the lines are printed and how they
are added to the logs. Remove this discrepancy by checking if a newline
character is present before adding a newline character. This should closely
match the printk behavior.

Add kunit_log_newline_test to provide test coverage for this issue.  (Also,
move kunit_log_test above suite definition to remove the unnecessary
declaration prior to the suite definition)

As an example, say we add these two lines to the log:

kunit_log(..., "KTAP version 1\n");
kunit_log(..., "1..1");

The debugfs log before this fix:

 KTAP version 1

 1..1

The debugfs log after this fix:

 KTAP version 1
 1..1

Signed-off-by: Rae Moar <rmoar@google.com>
---

Changes from v2 -> v3:
- Changes to commit message.

Changes from v1 -> v2:
- Changed the way extra newlines are removed. Instead of removing extra
  newline characters, add a newline if one is not present. This is a bit
  cleaner.
- Note: I looked into using KERN_CONT to match the printk behavior
  to vsnprintf but this could cause issues with KTAP printing on the same
  line as interrupting kernel messages. I also looked at just adding
  KERN_CONT functionality to kunit_log and I did get this to work but it
  was a bit messy because it required a few calls to kunit_log_newline in
  kunit_run_tests. If this is very desired functionality, happy to add this
  to version 3.

 include/kunit/test.h   |  2 +-
 lib/kunit/kunit-test.c | 35 +++++++++++++++++++++++------------
 lib/kunit/test.c       | 18 ++++++++++++++++++
 3 files changed, 42 insertions(+), 13 deletions(-)

diff --git a/include/kunit/test.h b/include/kunit/test.h
index 0668d29f3453..bd9dbae5e48d 100644
--- a/include/kunit/test.h
+++ b/include/kunit/test.h
@@ -420,7 +420,7 @@ void __printf(2, 3) kunit_log_append(char *log, const char *fmt, ...);
 #define kunit_log(lvl, test_or_suite, fmt, ...)				\
 	do {								\
 		printk(lvl fmt, ##__VA_ARGS__);				\
-		kunit_log_append((test_or_suite)->log,	fmt "\n",	\
+		kunit_log_append((test_or_suite)->log,	fmt,	\
 				 ##__VA_ARGS__);			\
 	} while (0)
 
diff --git a/lib/kunit/kunit-test.c b/lib/kunit/kunit-test.c
index 4df0335d0d06..b63595d3e241 100644
--- a/lib/kunit/kunit-test.c
+++ b/lib/kunit/kunit-test.c
@@ -443,18 +443,6 @@ static struct kunit_suite kunit_resource_test_suite = {
 	.test_cases = kunit_resource_test_cases,
 };
 
-static void kunit_log_test(struct kunit *test);
-
-static struct kunit_case kunit_log_test_cases[] = {
-	KUNIT_CASE(kunit_log_test),
-	{}
-};
-
-static struct kunit_suite kunit_log_test_suite = {
-	.name = "kunit-log-test",
-	.test_cases = kunit_log_test_cases,
-};
-
 static void kunit_log_test(struct kunit *test)
 {
 	struct kunit_suite suite;
@@ -481,6 +469,29 @@ static void kunit_log_test(struct kunit *test)
 #endif
 }
 
+static void kunit_log_newline_test(struct kunit *test)
+{
+	kunit_info(test, "Add newline\n");
+	if (test->log) {
+		KUNIT_ASSERT_NOT_NULL_MSG(test, strstr(test->log, "Add newline\n"),
+			"Missing log line, full log:\n%s", test->log);
+		KUNIT_EXPECT_NULL(test, strstr(test->log, "Add newline\n\n"));
+	} else {
+		kunit_skip(test, "only useful when debugfs is enabled");
+	}
+}
+
+static struct kunit_case kunit_log_test_cases[] = {
+	KUNIT_CASE(kunit_log_test),
+	KUNIT_CASE(kunit_log_newline_test),
+	{}
+};
+
+static struct kunit_suite kunit_log_test_suite = {
+	.name = "kunit-log-test",
+	.test_cases = kunit_log_test_cases,
+};
+
 static void kunit_status_set_failure_test(struct kunit *test)
 {
 	struct kunit fake;
diff --git a/lib/kunit/test.c b/lib/kunit/test.c
index 811fcc376d2f..e2910b261112 100644
--- a/lib/kunit/test.c
+++ b/lib/kunit/test.c
@@ -108,6 +108,22 @@ static void kunit_print_test_stats(struct kunit *test,
 		  stats.total);
 }
 
+/**
+ * kunit_log_newline() - Add newline to the end of log if one is not
+ * already present.
+ * @log: The log to add the newline to.
+ */
+static void kunit_log_newline(char *log)
+{
+	int log_len, len_left;
+
+	log_len = strlen(log);
+	len_left = KUNIT_LOG_SIZE - log_len - 1;
+
+	if (log_len > 0 && log[log_len - 1] != '\n')
+		strncat(log, "\n", len_left);
+}
+
 /*
  * Append formatted message to log, size of which is limited to
  * KUNIT_LOG_SIZE bytes (including null terminating byte).
@@ -135,6 +151,8 @@ void kunit_log_append(char *log, const char *fmt, ...)
 	vsnprintf(log + log_len, min(len, len_left), fmt, args);
 	va_end(args);
 
+	/* Add newline to end of log if not already present. */
+	kunit_log_newline(log);
 }
 EXPORT_SYMBOL_GPL(kunit_log_append);
 
-- 
2.40.0.rc0.216.gc4246ad0f0-goog


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v3 1/3] kunit: fix bug in debugfs logs of parameterized tests
  2023-03-07 22:39 [PATCH v3 1/3] kunit: fix bug in debugfs logs of parameterized tests Rae Moar
  2023-03-07 22:39 ` [PATCH v3 2/3] kunit: fix bug in the order of lines in debugfs logs Rae Moar
  2023-03-07 22:39 ` [PATCH v3 3/3] kunit: fix bug of extra newline characters " Rae Moar
@ 2023-03-08  5:04 ` David Gow
  2 siblings, 0 replies; 6+ messages in thread
From: David Gow @ 2023-03-08  5:04 UTC (permalink / raw)
  To: Rae Moar
  Cc: brendanhiggins, dlatypov, skhan, kunit-dev, linux-kernel,
	linux-kselftest

[-- Attachment #1: Type: text/plain, Size: 4584 bytes --]

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
>

[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4003 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v3 2/3] kunit: fix bug in the order of lines in debugfs logs
  2023-03-07 22:39 ` [PATCH v3 2/3] kunit: fix bug in the order of lines in debugfs logs Rae Moar
@ 2023-03-08  5:04   ` David Gow
  0 siblings, 0 replies; 6+ messages in thread
From: David Gow @ 2023-03-08  5:04 UTC (permalink / raw)
  To: Rae Moar
  Cc: brendanhiggins, dlatypov, skhan, kunit-dev, linux-kernel,
	linux-kselftest

[-- Attachment #1: Type: text/plain, Size: 4901 bytes --]

On Wed, 8 Mar 2023 at 06:39, Rae Moar <rmoar@google.com> wrote:
>
> Fix bug in debugfs logs that causes an incorrect order of lines in the
> debugfs log.
>
> Currently, the test counts lines that show the number of tests passed,
> failed, and skipped, as well as any suite diagnostic lines,
> appear prior to the individual results, which is a bug.
>
> Ensure the order of printing for the debugfs log is correct. Additionally,
> add a KTAP header to so the debugfs logs can be valid KTAP.
>
> This is an example of a log prior to these fixes:
>
>      KTAP version 1
>
>      # Subtest: kunit_status
>      1..2
>  # kunit_status: pass:2 fail:0 skip:0 total:2
>  # Totals: pass:2 fail:0 skip:0 total:2
>      ok 1 kunit_status_set_failure_test
>      ok 2 kunit_status_mark_skipped_test
>  ok 1 kunit_status
>
> Note the two lines with stats are out of order. This is the same debugfs
> log after the fixes (in combination with the third patch to remove the
> extra line):
>
>  KTAP version 1
>  1..1
>      KTAP version 1
>      # Subtest: kunit_status
>      1..2
>      ok 1 kunit_status_set_failure_test
>      ok 2 kunit_status_mark_skipped_test
>  # kunit_status: pass:2 fail:0 skip:0 total:2
>  # Totals: pass:2 fail:0 skip:0 total:2
>  ok 1 kunit_status
>
> Signed-off-by: Rae Moar <rmoar@google.com>
> ---

Looks good to me.

Reviewed-by: David Gow <davidgow@google.com>

Cheers,
-- David


>
> Changes from v2 -> v3:
> - No changes.
>
> Changes from v1 -> v2:
> - Add KTAP header.
> - Ensure test result number is 1.
>
>  lib/kunit/debugfs.c | 14 ++++++++++++--
>  lib/kunit/test.c    | 21 ++++++++++++++-------
>  2 files changed, 26 insertions(+), 9 deletions(-)
>
> diff --git a/lib/kunit/debugfs.c b/lib/kunit/debugfs.c
> index de0ee2e03ed6..b08bb1fba106 100644
> --- a/lib/kunit/debugfs.c
> +++ b/lib/kunit/debugfs.c
> @@ -55,14 +55,24 @@ static int debugfs_print_results(struct seq_file *seq, void *v)
>         enum kunit_status success = kunit_suite_has_succeeded(suite);
>         struct kunit_case *test_case;
>
> -       if (!suite || !suite->log)
> +       if (!suite)
>                 return 0;
>
> -       seq_printf(seq, "%s", suite->log);
> +       /* Print KTAP header so the debugfs log can be parsed as valid KTAP. */
> +       seq_puts(seq, "KTAP version 1\n");
> +       seq_puts(seq, "1..1\n");
> +
> +       /* Print suite header because it is not stored in the test logs. */
> +       seq_puts(seq, KUNIT_SUBTEST_INDENT "KTAP version 1\n");
> +       seq_printf(seq, KUNIT_SUBTEST_INDENT "# Subtest: %s\n", suite->name);
> +       seq_printf(seq, KUNIT_SUBTEST_INDENT "1..%zd\n", kunit_suite_num_test_cases(suite));
>
>         kunit_suite_for_each_test_case(suite, test_case)
>                 debugfs_print_result(seq, suite, test_case);
>
> +       if (suite->log)
> +               seq_printf(seq, "%s", suite->log);
> +
>         seq_printf(seq, "%s %d %s\n",
>                    kunit_status_to_ok_not_ok(success), 1, suite->name);
>         return 0;
> diff --git a/lib/kunit/test.c b/lib/kunit/test.c
> index c4d6304edd61..811fcc376d2f 100644
> --- a/lib/kunit/test.c
> +++ b/lib/kunit/test.c
> @@ -152,10 +152,18 @@ EXPORT_SYMBOL_GPL(kunit_suite_num_test_cases);
>
>  static void kunit_print_suite_start(struct kunit_suite *suite)
>  {
> -       kunit_log(KERN_INFO, suite, KUNIT_SUBTEST_INDENT "KTAP version 1\n");
> -       kunit_log(KERN_INFO, suite, KUNIT_SUBTEST_INDENT "# Subtest: %s",
> +       /*
> +        * We do not log the test suite header as doing so would
> +        * mean debugfs display would consist of the test suite
> +        * header prior to individual test results.
> +        * Hence directly printk the suite status, and we will
> +        * separately seq_printf() the suite header for the debugfs
> +        * representation.
> +        */
> +       pr_info(KUNIT_SUBTEST_INDENT "KTAP version 1\n");
> +       pr_info(KUNIT_SUBTEST_INDENT "# Subtest: %s\n",
>                   suite->name);
> -       kunit_log(KERN_INFO, suite, KUNIT_SUBTEST_INDENT "1..%zd",
> +       pr_info(KUNIT_SUBTEST_INDENT "1..%zd\n",
>                   kunit_suite_num_test_cases(suite));
>  }
>
> @@ -172,10 +180,9 @@ static void kunit_print_ok_not_ok(void *test_or_suite,
>
>         /*
>          * We do not log the test suite results as doing so would
> -        * mean debugfs display would consist of the test suite
> -        * description and status prior to individual test results.
> -        * Hence directly printk the suite status, and we will
> -        * separately seq_printf() the suite status for the debugfs
> +        * mean debugfs display would consist of an incorrect test
> +        * number. Hence directly printk the suite result, and we will
> +        * separately seq_printf() the suite results for the debugfs
>          * representation.
>          */
>         if (suite)
> --
> 2.40.0.rc0.216.gc4246ad0f0-goog
>

[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4003 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v3 3/3] kunit: fix bug of extra newline characters in debugfs logs
  2023-03-07 22:39 ` [PATCH v3 3/3] kunit: fix bug of extra newline characters " Rae Moar
@ 2023-03-08  5:05   ` David Gow
  0 siblings, 0 replies; 6+ messages in thread
From: David Gow @ 2023-03-08  5:05 UTC (permalink / raw)
  To: Rae Moar
  Cc: brendanhiggins, dlatypov, skhan, kunit-dev, linux-kernel,
	linux-kselftest

[-- Attachment #1: Type: text/plain, Size: 5744 bytes --]

On Wed, 8 Mar 2023 at 06:39, Rae Moar <rmoar@google.com> wrote:
>
> Fix bug of the extra newline characters in debugfs logs. When a
> line is added to debugfs with a newline character at the end,
> an extra line appears in the debugfs log.
>
> This is due to a discrepancy between how the lines are printed and how they
> are added to the logs. Remove this discrepancy by checking if a newline
> character is present before adding a newline character. This should closely
> match the printk behavior.
>
> Add kunit_log_newline_test to provide test coverage for this issue.  (Also,
> move kunit_log_test above suite definition to remove the unnecessary
> declaration prior to the suite definition)
>
> As an example, say we add these two lines to the log:
>
> kunit_log(..., "KTAP version 1\n");
> kunit_log(..., "1..1");
>
> The debugfs log before this fix:
>
>  KTAP version 1
>
>  1..1
>
> The debugfs log after this fix:
>
>  KTAP version 1
>  1..1
>
> Signed-off-by: Rae Moar <rmoar@google.com>
> ---

Thanks, this is looking good to me! One very minor formatting issue
below, otherwise:

Reviewed-by: David Gow <davidgow@google.com>

Cheers,
-- David


>
> Changes from v2 -> v3:
> - Changes to commit message.
>
> Changes from v1 -> v2:
> - Changed the way extra newlines are removed. Instead of removing extra
>   newline characters, add a newline if one is not present. This is a bit
>   cleaner.
> - Note: I looked into using KERN_CONT to match the printk behavior
>   to vsnprintf but this could cause issues with KTAP printing on the same
>   line as interrupting kernel messages. I also looked at just adding
>   KERN_CONT functionality to kunit_log and I did get this to work but it
>   was a bit messy because it required a few calls to kunit_log_newline in
>   kunit_run_tests. If this is very desired functionality, happy to add this
>   to version 3.
>
>  include/kunit/test.h   |  2 +-
>  lib/kunit/kunit-test.c | 35 +++++++++++++++++++++++------------
>  lib/kunit/test.c       | 18 ++++++++++++++++++
>  3 files changed, 42 insertions(+), 13 deletions(-)
>
> diff --git a/include/kunit/test.h b/include/kunit/test.h
> index 0668d29f3453..bd9dbae5e48d 100644
> --- a/include/kunit/test.h
> +++ b/include/kunit/test.h
> @@ -420,7 +420,7 @@ void __printf(2, 3) kunit_log_append(char *log, const char *fmt, ...);
>  #define kunit_log(lvl, test_or_suite, fmt, ...)                                \
>         do {                                                            \
>                 printk(lvl fmt, ##__VA_ARGS__);                         \
> -               kunit_log_append((test_or_suite)->log,  fmt "\n",       \
> +               kunit_log_append((test_or_suite)->log,  fmt,    \

Nit: the trailing '\' here is misaligned.


>                                  ##__VA_ARGS__);                        \
>         } while (0)
>
> diff --git a/lib/kunit/kunit-test.c b/lib/kunit/kunit-test.c
> index 4df0335d0d06..b63595d3e241 100644
> --- a/lib/kunit/kunit-test.c
> +++ b/lib/kunit/kunit-test.c
> @@ -443,18 +443,6 @@ static struct kunit_suite kunit_resource_test_suite = {
>         .test_cases = kunit_resource_test_cases,
>  };
>
> -static void kunit_log_test(struct kunit *test);
> -
> -static struct kunit_case kunit_log_test_cases[] = {
> -       KUNIT_CASE(kunit_log_test),
> -       {}
> -};
> -
> -static struct kunit_suite kunit_log_test_suite = {
> -       .name = "kunit-log-test",
> -       .test_cases = kunit_log_test_cases,
> -};
> -
>  static void kunit_log_test(struct kunit *test)
>  {
>         struct kunit_suite suite;
> @@ -481,6 +469,29 @@ static void kunit_log_test(struct kunit *test)
>  #endif
>  }
>
> +static void kunit_log_newline_test(struct kunit *test)
> +{
> +       kunit_info(test, "Add newline\n");
> +       if (test->log) {
> +               KUNIT_ASSERT_NOT_NULL_MSG(test, strstr(test->log, "Add newline\n"),
> +                       "Missing log line, full log:\n%s", test->log);
> +               KUNIT_EXPECT_NULL(test, strstr(test->log, "Add newline\n\n"));
> +       } else {
> +               kunit_skip(test, "only useful when debugfs is enabled");
> +       }
> +}
> +
> +static struct kunit_case kunit_log_test_cases[] = {
> +       KUNIT_CASE(kunit_log_test),
> +       KUNIT_CASE(kunit_log_newline_test),
> +       {}
> +};
> +
> +static struct kunit_suite kunit_log_test_suite = {
> +       .name = "kunit-log-test",
> +       .test_cases = kunit_log_test_cases,
> +};
> +
>  static void kunit_status_set_failure_test(struct kunit *test)
>  {
>         struct kunit fake;
> diff --git a/lib/kunit/test.c b/lib/kunit/test.c
> index 811fcc376d2f..e2910b261112 100644
> --- a/lib/kunit/test.c
> +++ b/lib/kunit/test.c
> @@ -108,6 +108,22 @@ static void kunit_print_test_stats(struct kunit *test,
>                   stats.total);
>  }
>
> +/**
> + * kunit_log_newline() - Add newline to the end of log if one is not
> + * already present.
> + * @log: The log to add the newline to.
> + */
> +static void kunit_log_newline(char *log)
> +{
> +       int log_len, len_left;
> +
> +       log_len = strlen(log);
> +       len_left = KUNIT_LOG_SIZE - log_len - 1;
> +
> +       if (log_len > 0 && log[log_len - 1] != '\n')
> +               strncat(log, "\n", len_left);
> +}
> +
>  /*
>   * Append formatted message to log, size of which is limited to
>   * KUNIT_LOG_SIZE bytes (including null terminating byte).
> @@ -135,6 +151,8 @@ void kunit_log_append(char *log, const char *fmt, ...)
>         vsnprintf(log + log_len, min(len, len_left), fmt, args);
>         va_end(args);
>
> +       /* Add newline to end of log if not already present. */
> +       kunit_log_newline(log);
>  }
>  EXPORT_SYMBOL_GPL(kunit_log_append);
>
> --
> 2.40.0.rc0.216.gc4246ad0f0-goog
>

[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4003 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2023-03-08  5:05 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-07 22:39 [PATCH v3 1/3] kunit: fix bug in debugfs logs of parameterized tests Rae Moar
2023-03-07 22:39 ` [PATCH v3 2/3] kunit: fix bug in the order of lines in debugfs logs Rae Moar
2023-03-08  5:04   ` David Gow
2023-03-07 22:39 ` [PATCH v3 3/3] kunit: fix bug of extra newline characters " Rae Moar
2023-03-08  5:05   ` David Gow
2023-03-08  5:04 ` [PATCH v3 1/3] kunit: fix bug in debugfs logs of parameterized tests David Gow

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).