]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
of: Add a KUnit test for overlays and test managed APIs
authorStephen Boyd <sboyd@kernel.org>
Thu, 18 Jul 2024 21:05:03 +0000 (14:05 -0700)
committerStephen Boyd <sboyd@kernel.org>
Mon, 29 Jul 2024 22:33:12 +0000 (15:33 -0700)
Test the KUnit test managed overlay APIs. Confirm that platform devices
are created and destroyed properly. This provides us confidence that the
test managed APIs work correctly and can be relied upon to provide tests
with fake platform devices and device nodes via overlays compiled into
the kernel image.

Cc: Rob Herring <robh@kernel.org>
Cc: Saravana Kannan <saravanak@google.com>
Cc: Daniel Latypov <dlatypov@google.com>
Cc: Brendan Higgins <brendan.higgins@linux.dev>
Reviewed-by: David Gow <davidgow@google.com>
Cc: Rae Moar <rmoar@google.com>
Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
Link: https://lore.kernel.org/r/20240718210513.3801024-5-sboyd@kernel.org
drivers/of/.kunitconfig
drivers/of/Kconfig
drivers/of/Makefile
drivers/of/kunit_overlay_test.dtso [new file with mode: 0644]
drivers/of/overlay_test.c [new file with mode: 0644]

index 5a8fee11978c4a1ad991e18ebef965b00316fc3a..4c53d2c7a2757e1f706ae2358af0d515af5c3224 100644 (file)
@@ -1,3 +1,4 @@
 CONFIG_KUNIT=y
 CONFIG_OF=y
 CONFIG_OF_KUNIT_TEST=y
+CONFIG_OF_OVERLAY_KUNIT_TEST=y
index dd726c7056bf1325d05e6ed137be90e481a6c04c..0e2d608c3e207d11adddc6e304f23a3aff7bba37 100644 (file)
@@ -107,6 +107,16 @@ config OF_OVERLAY
          While this option is selected automatically when needed, you can
          enable it manually to improve device tree unit test coverage.
 
+config OF_OVERLAY_KUNIT_TEST
+       tristate "Device Tree overlay KUnit tests" if !KUNIT_ALL_TESTS
+       depends on KUNIT
+       default KUNIT_ALL_TESTS
+       select OF_OVERLAY
+       help
+         This option builds KUnit unit tests for the device tree overlay code.
+
+         If unsure, say N here, but this option is safe to enable.
+
 config OF_NUMA
        bool
 
index 2ae909adde490bf54f3f9e93a42c20f0e52b29a4..379a0afcbdc0bf0c088728d90834572453742626 100644 (file)
@@ -21,5 +21,7 @@ endif
 
 obj-$(CONFIG_KUNIT) += of_kunit_helpers.o
 obj-$(CONFIG_OF_KUNIT_TEST) += of_test.o
+obj-$(CONFIG_OF_OVERLAY_KUNIT_TEST) += overlay-test.o
+overlay-test-y := overlay_test.o kunit_overlay_test.dtbo.o
 
 obj-$(CONFIG_OF_UNITTEST) += unittest-data/
diff --git a/drivers/of/kunit_overlay_test.dtso b/drivers/of/kunit_overlay_test.dtso
new file mode 100644 (file)
index 0000000..85f20b4
--- /dev/null
@@ -0,0 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
+/dts-v1/;
+/plugin/;
+
+&{/} {
+       kunit-test {
+               compatible = "test,empty";
+       };
+};
diff --git a/drivers/of/overlay_test.c b/drivers/of/overlay_test.c
new file mode 100644 (file)
index 0000000..19a292c
--- /dev/null
@@ -0,0 +1,115 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * KUnit tests for device tree overlays
+ */
+#include <linux/device/bus.h>
+#include <linux/kconfig.h>
+#include <linux/of.h>
+#include <linux/of_platform.h>
+#include <linux/platform_device.h>
+
+#include <kunit/of.h>
+#include <kunit/test.h>
+
+static const char * const kunit_node_name = "kunit-test";
+static const char * const kunit_compatible = "test,empty";
+
+/* Test that of_overlay_apply_kunit() adds a node to the live tree */
+static void of_overlay_apply_kunit_apply(struct kunit *test)
+{
+       struct device_node *np;
+
+       KUNIT_ASSERT_EQ(test, 0,
+                       of_overlay_apply_kunit(test, kunit_overlay_test));
+
+       np = of_find_node_by_name(NULL, kunit_node_name);
+       KUNIT_EXPECT_NOT_ERR_OR_NULL(test, np);
+       of_node_put(np);
+}
+
+/*
+ * Test that of_overlay_apply_kunit() creates platform devices with the
+ * expected device_node
+ */
+static void of_overlay_apply_kunit_platform_device(struct kunit *test)
+{
+       struct platform_device *pdev;
+       struct device_node *np;
+
+       KUNIT_ASSERT_EQ(test, 0,
+                       of_overlay_apply_kunit(test, kunit_overlay_test));
+
+       np = of_find_node_by_name(NULL, kunit_node_name);
+       of_node_put_kunit(test, np);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np);
+
+       pdev = of_find_device_by_node(np);
+       KUNIT_EXPECT_NOT_ERR_OR_NULL(test, pdev);
+       if (pdev)
+               put_device(&pdev->dev);
+}
+
+static int of_overlay_bus_match_compatible(struct device *dev, const void *data)
+{
+       return of_device_is_compatible(dev->of_node, data);
+}
+
+/* Test that of_overlay_apply_kunit() cleans up after the test is finished */
+static void of_overlay_apply_kunit_cleanup(struct kunit *test)
+{
+       struct kunit fake;
+       struct platform_device *pdev;
+       struct device *dev;
+       struct device_node *np;
+
+       if (!IS_ENABLED(CONFIG_OF_EARLY_FLATTREE))
+               kunit_skip(test, "requires CONFIG_OF_EARLY_FLATTREE for root node");
+
+       kunit_init_test(&fake, "fake test", NULL);
+       KUNIT_ASSERT_EQ(test, fake.status, KUNIT_SUCCESS);
+
+       KUNIT_ASSERT_EQ(test, 0,
+                       of_overlay_apply_kunit(&fake, kunit_overlay_test));
+
+       np = of_find_node_by_name(NULL, kunit_node_name);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np);
+       of_node_put_kunit(test, np);
+
+       pdev = of_find_device_by_node(np);
+       KUNIT_ASSERT_NOT_ERR_OR_NULL(test, pdev);
+       put_device(&pdev->dev); /* Not derefing 'pdev' after this */
+
+       /* Remove overlay */
+       kunit_cleanup(&fake);
+
+       /* The node and device should be removed */
+       np = of_find_node_by_name(NULL, kunit_node_name);
+       KUNIT_EXPECT_PTR_EQ(test, NULL, np);
+       of_node_put(np);
+
+       dev = bus_find_device(&platform_bus_type, NULL, kunit_compatible,
+                             of_overlay_bus_match_compatible);
+       KUNIT_EXPECT_PTR_EQ(test, NULL, dev);
+       put_device(dev);
+}
+
+static struct kunit_case of_overlay_apply_kunit_test_cases[] = {
+       KUNIT_CASE(of_overlay_apply_kunit_apply),
+       KUNIT_CASE(of_overlay_apply_kunit_platform_device),
+       KUNIT_CASE(of_overlay_apply_kunit_cleanup),
+       {}
+};
+
+/*
+ * Test suite for test managed device tree overlays.
+ */
+static struct kunit_suite of_overlay_apply_kunit_suite = {
+       .name = "of_overlay_apply_kunit",
+       .test_cases = of_overlay_apply_kunit_test_cases,
+};
+
+kunit_test_suites(
+       &of_overlay_apply_kunit_suite,
+);
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("KUnit tests for device tree overlays");