mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 20:54:03 +02:00
device property: add test cases for fwnode_for_each_child_node()
Add test cases for fwnode_for_each_child_node() API. Test command: $ ./tools/testing/kunit/kunit.py run property-entry Signed-off-by: Xu Yang <xu.yang_2@nxp.com> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Link: https://patch.msgid.link/20260721105448.2109894-3-xu.yang_2@oss.nxp.com Signed-off-by: Danilo Krummrich <dakr@kernel.org>
This commit is contained in:
parent
08bc149837
commit
0e6f8ccd46
|
|
@ -17,6 +17,7 @@ config DM_KUNIT_TEST
|
||||||
config DRIVER_PE_KUNIT_TEST
|
config DRIVER_PE_KUNIT_TEST
|
||||||
tristate "KUnit Tests for property entry API" if !KUNIT_ALL_TESTS
|
tristate "KUnit Tests for property entry API" if !KUNIT_ALL_TESTS
|
||||||
depends on KUNIT
|
depends on KUNIT
|
||||||
|
select OF
|
||||||
default KUNIT_ALL_TESTS
|
default KUNIT_ALL_TESTS
|
||||||
|
|
||||||
config DRIVER_SWNODE_KUNIT_TEST
|
config DRIVER_SWNODE_KUNIT_TEST
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@
|
||||||
// Copyright 2019 Google LLC.
|
// Copyright 2019 Google LLC.
|
||||||
|
|
||||||
#include <kunit/test.h>
|
#include <kunit/test.h>
|
||||||
|
|
||||||
|
#include <linux/of.h>
|
||||||
#include <linux/property.h>
|
#include <linux/property.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
|
@ -489,6 +491,139 @@ static void pe_test_reference(struct kunit *test)
|
||||||
software_node_unregister_node_group(group);
|
software_node_unregister_node_group(group);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct fwnode_handle *create_device_node(struct kunit *test,
|
||||||
|
const char *name,
|
||||||
|
const char *full_name,
|
||||||
|
struct device_node *parent)
|
||||||
|
{
|
||||||
|
struct device_node *node;
|
||||||
|
|
||||||
|
node = kunit_kzalloc(test, sizeof(*node), GFP_KERNEL);
|
||||||
|
KUNIT_ASSERT_NOT_ERR_OR_NULL(test, node);
|
||||||
|
|
||||||
|
node->name = kunit_kstrdup(test, name, GFP_KERNEL);
|
||||||
|
node->full_name = kunit_kstrdup(test, full_name, GFP_KERNEL);
|
||||||
|
|
||||||
|
if (parent) {
|
||||||
|
node->sibling = parent->child;
|
||||||
|
/* set the node as the first child of the parent */
|
||||||
|
parent->child = node;
|
||||||
|
node->parent = parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
of_node_init(node);
|
||||||
|
return of_fwnode_handle(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Verifies that fwnode_for_each_child_node() can output correct children */
|
||||||
|
static void pe_test_child_iteration(struct kunit *test)
|
||||||
|
{
|
||||||
|
struct fwnode_handle *of_node, *of_node1;
|
||||||
|
struct fwnode_handle *sw_node, *sw_node1;
|
||||||
|
struct fwnode_handle *child;
|
||||||
|
int error, i, num;
|
||||||
|
|
||||||
|
static const struct software_node node = { .name = "sw" };
|
||||||
|
static const struct software_node node1 = { .name = "sw-1", .parent = &node};
|
||||||
|
static const struct software_node node2 = { .name = "sw-2", .parent = &node};
|
||||||
|
static const struct software_node node3 = { .name = "sw-3", .parent = &node};
|
||||||
|
static const struct software_node *group[] = { &node, &node1, &node2, &node3, NULL };
|
||||||
|
|
||||||
|
static const char * const of_child_array[] = { "of-1", "of-2", "of-3" };
|
||||||
|
static const char * const sw_child_array[] = { "sw-1", "sw-2", "sw-3" };
|
||||||
|
static const char * const of_sw_child_array[] = { "of-1", "of-2", "of-3",
|
||||||
|
"sw-1", "sw-2", "sw-3" };
|
||||||
|
static const char * const sw_of_child_array[] = { "sw-1", "sw-2", "sw-3",
|
||||||
|
"of-1", "of-2", "of-3" };
|
||||||
|
|
||||||
|
/* 1. Test OF node child iteration */
|
||||||
|
|
||||||
|
of_node = create_device_node(test, "of", "of", NULL);
|
||||||
|
create_device_node(test, "of", "of-3", to_of_node(of_node));
|
||||||
|
create_device_node(test, "of", "of-2", to_of_node(of_node));
|
||||||
|
of_node1 = create_device_node(test, "of", "of-1", to_of_node(of_node));
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
num = ARRAY_SIZE(of_child_array);
|
||||||
|
fwnode_for_each_child_node(of_node, child) {
|
||||||
|
KUNIT_ASSERT_LT(test, i, num);
|
||||||
|
KUNIT_EXPECT_STREQ(test, of_child_array[i++], fwnode_get_name(child));
|
||||||
|
}
|
||||||
|
KUNIT_EXPECT_PTR_EQ(test, child, NULL);
|
||||||
|
|
||||||
|
/* 2. Test SW node child iteration */
|
||||||
|
|
||||||
|
error = software_node_register_node_group(group);
|
||||||
|
KUNIT_ASSERT_EQ(test, error, 0);
|
||||||
|
|
||||||
|
sw_node = software_node_fwnode(&node);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
num = ARRAY_SIZE(sw_child_array);
|
||||||
|
fwnode_for_each_child_node(sw_node, child) {
|
||||||
|
KUNIT_ASSERT_LT(test, i, num);
|
||||||
|
KUNIT_EXPECT_STREQ(test, sw_child_array[i++], fwnode_get_name(child));
|
||||||
|
}
|
||||||
|
KUNIT_EXPECT_PTR_EQ(test, child, NULL);
|
||||||
|
|
||||||
|
/* 3. Test OF (primary) + SW (secondary) node child iteration */
|
||||||
|
|
||||||
|
of_node->secondary = sw_node;
|
||||||
|
sw_node->secondary = ERR_PTR(-ENODEV);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
num = ARRAY_SIZE(of_sw_child_array);
|
||||||
|
fwnode_for_each_child_node(of_node, child) {
|
||||||
|
KUNIT_ASSERT_LT(test, i, num);
|
||||||
|
KUNIT_EXPECT_STREQ(test, of_sw_child_array[i++], fwnode_get_name(child));
|
||||||
|
}
|
||||||
|
KUNIT_EXPECT_PTR_EQ(test, child, NULL);
|
||||||
|
|
||||||
|
/* 4. Test SW (primary) + OF (secondary) node child iteration */
|
||||||
|
|
||||||
|
sw_node->secondary = of_node;
|
||||||
|
of_node->secondary = ERR_PTR(-ENODEV);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
num = ARRAY_SIZE(sw_of_child_array);
|
||||||
|
fwnode_for_each_child_node(sw_node, child) {
|
||||||
|
KUNIT_ASSERT_LT(test, i, num);
|
||||||
|
KUNIT_EXPECT_STREQ(test, sw_of_child_array[i++], fwnode_get_name(child));
|
||||||
|
}
|
||||||
|
KUNIT_EXPECT_PTR_EQ(test, child, NULL);
|
||||||
|
|
||||||
|
/* 5. Test OF (primary) + SW (secondary, but no children) node child iteration */
|
||||||
|
|
||||||
|
sw_node1 = software_node_fwnode(&node1);
|
||||||
|
of_node->secondary = sw_node1;
|
||||||
|
sw_node->secondary = ERR_PTR(-ENODEV);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
num = ARRAY_SIZE(of_child_array);
|
||||||
|
fwnode_for_each_child_node(of_node, child) {
|
||||||
|
KUNIT_ASSERT_LT(test, i, num);
|
||||||
|
KUNIT_EXPECT_STREQ(test, of_child_array[i++], fwnode_get_name(child));
|
||||||
|
}
|
||||||
|
KUNIT_EXPECT_PTR_EQ(test, child, NULL);
|
||||||
|
|
||||||
|
/* 6. Test SW (primary) + OF (secondary, but no children) node child iteration */
|
||||||
|
|
||||||
|
sw_node->secondary = of_node1;
|
||||||
|
of_node->secondary = ERR_PTR(-ENODEV);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
num = ARRAY_SIZE(sw_child_array);
|
||||||
|
fwnode_for_each_child_node(sw_node, child) {
|
||||||
|
KUNIT_ASSERT_LT(test, i, num);
|
||||||
|
KUNIT_EXPECT_STREQ(test, sw_child_array[i++], fwnode_get_name(child));
|
||||||
|
}
|
||||||
|
KUNIT_EXPECT_PTR_EQ(test, child, NULL);
|
||||||
|
|
||||||
|
of_node->secondary = NULL;
|
||||||
|
sw_node->secondary = NULL;
|
||||||
|
software_node_unregister_node_group(group);
|
||||||
|
}
|
||||||
|
|
||||||
static struct kunit_case property_entry_test_cases[] = {
|
static struct kunit_case property_entry_test_cases[] = {
|
||||||
KUNIT_CASE(pe_test_uints),
|
KUNIT_CASE(pe_test_uints),
|
||||||
KUNIT_CASE(pe_test_uint_arrays),
|
KUNIT_CASE(pe_test_uint_arrays),
|
||||||
|
|
@ -497,6 +632,7 @@ static struct kunit_case property_entry_test_cases[] = {
|
||||||
KUNIT_CASE(pe_test_move_inline_u8),
|
KUNIT_CASE(pe_test_move_inline_u8),
|
||||||
KUNIT_CASE(pe_test_move_inline_str),
|
KUNIT_CASE(pe_test_move_inline_str),
|
||||||
KUNIT_CASE(pe_test_reference),
|
KUNIT_CASE(pe_test_reference),
|
||||||
|
KUNIT_CASE(pe_test_child_iteration),
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -509,4 +645,5 @@ kunit_test_suite(property_entry_test_suite);
|
||||||
|
|
||||||
MODULE_DESCRIPTION("Test module for the property entry API");
|
MODULE_DESCRIPTION("Test module for the property entry API");
|
||||||
MODULE_AUTHOR("Dmitry Torokhov <dtor@chromium.org>");
|
MODULE_AUTHOR("Dmitry Torokhov <dtor@chromium.org>");
|
||||||
|
MODULE_IMPORT_NS("EXPORTED_FOR_KUNIT_TESTING");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user