diff --git a/checks.c b/checks.c index f0e7505..0a34109 100644 --- a/checks.c +++ b/checks.c @@ -101,7 +101,7 @@ static int check_phandles(struct node *root, struct node *node) for_each_child(node, child) ok = ok && check_phandles(root, child); - return 1; + return ok; } int check_structure(struct node *dt) diff --git a/dtc.c b/dtc.c index bbef829..602b296 100644 --- a/dtc.c +++ b/dtc.c @@ -197,7 +197,7 @@ int main(int argc, char *argv[]) if (!structure_ok) { if (!force) { fprintf(stderr, "ERROR: Input tree has structural errors, aborting (use -f to force output)\n"); - exit(1); + exit(2); } else if (quiet < 3) { fprintf(stderr, "Warning: Input tree has structural errors, output forced\n"); } diff --git a/tests/dtc-checkfails.sh b/tests/dtc-checkfails.sh new file mode 100755 index 0000000..0a45a0b --- /dev/null +++ b/tests/dtc-checkfails.sh @@ -0,0 +1,22 @@ +#! /bin/sh + +. tests.sh + +TMPFILE="tmp.out.$$" + +rm -f $TMPFILE + +verbose_run "$DTC" -o $TMPFILE "$@" +ret="$?" + +if [ -f $TMPFILE ]; then + FAIL "output file was created despite bad input" +fi + +if [ "$ret" = "2" ]; then + PASS +else + FAIL "dtc returned error code $ret instead of 2 (check failed)" +fi + +rm -f $TMPFILE diff --git a/tests/dtc.sh b/tests/dtc.sh index f704f55..c5a7324 100755 --- a/tests/dtc.sh +++ b/tests/dtc.sh @@ -1,24 +1,6 @@ #! /bin/sh -PASS () { - echo "PASS" - exit 0 -} - -FAIL () { - echo "FAIL" "$@" - exit 2 -} - -DTC=../dtc - -verbose_run () { - if [ -z "$QUIET_TEST" ]; then - "$@" - else - "$@" > /dev/null 2> /dev/null - fi -} +. tests.sh if verbose_run "$DTC" "$@"; then PASS diff --git a/tests/dup-nodename.dts b/tests/dup-nodename.dts new file mode 100644 index 0000000..2a3aa75 --- /dev/null +++ b/tests/dup-nodename.dts @@ -0,0 +1,8 @@ +/dts-v1/; + +/ { + node { + }; + node { + }; +}; diff --git a/tests/dup-phandle.dts b/tests/dup-phandle.dts new file mode 100644 index 0000000..c266c61 --- /dev/null +++ b/tests/dup-phandle.dts @@ -0,0 +1,10 @@ +/dts-v1/; + +/ { + node1 { + linux,phandle = <1>; + }; + node2 { + linux,phandle = <1>; + }; +}; diff --git a/tests/dup-propname.dts b/tests/dup-propname.dts new file mode 100644 index 0000000..8145f6e --- /dev/null +++ b/tests/dup-propname.dts @@ -0,0 +1,6 @@ +/dts-v1/; + +/ { + prop; + prop; +}; diff --git a/tests/minusone-phandle.dts b/tests/minusone-phandle.dts new file mode 100644 index 0000000..21d9986 --- /dev/null +++ b/tests/minusone-phandle.dts @@ -0,0 +1,7 @@ +/dts-v1/; + +/ { + node { + linux,phandle = <0xffffffff>; + }; +}; diff --git a/tests/run_tests.sh b/tests/run_tests.sh index 9ae2a12..2a41d43 100755 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -142,6 +142,12 @@ dtc_tests () { run_test dtbs_equal_ordered $tree odts_$tree.test.dtb done + # Check some checks + run_test dtc-checkfails.sh -I dts -O dtb dup-nodename.dts + run_test dtc-checkfails.sh -I dts -O dtb dup-propname.dts + run_test dtc-checkfails.sh -I dts -O dtb dup-phandle.dts + run_test dtc-checkfails.sh -I dts -O dtb zero-phandle.dts + run_test dtc-checkfails.sh -I dts -O dtb minusone-phandle.dts } while getopts "vdt:" ARG ; do diff --git a/tests/tests.sh b/tests/tests.sh new file mode 100644 index 0000000..396b4cf --- /dev/null +++ b/tests/tests.sh @@ -0,0 +1,21 @@ +# Common functions for shell testcases + +PASS () { + echo "PASS" + exit 0 +} + +FAIL () { + echo "FAIL" "$@" + exit 2 +} + +DTC=../dtc + +verbose_run () { + if [ -z "$QUIET_TEST" ]; then + "$@" + else + "$@" > /dev/null 2> /dev/null + fi +} diff --git a/tests/zero-phandle.dts b/tests/zero-phandle.dts new file mode 100644 index 0000000..7997d98 --- /dev/null +++ b/tests/zero-phandle.dts @@ -0,0 +1,7 @@ +/dts-v1/; + +/ { + node { + linux,phandle = <0>; + }; +};