[RFC v1 9/9] liveupdate: add KUnit test to verify alphabetical order of compatibility strings
Pasha Tatashin
pasha.tatashin at soleen.com
Thu Jun 4 20:32:35 PDT 2026
Introduce a KUnit test suite to verify that composite compatibility
strings are formatted correctly, specifically ensuring that all KHO
sub-component compatibility strings are unique and strictly sorted
in alphabetical order.
Maintaining alphabetical order in composite compatibility strings
is required to guarantee consistent, predictable, and reproducible
compatibility string representation across different system configurations.
The test suite validates:
- KHO_FDT_COMPATIBLE (the root composite compatibility string)
- LUO_ABI_COMPATIBLE (the LUO composite compatibility string)
- MEMFD_LUO_FH_COMPATIBLE (the memfd file handler composite compatibility string)
Signed-off-by: Pasha Tatashin <pasha.tatashin at soleen.com>
---
kernel/liveupdate/Kconfig | 15 ++++++
kernel/liveupdate/Makefile | 2 +
kernel/liveupdate/liveupdate_test.c | 56 +++++++++++++++++++++++
tools/testing/selftests/liveupdate/config | 1 +
4 files changed, 74 insertions(+)
create mode 100644 kernel/liveupdate/liveupdate_test.c
diff --git a/kernel/liveupdate/Kconfig b/kernel/liveupdate/Kconfig
index c13af38ba23a..617a31dcee73 100644
--- a/kernel/liveupdate/Kconfig
+++ b/kernel/liveupdate/Kconfig
@@ -86,4 +86,19 @@ config LIVEUPDATE_MEMFD
If unsure, say N.
+config LIVEUPDATE_KUNIT_TEST
+ tristate "KUnit tests for LUO and KHO" if !KUNIT_ALL_TESTS
+ depends on KUNIT
+ depends on LIVEUPDATE
+ default KUNIT_ALL_TESTS
+ help
+ Enable KUnit tests for LUO and KHO. These tests verify that the
+ composite KHO, LUO, and memfd compatibility strings remain unique
+ and sorted alphabetically.
+
+ For more information on KUnit and unit tests in general, please refer
+ to the KUnit documentation in Documentation/dev-tools/kunit/.
+
+ If unsure, say N.
+
endmenu
diff --git a/kernel/liveupdate/Makefile b/kernel/liveupdate/Makefile
index b481e21a311a..5e0deb85e1b1 100644
--- a/kernel/liveupdate/Makefile
+++ b/kernel/liveupdate/Makefile
@@ -17,3 +17,5 @@ obj-$(CONFIG_KEXEC_HANDOVER_DEBUG) += kexec_handover_debug.o
obj-$(CONFIG_KEXEC_HANDOVER_DEBUGFS) += kexec_handover_debugfs.o
obj-$(CONFIG_LIVEUPDATE) += luo.o
+obj-$(CONFIG_LIVEUPDATE_KUNIT_TEST) += liveupdate_test.o
+
diff --git a/kernel/liveupdate/liveupdate_test.c b/kernel/liveupdate/liveupdate_test.c
new file mode 100644
index 000000000000..15688d69735e
--- /dev/null
+++ b/kernel/liveupdate/liveupdate_test.c
@@ -0,0 +1,56 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * KUnit test for Live Update compatibility strings.
+ */
+#include <kunit/test.h>
+#include <linux/string.h>
+#include <linux/kho/abi/kexec_handover.h>
+#include <linux/kho/abi/luo.h>
+#include <linux/kho/abi/memfd.h>
+
+/* Verify that compatibility sub-components are unique and sorted alphabetically */
+static bool is_alphabetical_unique(const char *compat)
+{
+ char buf[1024];
+ char *string = buf;
+ char *token;
+ char *prev = NULL;
+ char *sub;
+
+ strscpy(buf, compat, sizeof(buf));
+
+ sub = strchr(string, ';');
+ if (!sub)
+ return true;
+
+ sub++;
+
+ while ((token = strsep(&sub, ";")) != NULL) {
+ if (prev && strcmp(prev, token) >= 0)
+ return false;
+ prev = token;
+ }
+
+ return true;
+}
+
+static void test_compatibility_alphabetical(struct kunit *test)
+{
+ KUNIT_EXPECT_TRUE(test, is_alphabetical_unique(KHO_FDT_COMPATIBLE));
+ KUNIT_EXPECT_TRUE(test, is_alphabetical_unique(LUO_ABI_COMPATIBLE));
+ KUNIT_EXPECT_TRUE(test, is_alphabetical_unique(MEMFD_LUO_FH_COMPATIBLE));
+}
+
+static struct kunit_case liveupdate_test_cases[] = {
+ KUNIT_CASE(test_compatibility_alphabetical),
+ {}
+};
+
+static struct kunit_suite liveupdate_test_suite = {
+ .name = "liveupdate-compatibility",
+ .test_cases = liveupdate_test_cases,
+};
+
+kunit_test_suite(liveupdate_test_suite);
+
+MODULE_LICENSE("GPL");
diff --git a/tools/testing/selftests/liveupdate/config b/tools/testing/selftests/liveupdate/config
index 91d03f9a6a39..28c54bb473b8 100644
--- a/tools/testing/selftests/liveupdate/config
+++ b/tools/testing/selftests/liveupdate/config
@@ -6,6 +6,7 @@ CONFIG_KEXEC_HANDOVER_DEBUGFS=y
CONFIG_KEXEC_HANDOVER_DEBUG=y
CONFIG_LIVEUPDATE=y
CONFIG_LIVEUPDATE_TEST=y
+CONFIG_LIVEUPDATE_KUNIT_TEST=y
CONFIG_MEMFD_CREATE=y
CONFIG_TMPFS=y
CONFIG_SHMEM=y
--
2.53.0
More information about the kexec
mailing list