Commit 2c6a96da authored by Rae Moar's avatar Rae Moar Committed by Shuah Khan
Browse files

kunit: fix bug of extra newline characters in debugfs logs



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: default avatarRae Moar <rmoar@google.com>
Reviewed-by: default avatarDavid Gow <davidgow@google.com>
Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
parent f9a301c3
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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)

+23 −12
Original line number Diff line number Diff line
@@ -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;
+18 −0
Original line number Diff line number Diff line
@@ -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);