|
1 #! /bin/sh |
|
2 |
|
3 . ./tests.sh |
|
4 |
|
5 export QUIET_TEST=1 |
|
6 |
|
7 export VALGRIND= |
|
8 VGCODE=126 |
|
9 |
|
10 tot_tests=0 |
|
11 tot_pass=0 |
|
12 tot_fail=0 |
|
13 tot_config=0 |
|
14 tot_vg=0 |
|
15 tot_strange=0 |
|
16 |
|
17 base_run_test() { |
|
18 tot_tests=$((tot_tests + 1)) |
|
19 if VALGRIND="$VALGRIND" "$@"; then |
|
20 tot_pass=$((tot_pass + 1)) |
|
21 else |
|
22 ret="$?" |
|
23 if [ "$ret" == "1" ]; then |
|
24 tot_config=$((tot_config + 1)) |
|
25 elif [ "$ret" == "2" ]; then |
|
26 tot_fail=$((tot_fail + 1)) |
|
27 elif [ "$ret" == "$VGCODE" ]; then |
|
28 tot_vg=$((tot_vg + 1)) |
|
29 else |
|
30 tot_strange=$((tot_strange + 1)) |
|
31 fi |
|
32 fi |
|
33 } |
|
34 |
|
35 run_test () { |
|
36 echo -n "$@: " |
|
37 if [ -n "$VALGRIND" -a -f $1.supp ]; then |
|
38 VGSUPP="--suppressions=$1.supp" |
|
39 fi |
|
40 base_run_test $VALGRIND $VGSUPP "./$@" |
|
41 } |
|
42 |
|
43 run_sh_test () { |
|
44 echo -n "$@: " |
|
45 base_run_test sh "$@" |
|
46 } |
|
47 |
|
48 wrap_test () { |
|
49 ( |
|
50 if verbose_run "$@"; then |
|
51 PASS |
|
52 else |
|
53 ret="$?" |
|
54 if [ "$ret" -gt 127 ]; then |
|
55 signame=$(kill -l $((ret - 128))) |
|
56 FAIL "Killed by SIG$signame" |
|
57 else |
|
58 FAIL "Returned error code $ret" |
|
59 fi |
|
60 fi |
|
61 ) |
|
62 } |
|
63 |
|
64 run_wrap_test () { |
|
65 echo -n "$@: " |
|
66 base_run_test wrap_test "$@" |
|
67 } |
|
68 |
|
69 run_dtc_test () { |
|
70 echo -n "dtc $@: " |
|
71 base_run_test wrap_test $VALGRIND $DTC "$@" |
|
72 } |
|
73 |
|
74 CONVERT=../convert-dtsv0 |
|
75 |
|
76 run_convert_test () { |
|
77 echo -n "convert-dtsv0 $@: " |
|
78 base_run_test wrap_test $VALGRIND $CONVERT "$@" |
|
79 } |
|
80 |
|
81 tree1_tests () { |
|
82 TREE=$1 |
|
83 |
|
84 # Read-only tests |
|
85 run_test get_mem_rsv $TREE |
|
86 run_test root_node $TREE |
|
87 run_test find_property $TREE |
|
88 run_test subnode_offset $TREE |
|
89 run_test path_offset $TREE |
|
90 run_test get_name $TREE |
|
91 run_test getprop $TREE |
|
92 run_test get_phandle $TREE |
|
93 run_test get_path $TREE |
|
94 run_test supernode_atdepth_offset $TREE |
|
95 run_test parent_offset $TREE |
|
96 run_test node_offset_by_prop_value $TREE |
|
97 run_test node_offset_by_phandle $TREE |
|
98 run_test node_check_compatible $TREE |
|
99 run_test node_offset_by_compatible $TREE |
|
100 run_test notfound $TREE |
|
101 |
|
102 # Write-in-place tests |
|
103 run_test setprop_inplace $TREE |
|
104 run_test nop_property $TREE |
|
105 run_test nop_node $TREE |
|
106 } |
|
107 |
|
108 tree1_tests_rw () { |
|
109 TREE=$1 |
|
110 |
|
111 # Read-write tests |
|
112 run_test set_name $TREE |
|
113 run_test setprop $TREE |
|
114 run_test del_property $TREE |
|
115 run_test del_node $TREE |
|
116 } |
|
117 |
|
118 check_tests () { |
|
119 tree="$1" |
|
120 shift |
|
121 run_sh_test dtc-checkfails.sh "$@" -- -I dts -O dtb $tree |
|
122 run_dtc_test -I dts -O dtb -o $tree.test.dtb -f $tree |
|
123 run_sh_test dtc-checkfails.sh "$@" -- -I dtb -O dtb $tree.test.dtb |
|
124 } |
|
125 |
|
126 ALL_LAYOUTS="mts mst tms tsm smt stm" |
|
127 |
|
128 libfdt_tests () { |
|
129 tree1_tests test_tree1.dtb |
|
130 |
|
131 # Sequential write tests |
|
132 run_test sw_tree1 |
|
133 tree1_tests sw_tree1.test.dtb |
|
134 tree1_tests unfinished_tree1.test.dtb |
|
135 run_test dtbs_equal_ordered test_tree1.dtb sw_tree1.test.dtb |
|
136 |
|
137 # fdt_move tests |
|
138 for tree in test_tree1.dtb sw_tree1.test.dtb unfinished_tree1.test.dtb; do |
|
139 rm -f moved.$tree shunted.$tree deshunted.$tree |
|
140 run_test move_and_save $tree |
|
141 run_test dtbs_equal_ordered $tree moved.$tree |
|
142 run_test dtbs_equal_ordered $tree shunted.$tree |
|
143 run_test dtbs_equal_ordered $tree deshunted.$tree |
|
144 done |
|
145 |
|
146 # v16 and alternate layout tests |
|
147 for tree in test_tree1.dtb; do |
|
148 for version in 17 16; do |
|
149 for layout in $ALL_LAYOUTS; do |
|
150 run_test mangle-layout $tree $version $layout |
|
151 tree1_tests v$version.$layout.$tree |
|
152 run_test dtbs_equal_ordered $tree v$version.$layout.$tree |
|
153 done |
|
154 done |
|
155 done |
|
156 |
|
157 # Read-write tests |
|
158 for basetree in test_tree1.dtb; do |
|
159 for version in 17 16; do |
|
160 for layout in $ALL_LAYOUTS; do |
|
161 tree=v$version.$layout.$basetree |
|
162 rm -f opened.$tree repacked.$tree |
|
163 run_test open_pack $tree |
|
164 tree1_tests opened.$tree |
|
165 tree1_tests repacked.$tree |
|
166 |
|
167 tree1_tests_rw $tree |
|
168 tree1_tests_rw opened.$tree |
|
169 tree1_tests_rw repacked.$tree |
|
170 done |
|
171 done |
|
172 done |
|
173 run_test rw_tree1 |
|
174 tree1_tests rw_tree1.test.dtb |
|
175 tree1_tests_rw rw_tree1.test.dtb |
|
176 |
|
177 for basetree in test_tree1.dtb sw_tree1.test.dtb rw_tree1.test.dtb; do |
|
178 run_test nopulate $basetree |
|
179 run_test dtbs_equal_ordered $basetree noppy.$basetree |
|
180 tree1_tests noppy.$basetree |
|
181 tree1_tests_rw noppy.$basetree |
|
182 done |
|
183 |
|
184 # Tests for behaviour on various sorts of corrupted trees |
|
185 run_test truncated_property |
|
186 |
|
187 # Specific bug tests |
|
188 run_test add_subnode_with_nops |
|
189 } |
|
190 |
|
191 dtc_tests () { |
|
192 run_dtc_test -I dts -O dtb -o dtc_tree1.test.dtb test_tree1.dts |
|
193 tree1_tests dtc_tree1.test.dtb |
|
194 tree1_tests_rw dtc_tree1.test.dtb |
|
195 run_test dtbs_equal_ordered dtc_tree1.test.dtb test_tree1.dtb |
|
196 |
|
197 run_dtc_test -I dts -O dtb -o dtc_tree1_dts0.test.dtb test_tree1_dts0.dts |
|
198 tree1_tests dtc_tree1_dts0.test.dtb |
|
199 tree1_tests_rw dtc_tree1_dts0.test.dtb |
|
200 |
|
201 run_dtc_test -I dts -O dtb -o dtc_escapes.test.dtb escapes.dts |
|
202 run_test string_escapes dtc_escapes.test.dtb |
|
203 |
|
204 run_dtc_test -I dts -O dtb -o dtc_references.test.dtb references.dts |
|
205 run_test references dtc_references.test.dtb |
|
206 |
|
207 run_dtc_test -I dts -O dtb -o dtc_references_dts0.test.dtb references_dts0.dts |
|
208 run_test references dtc_references_dts0.test.dtb |
|
209 |
|
210 run_dtc_test -I dts -O dtb -o dtc_path-references.test.dtb path-references.dts |
|
211 run_test path-references dtc_path-references.test.dtb |
|
212 |
|
213 run_dtc_test -I dts -O dtb -o dtc_comments.test.dtb comments.dts |
|
214 run_dtc_test -I dts -O dtb -o dtc_comments-cmp.test.dtb comments-cmp.dts |
|
215 run_test dtbs_equal_ordered dtc_comments.test.dtb dtc_comments-cmp.test.dtb |
|
216 |
|
217 # Check /include/ directive |
|
218 run_dtc_test -I dts -O dtb -o includes.test.dtb include0.dts |
|
219 run_test dtbs_equal_ordered includes.test.dtb test_tree1.dtb |
|
220 |
|
221 # Check /incbin/ directive |
|
222 run_dtc_test -I dts -O dtb -o incbin.test.dtb incbin.dts |
|
223 run_test incbin incbin.test.dtb |
|
224 |
|
225 # Check boot_cpuid_phys handling |
|
226 run_dtc_test -I dts -O dtb -b 17 -o boot_cpuid.test.dtb empty.dts |
|
227 run_test boot-cpuid boot_cpuid.test.dtb 17 |
|
228 run_dtc_test -I dtb -O dtb -b 17 -o boot_cpuid_test_tree1.test.dtb test_tree1.dtb |
|
229 run_test boot-cpuid boot_cpuid_test_tree1.test.dtb 17 |
|
230 run_dtc_test -I dtb -O dtb -o boot_cpuid_preserved_test_tree1.test.dtb boot_cpuid_test_tree1.test.dtb |
|
231 run_test dtbs_equal_ordered boot_cpuid_preserved_test_tree1.test.dtb boot_cpuid_test_tree1.test.dtb |
|
232 |
|
233 # Check -Odts mode preserve all dtb information |
|
234 for tree in test_tree1.dtb dtc_tree1.test.dtb dtc_escapes.test.dtb ; do |
|
235 run_dtc_test -I dtb -O dts -o odts_$tree.test.dts $tree |
|
236 run_dtc_test -I dts -O dtb -o odts_$tree.test.dtb odts_$tree.test.dts |
|
237 run_test dtbs_equal_ordered $tree odts_$tree.test.dtb |
|
238 done |
|
239 |
|
240 # Check version conversions |
|
241 for tree in test_tree1.dtb ; do |
|
242 for aver in 1 2 3 16 17; do |
|
243 atree="ov${aver}_$tree.test.dtb" |
|
244 run_dtc_test -I dtb -O dtb -V$aver -o $atree $tree |
|
245 for bver in 16 17; do |
|
246 btree="ov${bver}_$atree" |
|
247 run_dtc_test -I dtb -O dtb -V$bver -o $btree $atree |
|
248 run_test dtbs_equal_ordered $btree $tree |
|
249 done |
|
250 done |
|
251 done |
|
252 |
|
253 # Check some checks |
|
254 check_tests dup-nodename.dts duplicate_node_names |
|
255 check_tests dup-propname.dts duplicate_property_names |
|
256 check_tests dup-phandle.dts explicit_phandles |
|
257 check_tests zero-phandle.dts explicit_phandles |
|
258 check_tests minusone-phandle.dts explicit_phandles |
|
259 run_sh_test dtc-checkfails.sh phandle_references -- -I dts -O dtb nonexist-node-ref.dts |
|
260 run_sh_test dtc-checkfails.sh phandle_references -- -I dts -O dtb nonexist-label-ref.dts |
|
261 check_tests bad-name-property.dts name_properties |
|
262 |
|
263 check_tests bad-ncells.dts address_cells_is_cell size_cells_is_cell interrupt_cells_is_cell |
|
264 check_tests bad-string-props.dts device_type_is_string model_is_string status_is_string |
|
265 check_tests bad-reg-ranges.dts reg_format ranges_format |
|
266 check_tests bad-empty-ranges.dts ranges_format |
|
267 check_tests reg-ranges-root.dts reg_format ranges_format |
|
268 check_tests default-addr-size.dts avoid_default_addr_size |
|
269 check_tests obsolete-chosen-interrupt-controller.dts obsolete_chosen_interrupt_controller |
|
270 run_sh_test dtc-checkfails.sh node_name_chars -- -I dtb -O dtb bad_node_char.dtb |
|
271 run_sh_test dtc-checkfails.sh node_name_format -- -I dtb -O dtb bad_node_format.dtb |
|
272 run_sh_test dtc-checkfails.sh prop_name_chars -- -I dtb -O dtb bad_prop_char.dtb |
|
273 |
|
274 # Check for proper behaviour reading from stdin |
|
275 run_dtc_test -I dts -O dtb -o stdin_dtc_tree1.test.dtb - < test_tree1.dts |
|
276 run_wrap_test cmp stdin_dtc_tree1.test.dtb dtc_tree1.test.dtb |
|
277 run_dtc_test -I dtb -O dts -o stdin_odts_test_tree1.dtb.test.dts - < test_tree1.dtb |
|
278 run_wrap_test cmp stdin_odts_test_tree1.dtb.test.dts odts_test_tree1.dtb.test.dts |
|
279 |
|
280 # Check for graceful failure in some error conditions |
|
281 run_sh_test dtc-fatal.sh -I dts -O dtb nosuchfile.dts |
|
282 run_sh_test dtc-fatal.sh -I dtb -O dtb nosuchfile.dtb |
|
283 run_sh_test dtc-fatal.sh -I fs -O dtb nosuchfile |
|
284 } |
|
285 |
|
286 convert_tests () { |
|
287 V0_DTS="test_tree1_dts0.dts references_dts0.dts empty.dts escapes.dts \ |
|
288 test01.dts label01.dts" |
|
289 for dts in $V0_DTS; do |
|
290 run_dtc_test -I dts -O dtb -o cvtraw_$dts.test.dtb $dts |
|
291 run_dtc_test -I dts -O dts -o cvtdtc_$dts.test.dts $dts |
|
292 run_dtc_test -I dts -O dtb -o cvtdtc_$dts.test.dtb cvtdtc_$dts.test.dts |
|
293 run_convert_test $dts |
|
294 run_dtc_test -I dts -O dtb -o cvtcvt_$dts.test.dtb ${dts}v1 |
|
295 |
|
296 run_wrap_test cmp cvtraw_$dts.test.dtb cvtdtc_$dts.test.dtb |
|
297 run_wrap_test cmp cvtraw_$dts.test.dtb cvtcvt_$dts.test.dtb |
|
298 done |
|
299 } |
|
300 |
|
301 while getopts "vt:m" ARG ; do |
|
302 case $ARG in |
|
303 "v") |
|
304 unset QUIET_TEST |
|
305 ;; |
|
306 "t") |
|
307 TESTSETS=$OPTARG |
|
308 ;; |
|
309 "m") |
|
310 VALGRIND="valgrind --tool=memcheck -q --error-exitcode=$VGCODE" |
|
311 ;; |
|
312 esac |
|
313 done |
|
314 |
|
315 if [ -z "$TESTSETS" ]; then |
|
316 TESTSETS="libfdt dtc convert" |
|
317 fi |
|
318 |
|
319 # Make sure we don't have stale blobs lying around |
|
320 rm -f *.test.dtb *.test.dts |
|
321 |
|
322 for set in $TESTSETS; do |
|
323 case $set in |
|
324 "libfdt") |
|
325 libfdt_tests |
|
326 ;; |
|
327 "dtc") |
|
328 dtc_tests |
|
329 ;; |
|
330 "convert") |
|
331 convert_tests |
|
332 ;; |
|
333 esac |
|
334 done |
|
335 |
|
336 echo -e "********** TEST SUMMARY" |
|
337 echo -e "* Total testcases: $tot_tests" |
|
338 echo -e "* PASS: $tot_pass" |
|
339 echo -e "* FAIL: $tot_fail" |
|
340 echo -e "* Bad configuration: $tot_config" |
|
341 if [ -n "$VALGRIND" ]; then |
|
342 echo -e "* valgrind errors: $tot_vg" |
|
343 fi |
|
344 echo -e "* Strange test result: $tot_strange" |
|
345 echo -e "**********" |
|
346 |