Extend the example to show how to run a userspace executable.

Signed-off-by: Thomas Weißschuh <[email protected]>
Reviewed-by: David Gow <[email protected]>
---
 MAINTAINERS                    |  1 +
 lib/kunit/Makefile             | 10 ++++++++++
 lib/kunit/kunit-example-test.c | 15 +++++++++++++++
 lib/kunit/kunit-example-uapi.c | 22 ++++++++++++++++++++++
 4 files changed, 48 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index e29ca56f7334..b7358d89df70 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -14399,6 +14399,7 @@ KUNIT UAPI TESTING FRAMEWORK (in addition to KERNEL 
UNIT TESTING FRAMEWORK)
 M:     Thomas Weißschuh <[email protected]>
 S:     Maintained
 F:     include/kunit/uapi.h
+F:     lib/kunit/kunit-example-uapi.c
 F:     lib/kunit/kunit-uapi.c
 
 KVM PARAVIRT (KVM/paravirt)
diff --git a/lib/kunit/Makefile b/lib/kunit/Makefile
index 6059621a2d32..2434470e9985 100644
--- a/lib/kunit/Makefile
+++ b/lib/kunit/Makefile
@@ -1,3 +1,5 @@
+include $(srctree)/init/Makefile.nolibc
+
 obj-$(CONFIG_KUNIT) +=                 kunit.o
 
 kunit-objs +=                          test.o \
@@ -31,3 +33,11 @@ obj-$(CONFIG_KUNIT_TEST) +=          assert_test.o
 endif
 
 obj-$(CONFIG_KUNIT_EXAMPLE_TEST) +=    kunit-example-test.o
+
+userprogs +=                           kunit-example-uapi
+kunit-example-uapi-userccflags :=      -static $(NOLIBC_USERCFLAGS)
+
+ifdef CONFIG_KUNIT_UAPI
+CFLAGS_kunit-example-test.o :=         -Wa,-I$(obj)
+$(obj)/kunit-example-test.o: $(obj)/kunit-example-uapi
+endif
diff --git a/lib/kunit/kunit-example-test.c b/lib/kunit/kunit-example-test.c
index 0bae7b7ca0b0..febabc995405 100644
--- a/lib/kunit/kunit-example-test.c
+++ b/lib/kunit/kunit-example-test.c
@@ -8,6 +8,7 @@
 
 #include <kunit/test.h>
 #include <kunit/static_stub.h>
+#include <kunit/uapi.h>
 
 /*
  * This is the most fundamental element of KUnit, the test case. A test case
@@ -489,6 +490,19 @@ static void 
example_params_test_with_init_dynamic_arr(struct kunit *test)
        KUNIT_EXPECT_EQ(test, param_val - param_val, 0);
 }
 
+/*
+ * This test shows the usage of UAPI tests.
+ */
+static void example_uapi_test(struct kunit *test)
+{
+       KUNIT_UAPI_EMBED_BLOB(kunit_example_uapi, "kunit-example-uapi");
+
+       if (IS_ENABLED(CONFIG_KUNIT_UAPI))
+               kunit_uapi_run_kselftest(test, &kunit_example_uapi);
+       else
+               kunit_skip(test, "CONFIG_KUNIT_UAPI is not enabled");
+}
+
 /*
  * Here we make a list of all the test cases we want to add to the test suite
  * below.
@@ -514,6 +528,7 @@ static struct kunit_case example_test_cases[] = {
                                   kunit_array_gen_params, 
example_param_init_dynamic_arr,
                                   example_param_exit_dynamic_arr),
        KUNIT_CASE_SLOW(example_slow_test),
+       KUNIT_CASE(example_uapi_test),
        {}
 };
 
diff --git a/lib/kunit/kunit-example-uapi.c b/lib/kunit/kunit-example-uapi.c
new file mode 100644
index 000000000000..5875b0d680d4
--- /dev/null
+++ b/lib/kunit/kunit-example-uapi.c
@@ -0,0 +1,22 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * KUnit Userspace example test.
+ *
+ * Copyright (C) 2026, Linutronix GmbH.
+ * Author: Thomas Weißschuh <[email protected]>
+ *
+ * This is *userspace* code.
+ */
+
+#include "../../tools/testing/selftests/kselftest.h"
+
+int main(void)
+{
+       ksft_print_header();
+       ksft_set_plan(4);
+       ksft_test_result_pass("userspace test 1\n");
+       ksft_test_result_pass("userspace test 2\n");
+       ksft_test_result_skip("userspace test 3: some reason\n");
+       ksft_test_result_pass("userspace test 4\n");
+       ksft_finished();
+}

-- 
2.53.0


Reply via email to