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 
0f60501c6de570723123b24eb930d15f1bd956eb..b1405f0a0e638d1654d9dc9e51d784ddc838cf5b
 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -13544,6 +13544,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 
6059621a2d32c8e7384acda59793f05826af8c81..2434470e998525e5667ebc207d11659835b5e888
 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 
3056d6bc705d0a8f196f0f4412e679dbb0e03114..0c5e1e59f9358b84aee2621e342d824a2f99f9aa
 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
@@ -277,6 +278,19 @@ static void example_slow_test(struct kunit *test)
        KUNIT_EXPECT_EQ(test, 1 + 1, 2);
 }
 
+/*
+ * 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.
@@ -297,6 +311,7 @@ static struct kunit_case example_test_cases[] = {
        KUNIT_CASE(example_priv_test),
        KUNIT_CASE_PARAM(example_params_test, example_gen_params),
        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 
0000000000000000000000000000000000000000..4ce657050dd4a576632a41ca0309c4cb5134ce14
--- /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) 2025, 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.50.0


Reply via email to