summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMark Brown <broonie@kernel.org>2026-07-23 15:41:00 +0100
committerMark Brown <broonie@kernel.org>2026-07-23 15:41:00 +0100
commit5c62140ed65d5d53d009f3ea6fbc426e82a6ad1a (patch)
tree08b5bbf19351abfc53c1015a915e5a4dfea026a0 /lib
parenta0b8e480a45f69917c3bea4750e4bc7a1789675e (diff)
parent34b5c0132952c3d176bf5a169c8f7093ecb8c4e8 (diff)
downloadlinux-next-5c62140ed65d5d53d009f3ea6fbc426e82a6ad1a.tar.gz
linux-next-5c62140ed65d5d53d009f3ea6fbc426e82a6ad1a.zip
Merge branch 'kunit' of https://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git
Diffstat (limited to 'lib')
-rw-r--r--lib/kunit/debugfs.c30
-rw-r--r--lib/kunit/kunit-example-test.c29
-rw-r--r--lib/kunit/string-stream.c9
-rw-r--r--lib/kunit/test.c17
4 files changed, 73 insertions, 12 deletions
diff --git a/lib/kunit/debugfs.c b/lib/kunit/debugfs.c
index 9c326f1837bd..442b2ceb955b 100644
--- a/lib/kunit/debugfs.c
+++ b/lib/kunit/debugfs.c
@@ -76,18 +76,30 @@ static int debugfs_print_results(struct seq_file *seq, void *v)
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, test_case->log);
+ if (suite->status != KUNIT_SKIPPED) {
+ /* 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, test_case->log);
+ }
debugfs_print_result(seq, suite->log);
- seq_printf(seq, "%s %d %s\n",
- kunit_status_to_ok_not_ok(success), 1, suite->name);
+ if (suite->status != KUNIT_SKIPPED)
+ seq_printf(seq, "%s %d %s\n",
+ kunit_status_to_ok_not_ok(success), 1, suite->name);
+ else
+ seq_printf(seq, "%s %d %s # SKIP %s\n",
+ kunit_status_to_ok_not_ok(success), 1, suite->name,
+ suite->status_comment);
return 0;
}
diff --git a/lib/kunit/kunit-example-test.c b/lib/kunit/kunit-example-test.c
index 0bae7b7ca0b0..b8ded54fa46d 100644
--- a/lib/kunit/kunit-example-test.c
+++ b/lib/kunit/kunit-example-test.c
@@ -591,5 +591,34 @@ static struct kunit_suite example_init_test_suite = {
*/
kunit_test_init_section_suites(&example_init_test_suite);
+/*
+ * This test should always be skipped.
+ */
+static void example_skip_suite_test(struct kunit *test)
+{
+ /* This line should never be seen */
+ KUNIT_FAIL(test, "You should not see a this.");
+}
+
+static struct kunit_case example_skip_suite_test_cases[] = {
+ KUNIT_CASE(example_skip_suite_test),
+ {}
+};
+
+static int example_skip_suite_init(struct kunit_suite *suite)
+{
+ kunit_mark_skipped(suite, "Test suite expected to be skipped");
+ return 0;
+}
+
+static struct kunit_suite example_test_skip_suite = {
+ .name = "example_skip_suite",
+ .suite_init = example_skip_suite_init,
+ .test_cases = example_skip_suite_test_cases,
+};
+
+/* This registers a test suite that will be skipped */
+kunit_test_suite(example_test_skip_suite);
+
MODULE_DESCRIPTION("Example KUnit test suite");
MODULE_LICENSE("GPL v2");
diff --git a/lib/kunit/string-stream.c b/lib/kunit/string-stream.c
index 0d8f1b30559b..51ba40ebf19f 100644
--- a/lib/kunit/string-stream.c
+++ b/lib/kunit/string-stream.c
@@ -9,6 +9,7 @@
#include <kunit/static_stub.h>
#include <kunit/test.h>
#include <linux/list.h>
+#include <linux/seq_buf.h>
#include <linux/slab.h>
#include "string-stream.h"
@@ -74,7 +75,8 @@ int string_stream_vadd(struct string_stream *stream,
/* Append newline if necessary. */
if (frag_container->fragment[result_len - 1] != '\n')
- result_len = strlcat(frag_container->fragment, "\n", buf_len);
+ result_len += strscpy(frag_container->fragment + result_len,
+ "\n", buf_len - result_len);
} else {
result_len = vsnprintf(frag_container->fragment, buf_len, fmt, args);
}
@@ -118,15 +120,18 @@ char *string_stream_get_string(struct string_stream *stream)
{
struct string_stream_fragment *frag_container;
size_t buf_len = stream->length + 1; /* +1 for null byte. */
+ struct seq_buf sb;
char *buf;
buf = kzalloc(buf_len, stream->gfp);
if (!buf)
return NULL;
+ seq_buf_init(&sb, buf, buf_len);
+
spin_lock(&stream->lock);
list_for_each_entry(frag_container, &stream->fragments, node)
- strlcat(buf, frag_container->fragment, buf_len);
+ seq_buf_puts(&sb, frag_container->fragment);
spin_unlock(&stream->lock);
return buf;
diff --git a/lib/kunit/test.c b/lib/kunit/test.c
index 99773e000e1b..09e3dabfac0c 100644
--- a/lib/kunit/test.c
+++ b/lib/kunit/test.c
@@ -214,12 +214,18 @@ enum kunit_status kunit_suite_has_succeeded(struct kunit_suite *suite)
const struct kunit_case *test_case;
enum kunit_status status = KUNIT_SKIPPED;
+ if (suite->status == KUNIT_SKIPPED)
+ return KUNIT_SKIPPED;
+
if (suite->suite_init_err)
return KUNIT_FAILURE;
kunit_suite_for_each_test_case(suite, test_case) {
- if (test_case->status == KUNIT_FAILURE)
+ if (test_case->status == KUNIT_FAILURE) {
+ /* Update the kunit_suite status also */
+ suite->status = KUNIT_FAILURE;
return KUNIT_FAILURE;
+ }
else if (test_case->status == KUNIT_SUCCESS)
status = KUNIT_SUCCESS;
}
@@ -795,12 +801,20 @@ int kunit_run_tests(struct kunit_suite *suite)
/* Taint the kernel so we know we've run tests. */
add_taint(TAINT_TEST, LOCKDEP_STILL_OK);
+ if (suite->status == KUNIT_SKIPPED)
+ goto suite_end;
+
if (suite->suite_init) {
suite->suite_init_err = suite->suite_init(suite);
if (suite->suite_init_err) {
+ suite->status = KUNIT_FAILURE;
kunit_err(suite, KUNIT_SUBTEST_INDENT
"# failed to initialize (%d)", suite->suite_init_err);
goto suite_end;
+
+ } else if (suite->status == KUNIT_SKIPPED) {
+ /* Skip this kunit suite */
+ goto suite_end;
}
}
@@ -825,6 +839,7 @@ static void kunit_init_suite(struct kunit_suite *suite)
kunit_debugfs_create_suite(suite);
suite->status_comment[0] = '\0';
suite->suite_init_err = 0;
+ suite->status = KUNIT_SUCCESS;
if (suite->log)
string_stream_clear(suite->log);