tests: add test cases for label-relative path references

Newly added &{label/path} feature doesn't yet have any tests. Add some.

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
This commit is contained in:
Ahmad Fatoum 2020-10-25 10:41:41 +01:00 committed by David Gibson
parent ec7986e682
commit 26c54f840d
7 changed files with 112 additions and 2 deletions

1
tests/.gitignore vendored
View file

@ -54,6 +54,7 @@ tmp.*
/property_iterate
/propname_escapes
/references
/relref_merge
/root_node
/rw_tree1
/rw_oom

View file

@ -18,7 +18,7 @@ LIB_TESTS_L = get_mem_rsv \
open_pack rw_tree1 rw_oom set_name setprop del_property del_node \
appendprop1 appendprop2 propname_escapes \
string_escapes references path-references phandle_format \
boot-cpuid incbin \
boot-cpuid incbin relref_merge \
extra-terminating-null \
dtbs_equal_ordered \
dtb_reverse dtbs_equal_unordered \

View file

@ -53,7 +53,7 @@ int main(int argc, char *argv[])
void *fdt;
const char *p;
int len, multilen;
int n1, n2, n3, n4;
int n1, n2, n3, n4, n5;
test_init(argc, argv);
fdt = load_blob_arg(argc, argv);
@ -89,6 +89,12 @@ int main(int argc, char *argv[])
check_ref(fdt, n3, "/foobar/baz");
check_ref(fdt, n4, "/foo/baz");
n5 = fdt_path_offset(fdt, "/bar/baz");
if (n5 < 0)
FAIL("fdt_path_offset(/bar/baz): %s", fdt_strerror(n5));
check_ref(fdt, n5, "/bar/baz");
check_rref(fdt);
PASS();

View file

@ -25,4 +25,13 @@
lref = &n3;
};
};
n5: bar {
baz {
};
};
};
n6: &{n5/baz} {
ref = &{n6/};
lref = &{n5/baz};
};

51
tests/relref_merge.c Normal file
View file

@ -0,0 +1,51 @@
// SPDX-License-Identifier: LGPL-2.1-or-later
/*
* libfdt - Flat Device Tree manipulation
* Testcase for label relative child references in dtc
* Copyright (C) 2006 David Gibson, IBM Corporation.
* Copyright (C) 2020 Ahmad Fatoum, Pengutronix.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <libfdt.h>
#include "tests.h"
#include "testdata.h"
static void check_exist(void *fdt, const char *path)
{
int sn = fdt_path_offset(fdt, path);
if (sn < 0)
FAIL("%s expected but not found: %s", path, fdt_strerror(sn));
}
static void check_doesnt_exist(void *fdt, const char *path)
{
int sn = fdt_path_offset(fdt, path);
if (sn >= 0)
FAIL("%s found but not expected %d", path, sn);
}
int main(int argc, char *argv[])
{
void *fdt;
test_init(argc, argv);
fdt = load_blob_arg(argc, argv);
check_exist(fdt, "/node/subnode1");
check_exist(fdt, "/node/keep-me");
check_doesnt_exist(fdt, "/node/remove-me");
check_doesnt_exist(fdt, "/node2");
check_doesnt_exist(fdt, "/node/subnode3");
check_exist(fdt, "/node/subnode4");
check_exist(fdt, "/node/subnode1/add-me");
PASS();
}

40
tests/relref_merge.dts Normal file
View file

@ -0,0 +1,40 @@
/dts-v1/;
/ {
node_label: node {
keep-me {};
remove-me {};
subnode1 {
property-inline1;
property-inline2;
property-inline3;
};
subnode2 {
property-inline1;
};
subnode3 {
property-inline1;
};
};
node2_label: node2 {
property-inline1;
};
};
/omit-if-no-ref/ &{node_label/subnode1};
/omit-if-no-ref/ &node2_label;
/delete-node/ &{node_label/subnode3};
&{node_label/} {
/delete-node/ remove-me;
subnode4 { };
};
label: &{node_label/subnode1} {
selfref = &{node_label/subnode1};
add-me { };
};

View file

@ -669,6 +669,9 @@ dtc_tests () {
tree1_tests dtc_tree1_merge_path.test.dtb test_tree1.dtb
run_wrap_error_test $DTC -I dts -O dtb -o /dev/null "$SRCDIR/test_label_ref.dts"
run_dtc_test -I dts -O dtb -o dtc_relref_merge.test.dtb "$SRCDIR/relref_merge.dts"
run_test relref_merge dtc_relref_merge.test.dtb
# Check prop/node delete functionality
run_dtc_test -I dts -O dtb -o dtc_tree1_delete.test.dtb "$SRCDIR/test_tree1_delete.dts"
tree1_tests dtc_tree1_delete.test.dtb