1#! /bin/sh
2
3. ./tests.sh
4
5if [ -z "$CC" ]; then
6    CC=gcc
7fi
8
9export QUIET_TEST=1
10STOP_ON_FAIL=0
11
12export VALGRIND=
13VGCODE=126
14
15tot_tests=0
16tot_pass=0
17tot_fail=0
18tot_config=0
19tot_vg=0
20tot_strange=0
21
22base_run_test() {
23    tot_tests=$((tot_tests + 1))
24    if VALGRIND="$VALGRIND" "$@"; then
25	tot_pass=$((tot_pass + 1))
26    else
27	ret="$?"
28	if [ "$STOP_ON_FAIL" -eq 1 ]; then
29	    exit 1
30	fi
31	if [ "$ret" -eq 1 ]; then
32	    tot_config=$((tot_config + 1))
33	elif [ "$ret" -eq 2 ]; then
34	    tot_fail=$((tot_fail + 1))
35	elif [ "$ret" -eq $VGCODE ]; then
36	    tot_vg=$((tot_vg + 1))
37	else
38	    tot_strange=$((tot_strange + 1))
39	fi
40    fi
41}
42
43shorten_echo () {
44    limit=32
45    printf "$1"
46    shift
47    for x; do
48	if [ ${#x} -le $limit ]; then
49	    printf " $x"
50	else
51	    short=$(echo "$x" | head -c$limit)
52	    printf " \"$short\"...<${#x} bytes>"
53	fi
54    done
55}
56
57run_test () {
58    printf "$*:	"
59    if [ -n "$VALGRIND" -a -f $1.supp ]; then
60	VGSUPP="--suppressions=$1.supp"
61    fi
62    base_run_test $VALGRIND $VGSUPP "./$@"
63}
64
65run_sh_test () {
66    printf "$*:	"
67    base_run_test sh "$@"
68}
69
70wrap_test () {
71    (
72	if verbose_run "$@"; then
73	    PASS
74	else
75	    ret="$?"
76	    if [ "$ret" -gt 127 ]; then
77		signame=$(kill -l $((ret - 128)))
78		FAIL "Killed by SIG$signame"
79	    else
80		FAIL "Returned error code $ret"
81	    fi
82	fi
83    )
84}
85
86run_wrap_test () {
87    shorten_echo "$@:	"
88    base_run_test wrap_test "$@"
89}
90
91wrap_error () {
92    (
93	if verbose_run "$@"; then
94	    FAIL "Expected non-zero return code"
95	else
96	    ret="$?"
97	    if [ "$ret" -gt 127 ]; then
98		signame=$(kill -l $((ret - 128)))
99		FAIL "Killed by SIG$signame"
100	    else
101		PASS
102	    fi
103	fi
104    )
105}
106
107run_wrap_error_test () {
108    shorten_echo "$@"
109    printf " {!= 0}:	"
110    base_run_test wrap_error "$@"
111}
112
113# $1: dtb file
114# $2: align base
115check_align () {
116    shorten_echo "check_align $@:	"
117    local size=$(stat -c %s "$1")
118    local align="$2"
119    (
120	if [ $(($size % $align)) -eq 0 ] ;then
121	    PASS
122	else
123	    FAIL "Output size $size is not $align-byte aligned"
124	fi
125    )
126}
127
128run_dtc_test () {
129    printf "dtc $*:	"
130    base_run_test wrap_test $VALGRIND $DTC "$@"
131}
132
133asm_to_so () {
134    $CC -shared -o $1.test.so data.S $1.test.s
135}
136
137asm_to_so_test () {
138    run_wrap_test asm_to_so "$@"
139}
140
141run_fdtget_test () {
142    expect="$1"
143    shift
144    printf "fdtget-runtest.sh %s $*:	" "$(echo $expect)"
145    base_run_test sh fdtget-runtest.sh "$expect" "$@"
146}
147
148run_fdtput_test () {
149    expect="$1"
150    shift
151    shorten_echo fdtput-runtest.sh "$expect" "$@"
152    printf ":	"
153    base_run_test sh fdtput-runtest.sh "$expect" "$@"
154}
155
156run_fdtdump_test() {
157    file="$1"
158    shorten_echo fdtdump-runtest.sh "$file"
159    printf ":	"
160    base_run_test sh fdtdump-runtest.sh "$file"
161}
162
163BAD_FIXUP_TREES="bad_index \
164		empty \
165		empty_index \
166		index_trailing \
167		path_empty_prop \
168		path_only \
169		path_only_sep \
170		path_prop"
171
172# Test to exercise libfdt overlay application without dtc's overlay support
173libfdt_overlay_tests () {
174    # First test a doctored overlay which requires only local fixups
175    run_dtc_test -I dts -O dtb -o overlay_base_no_symbols.test.dtb overlay_base.dts
176    run_test check_path overlay_base_no_symbols.test.dtb not-exists "/__symbols__"
177    run_test check_path overlay_base_no_symbols.test.dtb not-exists "/__fixups__"
178    run_test check_path overlay_base_no_symbols.test.dtb not-exists "/__local_fixups__"
179
180    run_dtc_test -I dts -O dtb -o overlay_overlay_no_fixups.test.dtb overlay_overlay_no_fixups.dts
181    run_test check_path overlay_overlay_no_fixups.test.dtb not-exists "/__symbols__"
182    run_test check_path overlay_overlay_no_fixups.test.dtb not-exists "/__fixups__"
183    run_test check_path overlay_overlay_no_fixups.test.dtb exists "/__local_fixups__"
184
185    run_test overlay overlay_base_no_symbols.test.dtb overlay_overlay_no_fixups.test.dtb
186
187    # Then test with manually constructed fixups
188    run_dtc_test -I dts -O dtb -o overlay_base_manual_symbols.test.dtb overlay_base_manual_symbols.dts
189    run_test check_path overlay_base_manual_symbols.test.dtb exists "/__symbols__"
190    run_test check_path overlay_base_manual_symbols.test.dtb not-exists "/__fixups__"
191    run_test check_path overlay_base_manual_symbols.test.dtb not-exists "/__local_fixups__"
192
193    run_dtc_test -I dts -O dtb -o overlay_overlay_manual_fixups.test.dtb overlay_overlay_manual_fixups.dts
194    run_test check_path overlay_overlay_manual_fixups.test.dtb not-exists "/__symbols__"
195    run_test check_path overlay_overlay_manual_fixups.test.dtb exists "/__fixups__"
196    run_test check_path overlay_overlay_manual_fixups.test.dtb exists "/__local_fixups__"
197
198    run_test overlay overlay_base_manual_symbols.test.dtb overlay_overlay_manual_fixups.test.dtb
199
200    # Bad fixup tests
201    for test in $BAD_FIXUP_TREES; do
202	tree="overlay_bad_fixup_$test"
203	run_dtc_test -I dts -O dtb -o $tree.test.dtb $tree.dts
204	run_test overlay_bad_fixup overlay_base_no_symbols.test.dtb $tree.test.dtb
205    done
206}
207
208# Tests to exercise dtc's overlay generation support
209dtc_overlay_tests () {
210    # Overlay tests for dtc
211    run_dtc_test -@ -I dts -O dtb -o overlay_base.test.dtb overlay_base.dts
212    run_test check_path overlay_base.test.dtb exists "/__symbols__"
213    run_test check_path overlay_base.test.dtb not-exists "/__fixups__"
214    run_test check_path overlay_base.test.dtb not-exists "/__local_fixups__"
215
216    run_dtc_test -I dts -O dtb -o overlay_overlay.test.dtb overlay_overlay.dts
217    run_test check_path overlay_overlay.test.dtb not-exists "/__symbols__"
218    run_test check_path overlay_overlay.test.dtb exists "/__fixups__"
219    run_test check_path overlay_overlay.test.dtb exists "/__local_fixups__"
220
221    run_test overlay overlay_base.test.dtb overlay_overlay.test.dtb
222
223    # test plugin source to dtb and back
224    run_dtc_test -I dtb -O dts -o overlay_overlay_decompile.test.dts overlay_overlay.test.dtb
225    run_dtc_test -I dts -O dtb -o overlay_overlay_decompile.test.dtb overlay_overlay_decompile.test.dts
226    run_test dtbs_equal_ordered overlay_overlay.test.dtb overlay_overlay_decompile.test.dtb
227
228    # Test generation of aliases insted of symbols
229    run_dtc_test -A -I dts -O dtb -o overlay_base_with_aliases.dtb overlay_base.dts
230    run_test check_path overlay_base_with_aliases.dtb exists "/aliases"
231    run_test check_path overlay_base_with_aliases.dtb not-exists "/__symbols__"
232    run_test check_path overlay_base_with_aliases.dtb not-exists "/__fixups__"
233    run_test check_path overlay_base_with_aliases.dtb not-exists "/__local_fixups__"
234}
235
236tree1_tests () {
237    TREE=$1
238
239    # Read-only tests
240    run_test get_mem_rsv $TREE
241    run_test root_node $TREE
242    run_test find_property $TREE
243    run_test subnode_offset $TREE
244    run_test path_offset $TREE
245    run_test get_name $TREE
246    run_test getprop $TREE
247    run_test get_phandle $TREE
248    run_test get_path $TREE
249    run_test supernode_atdepth_offset $TREE
250    run_test parent_offset $TREE
251    run_test node_offset_by_prop_value $TREE
252    run_test node_offset_by_phandle $TREE
253    run_test node_check_compatible $TREE
254    run_test node_offset_by_compatible $TREE
255    run_test notfound $TREE
256
257    # Write-in-place tests
258    run_test setprop_inplace $TREE
259    run_test nop_property $TREE
260    run_test nop_node $TREE
261}
262
263tree1_tests_rw () {
264    TREE=$1
265
266    # Read-write tests
267    run_test set_name $TREE
268    run_test setprop $TREE
269    run_test del_property $TREE
270    run_test del_node $TREE
271}
272
273check_tests () {
274    tree="$1"
275    shift
276    run_sh_test dtc-checkfails.sh "$@" -- -I dts -O dtb $tree
277    run_dtc_test -I dts -O dtb -o $tree.test.dtb -f $tree
278    run_sh_test dtc-checkfails.sh "$@" -- -I dtb -O dtb $tree.test.dtb
279}
280
281ALL_LAYOUTS="mts mst tms tsm smt stm"
282
283libfdt_tests () {
284    tree1_tests test_tree1.dtb
285
286    run_dtc_test -I dts -O dtb -o addresses.test.dtb addresses.dts
287    run_test addr_size_cells addresses.test.dtb
288
289    run_dtc_test -I dts -O dtb -o stringlist.test.dtb stringlist.dts
290    run_test stringlist stringlist.test.dtb
291
292    # Sequential write tests
293    run_test sw_tree1
294    tree1_tests sw_tree1.test.dtb
295    tree1_tests unfinished_tree1.test.dtb
296    run_test dtbs_equal_ordered test_tree1.dtb sw_tree1.test.dtb
297
298    # Resizing tests
299    for mode in resize realloc; do
300	run_test sw_tree1 $mode
301	tree1_tests sw_tree1.test.dtb
302	tree1_tests unfinished_tree1.test.dtb
303	run_test dtbs_equal_ordered test_tree1.dtb sw_tree1.test.dtb
304    done
305
306    # fdt_move tests
307    for tree in test_tree1.dtb sw_tree1.test.dtb unfinished_tree1.test.dtb; do
308	rm -f moved.$tree shunted.$tree deshunted.$tree
309	run_test move_and_save $tree
310	run_test dtbs_equal_ordered $tree moved.$tree
311	run_test dtbs_equal_ordered $tree shunted.$tree
312	run_test dtbs_equal_ordered $tree deshunted.$tree
313    done
314
315    # v16 and alternate layout tests
316    for tree in test_tree1.dtb; do
317	for version in 17 16; do
318	    for layout in $ALL_LAYOUTS; do
319		run_test mangle-layout $tree $version $layout
320		tree1_tests v$version.$layout.$tree
321		run_test dtbs_equal_ordered $tree v$version.$layout.$tree
322	    done
323	done
324    done
325
326    # Read-write tests
327    for basetree in test_tree1.dtb; do
328	for version in 17 16; do
329	    for layout in $ALL_LAYOUTS; do
330		tree=v$version.$layout.$basetree
331		rm -f opened.$tree repacked.$tree
332		run_test open_pack $tree
333		tree1_tests opened.$tree
334		tree1_tests repacked.$tree
335
336		tree1_tests_rw $tree
337		tree1_tests_rw opened.$tree
338		tree1_tests_rw repacked.$tree
339	    done
340	done
341    done
342    run_test rw_tree1
343    tree1_tests rw_tree1.test.dtb
344    tree1_tests_rw rw_tree1.test.dtb
345    run_test appendprop1
346    run_test appendprop2 appendprop1.test.dtb
347    run_dtc_test -I dts -O dtb -o appendprop.test.dtb appendprop.dts
348    run_test dtbs_equal_ordered appendprop2.test.dtb appendprop.test.dtb
349    libfdt_overlay_tests
350
351    for basetree in test_tree1.dtb sw_tree1.test.dtb rw_tree1.test.dtb; do
352	run_test nopulate $basetree
353	run_test dtbs_equal_ordered $basetree noppy.$basetree
354	tree1_tests noppy.$basetree
355	tree1_tests_rw noppy.$basetree
356    done
357
358    run_dtc_test -I dts -O dtb -o subnode_iterate.dtb subnode_iterate.dts
359    run_test subnode_iterate subnode_iterate.dtb
360
361    run_dtc_test -I dts -O dtb -o property_iterate.dtb property_iterate.dts
362    run_test property_iterate property_iterate.dtb
363
364    # Tests for behaviour on various sorts of corrupted trees
365    run_test truncated_property
366
367    # Check aliases support in fdt_path_offset
368    run_dtc_test -I dts -O dtb -o aliases.dtb aliases.dts
369    run_test get_alias aliases.dtb
370    run_test path_offset_aliases aliases.dtb
371
372    # Specific bug tests
373    run_test add_subnode_with_nops
374    run_dtc_test -I dts -O dts -o sourceoutput.test.dts sourceoutput.dts
375    run_dtc_test -I dts -O dtb -o sourceoutput.test.dtb sourceoutput.dts
376    run_dtc_test -I dts -O dtb -o sourceoutput.test.dts.test.dtb sourceoutput.test.dts
377    run_test dtbs_equal_ordered sourceoutput.test.dtb sourceoutput.test.dts.test.dtb
378
379    run_dtc_test -I dts -O dtb -o embedded_nul.test.dtb embedded_nul.dts
380    run_dtc_test -I dts -O dtb -o embedded_nul_equiv.test.dtb embedded_nul_equiv.dts
381    run_test dtbs_equal_ordered embedded_nul.test.dtb embedded_nul_equiv.test.dtb
382
383    run_dtc_test -I dts -O dtb bad-size-cells.dts
384
385    run_wrap_error_test $DTC division-by-zero.dts
386    run_wrap_error_test $DTC bad-octal-literal.dts
387    run_dtc_test -I dts -O dtb nul-in-escape.dts
388    run_wrap_error_test $DTC nul-in-line-info1.dts
389    run_wrap_error_test $DTC nul-in-line-info2.dts
390
391    run_wrap_error_test $DTC -I dtb -O dts -o /dev/null ovf_size_strings.dtb
392}
393
394dtc_tests () {
395    run_dtc_test -I dts -O dtb -o dtc_tree1.test.dtb test_tree1.dts
396    tree1_tests dtc_tree1.test.dtb
397    tree1_tests_rw dtc_tree1.test.dtb
398    run_test dtbs_equal_ordered dtc_tree1.test.dtb test_tree1.dtb
399
400    run_dtc_test -I dts -O dtb -o dtc_escapes.test.dtb propname_escapes.dts
401    run_test propname_escapes dtc_escapes.test.dtb
402
403    run_dtc_test -I dts -O dtb -o line_directives.test.dtb line_directives.dts
404
405    run_dtc_test -I dts -O dtb -o dtc_escapes.test.dtb escapes.dts
406    run_test string_escapes dtc_escapes.test.dtb
407
408    run_dtc_test -I dts -O dtb -o dtc_char_literal.test.dtb char_literal.dts
409    run_test char_literal dtc_char_literal.test.dtb
410
411    run_dtc_test -I dts -O dtb -o dtc_sized_cells.test.dtb sized_cells.dts
412    run_test sized_cells dtc_sized_cells.test.dtb
413
414    run_dtc_test -I dts -O dtb -o dtc_extra-terminating-null.test.dtb extra-terminating-null.dts
415    run_test extra-terminating-null dtc_extra-terminating-null.test.dtb
416
417    run_dtc_test -I dts -O dtb -o dtc_references.test.dtb references.dts
418    run_test references dtc_references.test.dtb
419
420    run_dtc_test -I dts -O dtb -o dtc_path-references.test.dtb path-references.dts
421    run_test path-references dtc_path-references.test.dtb
422
423    run_test phandle_format dtc_references.test.dtb both
424    for f in legacy epapr both; do
425	run_dtc_test -I dts -O dtb -H $f -o dtc_references.test.$f.dtb references.dts
426	run_test phandle_format dtc_references.test.$f.dtb $f
427    done
428
429    run_dtc_test -I dts -O dtb -o multilabel.test.dtb multilabel.dts
430    run_test references multilabel.test.dtb
431
432    run_dtc_test -I dts -O dtb -o label_repeated.test.dtb label_repeated.dts
433
434    run_dtc_test -I dts -O dtb -o dtc_comments.test.dtb comments.dts
435    run_dtc_test -I dts -O dtb -o dtc_comments-cmp.test.dtb comments-cmp.dts
436    run_test dtbs_equal_ordered dtc_comments.test.dtb dtc_comments-cmp.test.dtb
437
438    # Check /include/ directive
439    run_dtc_test -I dts -O dtb -o includes.test.dtb include0.dts
440    run_test dtbs_equal_ordered includes.test.dtb test_tree1.dtb
441
442    # Check /incbin/ directive
443    run_dtc_test -I dts -O dtb -o incbin.test.dtb incbin.dts
444    run_test incbin incbin.test.dtb
445
446    # Check boot_cpuid_phys handling
447    run_dtc_test -I dts -O dtb -o boot_cpuid.test.dtb boot-cpuid.dts
448    run_test boot-cpuid boot_cpuid.test.dtb 16
449
450    run_dtc_test -I dts -O dtb -b 17 -o boot_cpuid_17.test.dtb boot-cpuid.dts
451    run_test boot-cpuid boot_cpuid_17.test.dtb 17
452
453    run_dtc_test -I dtb -O dtb -o preserve_boot_cpuid.test.dtb boot_cpuid.test.dtb
454    run_test boot-cpuid preserve_boot_cpuid.test.dtb 16
455    run_test dtbs_equal_ordered preserve_boot_cpuid.test.dtb boot_cpuid.test.dtb
456
457    run_dtc_test -I dtb -O dtb -o preserve_boot_cpuid_17.test.dtb boot_cpuid_17.test.dtb
458    run_test boot-cpuid preserve_boot_cpuid_17.test.dtb 17
459    run_test dtbs_equal_ordered preserve_boot_cpuid_17.test.dtb boot_cpuid_17.test.dtb
460
461    run_dtc_test -I dtb -O dtb -b17 -o override17_boot_cpuid.test.dtb boot_cpuid.test.dtb
462    run_test boot-cpuid override17_boot_cpuid.test.dtb 17
463
464    run_dtc_test -I dtb -O dtb -b0 -o override0_boot_cpuid_17.test.dtb boot_cpuid_17.test.dtb
465    run_test boot-cpuid override0_boot_cpuid_17.test.dtb 0
466
467
468    # Check -Oasm mode
469    for tree in test_tree1.dts escapes.dts references.dts path-references.dts \
470	comments.dts aliases.dts include0.dts incbin.dts \
471	value-labels.dts ; do
472	run_dtc_test -I dts -O asm -o oasm_$tree.test.s $tree
473	asm_to_so_test oasm_$tree
474	run_dtc_test -I dts -O dtb -o $tree.test.dtb $tree
475	run_test asm_tree_dump ./oasm_$tree.test.so oasm_$tree.test.dtb
476	run_wrap_test cmp oasm_$tree.test.dtb $tree.test.dtb
477    done
478
479    run_test value-labels ./oasm_value-labels.dts.test.so
480
481    # Check -Odts mode preserve all dtb information
482    for tree in test_tree1.dtb dtc_tree1.test.dtb dtc_escapes.test.dtb \
483	dtc_extra-terminating-null.test.dtb dtc_references.test.dtb; do
484	run_dtc_test -I dtb -O dts -o odts_$tree.test.dts $tree
485	run_dtc_test -I dts -O dtb -o odts_$tree.test.dtb odts_$tree.test.dts
486	run_test dtbs_equal_ordered $tree odts_$tree.test.dtb
487    done
488
489    # Check version conversions
490    for tree in test_tree1.dtb ; do
491	 for aver in 1 2 3 16 17; do
492	     atree="ov${aver}_$tree.test.dtb"
493	     run_dtc_test -I dtb -O dtb -V$aver -o $atree $tree
494	     for bver in 16 17; do
495		 btree="ov${bver}_$atree"
496		 run_dtc_test -I dtb -O dtb -V$bver -o $btree $atree
497		 run_test dtbs_equal_ordered $btree $tree
498	     done
499	 done
500    done
501
502    # Check merge/overlay functionality
503    run_dtc_test -I dts -O dtb -o dtc_tree1_merge.test.dtb test_tree1_merge.dts
504    tree1_tests dtc_tree1_merge.test.dtb test_tree1.dtb
505    run_dtc_test -I dts -O dtb -o dtc_tree1_merge_labelled.test.dtb test_tree1_merge_labelled.dts
506    tree1_tests dtc_tree1_merge_labelled.test.dtb test_tree1.dtb
507    run_dtc_test -I dts -O dtb -o dtc_tree1_label_noderef.test.dtb test_tree1_label_noderef.dts
508    run_test dtbs_equal_unordered dtc_tree1_label_noderef.test.dtb test_tree1.dtb
509    run_dtc_test -I dts -O dtb -o multilabel_merge.test.dtb multilabel_merge.dts
510    run_test references multilabel.test.dtb
511    run_test dtbs_equal_ordered multilabel.test.dtb multilabel_merge.test.dtb
512    run_dtc_test -I dts -O dtb -o dtc_tree1_merge_path.test.dtb test_tree1_merge_path.dts
513    tree1_tests dtc_tree1_merge_path.test.dtb test_tree1.dtb
514    run_wrap_error_test $DTC -I dts -O dtb -o /dev/null test_label_ref.dts
515
516    # Check prop/node delete functionality
517    run_dtc_test -I dts -O dtb -o dtc_tree1_delete.test.dtb test_tree1_delete.dts
518    tree1_tests dtc_tree1_delete.test.dtb
519
520    run_dtc_test -I dts -O dts -o delete_reinstate_multilabel.dts.test.dts delete_reinstate_multilabel.dts
521    run_wrap_test cmp delete_reinstate_multilabel.dts.test.dts delete_reinstate_multilabel_ref.dts
522
523    # Check some checks
524    check_tests dup-nodename.dts duplicate_node_names
525    check_tests dup-propname.dts duplicate_property_names
526    check_tests dup-phandle.dts explicit_phandles
527    check_tests zero-phandle.dts explicit_phandles
528    check_tests minusone-phandle.dts explicit_phandles
529    run_sh_test dtc-checkfails.sh phandle_references -- -I dts -O dtb nonexist-node-ref.dts
530    run_sh_test dtc-checkfails.sh phandle_references -- -I dts -O dtb nonexist-label-ref.dts
531    run_sh_test dtc-fatal.sh -I dts -O dtb nonexist-node-ref2.dts
532    check_tests bad-name-property.dts name_properties
533
534    check_tests bad-ncells.dts address_cells_is_cell size_cells_is_cell interrupt_cells_is_cell
535    check_tests bad-string-props.dts device_type_is_string model_is_string status_is_string
536    check_tests bad-reg-ranges.dts reg_format ranges_format
537    check_tests bad-empty-ranges.dts ranges_format
538    check_tests reg-ranges-root.dts reg_format ranges_format
539    check_tests default-addr-size.dts avoid_default_addr_size
540    check_tests obsolete-chosen-interrupt-controller.dts obsolete_chosen_interrupt_controller
541    check_tests reg-without-unit-addr.dts unit_address_vs_reg
542    check_tests unit-addr-without-reg.dts unit_address_vs_reg
543    run_sh_test dtc-checkfails.sh node_name_chars -- -I dtb -O dtb bad_node_char.dtb
544    run_sh_test dtc-checkfails.sh node_name_format -- -I dtb -O dtb bad_node_format.dtb
545    run_sh_test dtc-checkfails.sh prop_name_chars -- -I dtb -O dtb bad_prop_char.dtb
546
547    run_sh_test dtc-checkfails.sh duplicate_label -- -I dts -O dtb reuse-label1.dts
548    run_sh_test dtc-checkfails.sh duplicate_label -- -I dts -O dtb reuse-label2.dts
549    run_sh_test dtc-checkfails.sh duplicate_label -- -I dts -O dtb reuse-label3.dts
550    run_sh_test dtc-checkfails.sh duplicate_label -- -I dts -O dtb reuse-label4.dts
551    run_sh_test dtc-checkfails.sh duplicate_label -- -I dts -O dtb reuse-label5.dts
552    run_sh_test dtc-checkfails.sh duplicate_label -- -I dts -O dtb reuse-label6.dts
553
554    run_test check_path test_tree1.dtb exists "/subnode@1"
555    run_test check_path test_tree1.dtb not-exists "/subnode@10"
556
557    # Check warning options
558    run_sh_test dtc-checkfails.sh address_cells_is_cell interrupt_cells_is_cell -n size_cells_is_cell -- -Wno_size_cells_is_cell -I dts -O dtb bad-ncells.dts
559    run_sh_test dtc-fails.sh -n test-warn-output.test.dtb -I dts -O dtb bad-ncells.dts
560    run_sh_test dtc-fails.sh test-error-output.test.dtb -I dts -O dtb bad-ncells.dts -Esize_cells_is_cell
561    run_sh_test dtc-checkfails.sh always_fail -- -Walways_fail -I dts -O dtb test_tree1.dts
562    run_sh_test dtc-checkfails.sh -n always_fail -- -Walways_fail -Wno_always_fail -I dts -O dtb test_tree1.dts
563    run_sh_test dtc-fails.sh test-negation-1.test.dtb -Ealways_fail -I dts -O dtb test_tree1.dts
564    run_sh_test dtc-fails.sh -n test-negation-2.test.dtb -Ealways_fail -Eno_always_fail -I dts -O dtb test_tree1.dts
565    run_sh_test dtc-fails.sh test-negation-3.test.dtb -Ealways_fail -Wno_always_fail -I dts -O dtb test_tree1.dts
566    run_sh_test dtc-fails.sh -n test-negation-4.test.dtb -Esize_cells_is_cell -Eno_size_cells_is_cell -I dts -O dtb bad-ncells.dts
567    run_sh_test dtc-checkfails.sh size_cells_is_cell -- -Esize_cells_is_cell -Eno_size_cells_is_cell -I dts -O dtb bad-ncells.dts
568
569    # Check for proper behaviour reading from stdin
570    run_dtc_test -I dts -O dtb -o stdin_dtc_tree1.test.dtb - < test_tree1.dts
571    run_wrap_test cmp stdin_dtc_tree1.test.dtb dtc_tree1.test.dtb
572    run_dtc_test -I dtb -O dts -o stdin_odts_test_tree1.dtb.test.dts - < test_tree1.dtb
573    run_wrap_test cmp stdin_odts_test_tree1.dtb.test.dts odts_test_tree1.dtb.test.dts
574
575    # Check integer expresisons
576    run_test integer-expressions -g integer-expressions.test.dts
577    run_dtc_test -I dts -O dtb -o integer-expressions.test.dtb integer-expressions.test.dts
578    run_test integer-expressions integer-expressions.test.dtb
579
580    # Check for graceful failure in some error conditions
581    run_sh_test dtc-fatal.sh -I dts -O dtb nosuchfile.dts
582    run_sh_test dtc-fatal.sh -I dtb -O dtb nosuchfile.dtb
583    run_sh_test dtc-fatal.sh -I fs -O dtb nosuchfile
584
585    # Dependencies
586    run_dtc_test -I dts -O dtb -o dependencies.test.dtb -d dependencies.test.d dependencies.dts
587    run_wrap_test cmp dependencies.test.d dependencies.cmp
588
589    # Search paths
590    run_wrap_error_test $DTC -I dts -O dtb -o search_paths.dtb search_paths.dts
591    run_dtc_test -i search_dir -I dts -O dtb -o search_paths.dtb \
592	search_paths.dts
593    run_wrap_error_test $DTC -i search_dir_b -I dts -O dtb \
594	-o search_paths_b.dtb search_paths_b.dts
595    run_dtc_test -i search_dir_b -i search_dir -I dts -O dtb \
596	-o search_paths_b.dtb search_paths_b.dts
597    run_dtc_test -I dts -O dtb -o search_paths_subdir.dtb \
598	search_dir_b/search_paths_subdir.dts
599
600    # Check -a option
601    for align in 2 4 8 16 32 64; do
602	# -p -a
603	run_dtc_test -O dtb -p 1000 -a $align -o align0.dtb subnode_iterate.dts
604	check_align align0.dtb $align
605	# -S -a
606	run_dtc_test -O dtb -S 1999 -a $align -o align1.dtb subnode_iterate.dts
607	check_align align1.dtb $align
608    done
609
610    # Tests for overlay/plugin generation
611    dtc_overlay_tests
612}
613
614cmp_tests () {
615    basetree="$1"
616    shift
617    wrongtrees="$@"
618
619    run_test dtb_reverse $basetree
620
621    # First dtbs_equal_ordered
622    run_test dtbs_equal_ordered $basetree $basetree
623    run_test dtbs_equal_ordered -n $basetree $basetree.reversed.test.dtb
624    for tree in $wrongtrees; do
625	run_test dtbs_equal_ordered -n $basetree $tree
626    done
627
628    # now unordered
629    run_test dtbs_equal_unordered $basetree $basetree
630    run_test dtbs_equal_unordered $basetree $basetree.reversed.test.dtb
631    run_test dtbs_equal_unordered $basetree.reversed.test.dtb $basetree
632    for tree in $wrongtrees; do
633	run_test dtbs_equal_unordered -n $basetree $tree
634    done
635
636    # now dtc --sort
637    run_dtc_test -I dtb -O dtb -s -o $basetree.sorted.test.dtb $basetree
638    run_test dtbs_equal_unordered $basetree $basetree.sorted.test.dtb
639    run_dtc_test -I dtb -O dtb -s -o $basetree.reversed.sorted.test.dtb $basetree.reversed.test.dtb
640    run_test dtbs_equal_unordered $basetree.reversed.test.dtb $basetree.reversed.sorted.test.dtb
641    run_test dtbs_equal_ordered $basetree.sorted.test.dtb $basetree.reversed.sorted.test.dtb
642}
643
644dtbs_equal_tests () {
645    WRONG_TREE1=""
646    for x in 1 2 3 4 5 6 7 8 9; do
647	run_dtc_test -I dts -O dtb -o test_tree1_wrong$x.test.dtb test_tree1_wrong$x.dts
648	WRONG_TREE1="$WRONG_TREE1 test_tree1_wrong$x.test.dtb"
649    done
650    cmp_tests test_tree1.dtb $WRONG_TREE1
651}
652
653fdtget_tests () {
654    dts=label01.dts
655    dtb=$dts.fdtget.test.dtb
656    run_dtc_test -O dtb -o $dtb $dts
657
658    # run_fdtget_test <expected-result> [<flags>] <file> <node> <property>
659    run_fdtget_test "MyBoardName" $dtb / model
660    run_fdtget_test "MyBoardName MyBoardFamilyName" $dtb / compatible
661    run_fdtget_test "77 121 66 111 \
66297 114 100 78 97 109 101 0 77 121 66 111 97 114 100 70 97 109 105 \
663108 121 78 97 109 101 0" -t bu $dtb / compatible
664    run_fdtget_test "MyBoardName MyBoardFamilyName" -t s $dtb / compatible
665    run_fdtget_test 32768 $dtb /cpus/PowerPC,970@1 d-cache-size
666    run_fdtget_test 8000 -tx $dtb /cpus/PowerPC,970@1 d-cache-size
667    run_fdtget_test "61 62 63 0" -tbx $dtb /randomnode tricky1
668    run_fdtget_test "a b c d de ea ad be ef" -tbx $dtb /randomnode blob
669
670    # Here the property size is not a multiple of 4 bytes, so it should fail
671    run_wrap_error_test $DTGET -tlx $dtb /randomnode mixed
672    run_fdtget_test "6162 6300 1234 0 a 0 b 0 c" -thx $dtb /randomnode mixed
673    run_fdtget_test "61 62 63 0 12 34 0 0 0 a 0 0 0 b 0 0 0 c" \
674	-thhx $dtb /randomnode mixed
675    run_wrap_error_test $DTGET -ts $dtb /randomnode doctor-who
676
677    # Test multiple arguments
678    run_fdtget_test "MyBoardName\nmemory" -ts $dtb / model /memory device_type
679
680    # Test defaults
681    run_wrap_error_test $DTGET -tx $dtb /randomnode doctor-who
682    run_fdtget_test "<the dead silence>" -tx \
683	-d "<the dead silence>" $dtb /randomnode doctor-who
684    run_fdtget_test "<blink>" -tx -d "<blink>" $dtb /memory doctor-who
685}
686
687fdtput_tests () {
688    dts=label01.dts
689    dtb=$dts.fdtput.test.dtb
690    text=lorem.txt
691
692    # Allow just enough space for $text
693    run_dtc_test -O dtb -p $(stat -c %s $text) -o $dtb $dts
694
695    # run_fdtput_test <expected-result> <file> <node> <property> <flags> <value>
696    run_fdtput_test "a_model" $dtb / model -ts "a_model"
697    run_fdtput_test "board1 board2" $dtb / compatible -ts board1 board2
698    run_fdtput_test "board1 board2" $dtb / compatible -ts "board1 board2"
699    run_fdtput_test "32768" $dtb /cpus/PowerPC,970@1 d-cache-size "" "32768"
700    run_fdtput_test "8001" $dtb /cpus/PowerPC,970@1 d-cache-size -tx 0x8001
701    run_fdtput_test "2 3 12" $dtb /randomnode tricky1 -tbi "02 003 12"
702    run_fdtput_test "a b c ea ad be ef" $dtb /randomnode blob \
703	-tbx "a b c ea ad be ef"
704    run_fdtput_test "a0b0c0d deeaae ef000000" $dtb /randomnode blob \
705	-tx "a0b0c0d deeaae ef000000"
706    run_fdtput_test "$(cat $text)" $dtb /randomnode blob -ts "$(cat $text)"
707
708    # Test expansion of the blob when insufficient room for property
709    run_fdtput_test "$(cat $text $text)" $dtb /randomnode blob -ts "$(cat $text $text)"
710
711    # Start again with a fresh dtb
712    run_dtc_test -O dtb -p $(stat -c %s $text) -o $dtb $dts
713
714    # Node creation
715    run_wrap_error_test $DTPUT $dtb -c /baldrick sod
716    run_wrap_test $DTPUT $dtb -c /chosen/son /chosen/daughter
717    run_fdtput_test "eva" $dtb /chosen/daughter name "" -ts "eva"
718    run_fdtput_test "adam" $dtb /chosen/son name "" -ts "adam"
719
720    # Not allowed to create an existing node
721    run_wrap_error_test $DTPUT $dtb -c /chosen
722    run_wrap_error_test $DTPUT $dtb -c /chosen/son
723
724    # Automatic node creation
725    run_wrap_test $DTPUT $dtb -cp /blackadder/the-second/turnip \
726	/blackadder/the-second/potato
727    run_fdtput_test 1000 $dtb /blackadder/the-second/turnip cost "" 1000
728    run_fdtput_test "fine wine" $dtb /blackadder/the-second/potato drink \
729	"-ts" "fine wine"
730    run_wrap_test $DTPUT $dtb -p /you/are/drunk/sir/winston slurp -ts twice
731
732    # Test expansion of the blob when insufficent room for a new node
733    run_wrap_test $DTPUT $dtb -cp "$(cat $text $text)/longish"
734
735    # Allowed to create an existing node with -p
736    run_wrap_test $DTPUT $dtb -cp /chosen
737    run_wrap_test $DTPUT $dtb -cp /chosen/son
738
739    # Start again with a fresh dtb
740    run_dtc_test -O dtb -p $(stat -c %s $text) -o $dtb $dts
741
742    # Node delete
743    run_wrap_test $DTPUT $dtb -c /chosen/node1 /chosen/node2 /chosen/node3
744    run_fdtget_test "node3\nnode2\nnode1" $dtb -l  /chosen
745    run_wrap_test $DTPUT $dtb -r /chosen/node1 /chosen/node2
746    run_fdtget_test "node3" $dtb -l  /chosen
747
748    # Delete the non-existent node
749    run_wrap_error_test $DTPUT $dtb -r /non-existent/node
750
751    # Property delete
752    run_fdtput_test "eva" $dtb /chosen/ name "" -ts "eva"
753    run_fdtput_test "016" $dtb /chosen/ age  "" -ts "016"
754    run_fdtget_test "age\nname\nbootargs\nlinux,platform" $dtb -p  /chosen
755    run_wrap_test $DTPUT $dtb -d /chosen/ name age
756    run_fdtget_test "bootargs\nlinux,platform" $dtb -p  /chosen
757
758    # Delete the non-existent property
759    run_wrap_error_test $DTPUT $dtb -d /chosen   non-existent-prop
760
761    # TODO: Add tests for verbose mode?
762}
763
764utilfdt_tests () {
765    run_test utilfdt_test
766}
767
768fdtdump_tests () {
769    run_fdtdump_test fdtdump.dts
770}
771
772while getopts "vt:me" ARG ; do
773    case $ARG in
774	"v")
775	    unset QUIET_TEST
776	    ;;
777	"t")
778	    TESTSETS=$OPTARG
779	    ;;
780	"m")
781	    VALGRIND="valgrind --tool=memcheck -q --error-exitcode=$VGCODE"
782	    ;;
783	"e")
784	    STOP_ON_FAIL=1
785	    ;;
786    esac
787done
788
789if [ -z "$TESTSETS" ]; then
790    TESTSETS="libfdt utilfdt dtc dtbs_equal fdtget fdtput fdtdump"
791fi
792
793# Make sure we don't have stale blobs lying around
794rm -f *.test.dtb *.test.dts
795
796for set in $TESTSETS; do
797    case $set in
798	"libfdt")
799	    libfdt_tests
800	    ;;
801	"utilfdt")
802	    utilfdt_tests
803	    ;;
804	"dtc")
805	    dtc_tests
806	    ;;
807	"dtbs_equal")
808	    dtbs_equal_tests
809	    ;;
810	"fdtget")
811	    fdtget_tests
812	    ;;
813	"fdtput")
814	    fdtput_tests
815	    ;;
816	"fdtdump")
817	    fdtdump_tests
818	    ;;
819    esac
820done
821
822echo "********** TEST SUMMARY"
823echo "*     Total testcases:	$tot_tests"
824echo "*                PASS:	$tot_pass"
825echo "*                FAIL:	$tot_fail"
826echo "*   Bad configuration:	$tot_config"
827if [ -n "$VALGRIND" ]; then
828    echo "*    valgrind errors:	$tot_vg"
829fi
830echo "* Strange test result:	$tot_strange"
831echo "**********"
832
833