On Wed, Aug 26, 2026 at 10:31:44AM +0200, Herve Codina wrote: > wip_func is a test utility allowing to wrap the write inplace functions. > > It allows to create tests with custom wip write sequence. > > Also the modified dtb is saved allowing to perform later checks on this > modified dtb. It's not clear to me what this is useful for that's not already covered by the existing write-in-place tests (nop_node.c, nop_property.c and setprop_inplace.c). > > Signed-off-by: Herve Codina > --- > tests/Makefile.tests | 3 +- > tests/meson.build | 1 + > tests/wip_func.c | 127 +++++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 130 insertions(+), 1 deletion(-) > create mode 100644 tests/wip_func.c > > diff --git a/tests/Makefile.tests b/tests/Makefile.tests > index 0d4d399f..a71c4cbf 100644 > --- a/tests/Makefile.tests > +++ b/tests/Makefile.tests > @@ -31,7 +31,8 @@ LIB_TESTS_L = get_mem_rsv \ > check_path check_header check_full \ > fs_tree1 \ > truncated_property truncated_string \ > - truncated_memrsv unterminated_memrsv > + truncated_memrsv unterminated_memrsv \ > + wip_func > LIB_TESTS = $(LIB_TESTS_L:%=$(TESTS_PREFIX)%) > > ifneq ($(STATIC_BUILD),1) > diff --git a/tests/meson.build b/tests/meson.build > index dae6a941..e7a88936 100644 > --- a/tests/meson.build > +++ b/tests/meson.build > @@ -96,6 +96,7 @@ tests = [ > 'truncated_string', > 'unterminated_memrsv', > 'utilfdt_test', > + 'wip_func', > ] > > test_deps = [testutil_dep, util_dep, libfdt_dep] > diff --git a/tests/wip_func.c b/tests/wip_func.c > new file mode 100644 > index 00000000..3becc4f1 > --- /dev/null > +++ b/tests/wip_func.c > @@ -0,0 +1,127 @@ > +// SPDX-License-Identifier: LGPL-2.1-or-later > +/* > + * libfdt - Flat Device Tree manipulation > + * Wrapper wip functions family > + * Copyright (C) 2026 Herve Codina, Bootlin. > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > + > +#include "tests.h" > + > +struct args { > + char *dtb_path; > + enum { > + NOP_NODE, > + NOP_PROP, > + SET_PROP, > + } op; > + char *node_path; > + char *prop_name; > + int index; > + char *value; > +}; > + > +const char *usage_txt = "Usage:\n" > + " - wip_func nop_node \n" > + " - wip_func nop_prop \n" > + " - wip_func set_prop \n" > + ; > + > +static void parse_args(struct args *args, int argc, char *argv[]) > +{ > + char *endptr; > + > + memset(args, 0, sizeof(*args)); > + > + if (argc < 3) > + goto fail; > + > + args->dtb_path = argv[1]; > + > + if (!strcmp(argv[2], "nop_node")) { > + args->op = NOP_NODE; > + if (argc != 4) > + goto fail; > + args->node_path = argv[3]; > + } else if (!strcmp(argv[2], "nop_prop")) { > + args->op = NOP_PROP; > + if (argc != 5) > + goto fail; > + args->node_path = argv[3]; > + args->prop_name = argv[4]; > + } else if (!strcmp(argv[2], "set_prop")) { > + args->op = SET_PROP; > + if (argc != 7) > + goto fail; > + args->node_path = argv[3]; > + args->prop_name = argv[4]; > + errno = 0; > + args->index = strtol(argv[5], &endptr, 0); > + if (*endptr != '\0' || errno) > + goto fail; > + args->value = argv[6]; > + } else { > + goto fail; > + } > + > + return; > + > +fail: > + CONFIG("%s\n", usage_txt); > +} > + > +int main(int argc, char *argv[]) > +{ > + struct args args; > + void *fdt; > + int node; > + int err; > + > + test_init(argc, argv); > + > + parse_args(&args, argc, argv); > + > + fdt = load_blob(args.dtb_path); > + > + node = fdt_path_offset(fdt, args.node_path); > + if (node < 0) > + FAIL("Fail to get '%s': %s", args.node_path, fdt_strerror(node)); > + > + switch (args.op) { > + case NOP_NODE: > + err = fdt_nop_node(fdt, node); > + if (err) > + FAIL("fdt_nop_node('%s'): %s", args.node_path, fdt_strerror(err)); > + break; > + > + case NOP_PROP: > + err = fdt_nop_property(fdt, node, args.prop_name); > + if (err) > + FAIL("fdt_nop_node('%s', '%s'): %s", args.node_path, > + args.prop_name, fdt_strerror(err)); > + break; > + > + case SET_PROP: > + err = fdt_setprop_inplace_namelen_partial(fdt, node, > + args.prop_name, strlen(args.prop_name), args.index, > + args.value, strlen(args.value) + 1); > + if (err) > + FAIL("fdt_setprop_inplace_namelen_partial('%s', '%s', %d, \"%s\"): %s", > + args.node_path, args.prop_name, args.index, > + args.value, fdt_strerror(err)); > + break; > + } > + > + save_blob(args.dtb_path, fdt); > + > + PASS(); > +} > -- > 2.55.0 > > -- David Gibson (he or they) | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you, not the other way | around. http://www.ozlabs.org/~dgibson