]> git.ipfire.org Git - thirdparty/util-linux.git/blame - tests/functions.sh
tests: fdisk now prints SGI system partitions too
[thirdparty/util-linux.git] / tests / functions.sh
CommitLineData
92f2c23e
KZ
1#
2# Copyright (C) 2007 Karel Zak <kzak@redhat.com>
3#
601d12fb 4# This file is part of util-linux.
92f2c23e
KZ
5#
6# This file is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation; either version 2 of the License, or
9# (at your option) any later version.
10#
11# This file is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14# GNU General Public License for more details.
15#
e83446da 16
e83446da 17
a02f320d
KZ
18function ts_abspath {
19 cd $1
20 pwd
21}
d42bbae5 22
6dfe6f0e
KZ
23function ts_canonicalize {
24 P="$1"
25 C=$(readlink -f $P)
26
27 if [ -n "$C" ]; then
28 echo "$C"
29 else
30 echo "$P"
31 fi
32}
33
09888efe 34function ts_skip_subtest {
b30cd7ee 35 echo " IGNORE ($1)"
09888efe
KZ
36}
37
38function ts_skip {
39 ts_skip_subtest "$1"
f0b561b6 40 if [ -n "$2" -a -b "$2" ]; then
3dfa278e
KZ
41 ts_device_deinit "$2"
42 fi
b30cd7ee
KZ
43 exit 0
44}
45
09892fb6 46function ts_skip_nonroot {
f0b561b6 47 if [ $UID -ne 0 ]; then
09892fb6
KZ
48 ts_skip "not root permissions"
49 fi
50}
51
09888efe 52function ts_failed_subtest {
05de8126 53 if [ x"$1" == x"" ]; then
d42bbae5 54 echo " FAILED ($TS_NS)"
05de8126
KZ
55 else
56 echo " FAILED ($1)"
57 fi
05de8126
KZ
58}
59
09888efe
KZ
60function ts_failed {
61 ts_failed_subtest "$1"
62 exit 1
63}
64
65function ts_ok_subtest {
05de8126
KZ
66 if [ x"$1" == x"" ]; then
67 echo " OK"
68 else
69 echo " OK ($1)"
70 fi
09888efe
KZ
71}
72
73function ts_ok {
74 ts_ok_subtest "$1"
05de8126
KZ
75 exit 0
76}
77
57a917d6
KZ
78function ts_log {
79 echo "$1" >> $TS_OUTPUT
80 [ "$TS_VERBOSE" == "yes" ] && echo "$1"
81}
82
1d9acab1
KZ
83function ts_has_option {
84 NAME="$1"
85 ALL="$2"
a02f320d 86 echo -n $ALL | sed 's/ //g' | awk 'BEGIN { FS="="; RS="--" } /('$NAME'$|'$NAME'=)/ { print "yes" }'
1d9acab1
KZ
87}
88
1b03e2cd
KZ
89function ts_option_argument {
90 NAME="$1"
91 ALL="$2"
92 echo -n $ALL | sed 's/ //g' | awk 'BEGIN { FS="="; RS="--" } /'$NAME'=/ { print $2 }'
93}
94
db17c74b
KZ
95function ts_init_core_env {
96 TS_NS="$TS_COMPONENT/$TS_TESTNAME"
97 TS_OUTPUT="$TS_OUTDIR/$TS_TESTNAME"
495674f8 98 TS_VGDUMP="$TS_OUTDIR/$TS_TESTNAME.vgdump"
db17c74b
KZ
99 TS_DIFF="$TS_DIFFDIR/$TS_TESTNAME"
100 TS_EXPECTED="$TS_TOPDIR/expected/$TS_NS"
101 TS_MOUNTPOINT="$TS_OUTDIR/${TS_TESTNAME}-mnt"
102}
103
104function ts_init_core_subtest_env {
105 TS_NS="$TS_COMPONENT/$TS_TESTNAME-$TS_SUBNAME"
106 TS_OUTPUT="$TS_OUTDIR/$TS_TESTNAME-$TS_SUBNAME"
495674f8 107 TS_VGDUMP="$TS_OUTDIR/$TS_TESTNAME-$TS_SUBNAME.vgdump"
db17c74b
KZ
108 TS_DIFF="$TS_DIFFDIR/$TS_TESTNAME-$TS_SUBNAME"
109 TS_EXPECTED="$TS_TOPDIR/expected/$TS_NS"
64a2331f 110 TS_MOUNTPOINT="$TS_OUTDIR/${TS_TESTNAME}-${TS_SUBNAME}-mnt"
495674f8
KZ
111
112 rm -f $TS_OUTPUT $TS_VGDUMP
4210c47a
KZ
113 [ -d "$TS_OUTDIR" ] || mkdir -p "$TS_OUTDIR"
114
495674f8
KZ
115 touch $TS_OUTPUT
116 [ -n "$TS_VALGRIND_CMD" ] && touch $TS_VGDUMP
db17c74b
KZ
117}
118
905d0b9b 119function ts_init_env {
e130ce53 120 local mydir=$(ts_abspath ${0%/*})
d42bbae5 121
08b825db
YD
122 LANG="POSIX"
123 LANGUAGE="POSIX"
124 LC_ALL="POSIX"
125 CHARSET="UTF-8"
126
1b03e2cd
KZ
127 export LANG LANGUAGE LC_ALL CHARSET
128
6dfe6f0e
KZ
129 mydir=$(ts_canonicalize "$mydir")
130
1b03e2cd
KZ
131 # automake directories
132 top_srcdir=$(ts_option_argument "srcdir" "$*")
133 top_builddir=$(ts_option_argument "builddir" "$*")
d42bbae5 134
1b03e2cd 135 # where is this script
a02f320d 136 TS_TOPDIR=$(ts_abspath $mydir/../../)
1b03e2cd
KZ
137
138 # default
139 if [ -z "$top_srcdir" ]; then
140 top_srcdir="$TS_TOPDIR/.."
141 fi
142 if [ -z "$top_builddir" ]; then
143 top_builddir="$TS_TOPDIR/.."
144 fi
145
146 top_srcdir=$(ts_abspath $top_srcdir)
147 top_builddir=$(ts_abspath $top_builddir)
148
a02f320d 149 TS_SCRIPT="$mydir/$(basename $0)"
d42bbae5
KZ
150 TS_SUBDIR=$(dirname $TS_SCRIPT)
151 TS_TESTNAME=$(basename $TS_SCRIPT)
152 TS_COMPONENT=$(basename $TS_SUBDIR)
153
09888efe
KZ
154 TS_NSUBTESTS=0
155 TS_NSUBFAILED=0
156
d42bbae5
KZ
157 TS_SELF="$TS_SUBDIR"
158
1b03e2cd
KZ
159 TS_OUTDIR="$top_builddir/tests/output/$TS_COMPONENT"
160 TS_DIFFDIR="$top_builddir/tests/diff/$TS_COMPONENT"
db17c74b
KZ
161
162 ts_init_core_env
d42bbae5 163
cbac71bd 164 TS_VERBOSE=$(ts_has_option "verbose" "$*")
d42bbae5 165
632830cc 166 BLKID_FILE="$TS_OUTDIR/${TS_TESTNAME}.blkidtab"
d42bbae5 167
1b5417ac
KZ
168 declare -a TS_SUID_PROGS
169 declare -a TS_SUID_USER
170 declare -a TS_SUID_GROUP
171
adc8c80f
KZ
172 if [ -f $TS_TOPDIR/commands.sh ]; then
173 . $TS_TOPDIR/commands.sh
174 fi
a02f320d 175
b7ea07e0 176 export BLKID_FILE
66822df3 177
495674f8 178 rm -f $TS_OUTPUT $TS_VGDUMP
4210c47a
KZ
179 [ -d "$TS_OUTDIR" ] || mkdir -p "$TS_OUTDIR"
180
3dfa278e 181 touch $TS_OUTPUT
495674f8 182 [ -n "$TS_VALGRIND_CMD" ] && touch $TS_VGDUMP
97cdb3cb 183
d42bbae5
KZ
184 if [ "$TS_VERBOSE" == "yes" ]; then
185 echo
186 echo " script: $TS_SCRIPT"
d42bbae5 187 echo " sub dir: $TS_SUBDIR"
a02f320d 188 echo " top dir: $TS_TOPDIR"
d42bbae5
KZ
189 echo " self: $TS_SELF"
190 echo " test name: $TS_TESTNAME"
191 echo " test desc: $TS_DESC"
192 echo " component: $TS_COMPONENT"
193 echo " namespace: $TS_NS"
194 echo " verbose: $TS_VERBOSE"
195 echo " output: $TS_OUTPUT"
495674f8 196 echo " valgrind: $TS_VGDUMP"
d42bbae5
KZ
197 echo " expected: $TS_EXPECTED"
198 echo " mountpoint: $TS_MOUNTPOINT"
199 echo
200 fi
905d0b9b
KZ
201}
202
09888efe
KZ
203function ts_init_subtest {
204
205 TS_SUBNAME="$1"
206
db17c74b 207 ts_init_core_subtest_env
09888efe
KZ
208
209 [ $TS_NSUBTESTS -eq 0 ] && echo
210 TS_NSUBTESTS=$(( $TS_NSUBTESTS + 1 ))
211
b8ab3744 212 printf "%16s: %-27s ..." "" "$TS_SUBNAME"
09888efe
KZ
213}
214
905d0b9b
KZ
215function ts_init {
216 local is_fake=$( ts_has_option "fake" "$*")
949cf64b 217 local is_force=$( ts_has_option "force" "$*")
495674f8
KZ
218 local is_memcheck=$( ts_has_option "memcheck" "$*")
219
220 if [ "$is_memcheck" == "yes" -a -f /usr/bin/valgrind ]; then
221 TS_VALGRIND_CMD="/usr/bin/valgrind"
222 fi
905d0b9b
KZ
223
224 ts_init_env "$*"
225
b8ab3744 226 printf "%13s: %-30s ..." "$TS_COMPONENT" "$TS_DESC"
d42bbae5
KZ
227
228 [ "$is_fake" == "yes" ] && ts_skip "fake mode"
949cf64b 229 [ "$TS_OPTIONAL" == "yes" -a "$is_force" != "yes" ] && ts_skip "optional"
e83446da
KZ
230}
231
1b5417ac
KZ
232function ts_init_suid {
233 PROG="$1"
234 ct=${#TS_SUID_PROGS[*]}
235
236 # Save info about original setting
237 TS_SUID_PROGS[$ct]=$PROG
238 TS_SUID_USER[$ct]=$(stat --printf="%U" $PROG)
239 TS_SUID_GROUP[$ct]=$(stat --printf="%G" $PROG)
240
241 chown root.root $PROG &> /dev/null
242 chmod u+s $PROG &> /dev/null
243}
244
a731b541
KZ
245function ts_init_py {
246 LIBNAME="$1"
247
f48145b5 248 [ -f "$TS_TOPDIR/../py${LIBNAME}.la" ] || ts_skip "py${LIBNAME} not compiled"
a731b541
KZ
249
250 export LD_LIBRARY_PATH="$TS_TOPDIR/../.libs"
251 export PYTHONPATH="$TS_TOPDIR/../$LIBNAME/python:$TS_TOPDIR/../.libs"
46407453
OO
252
253 export PYTHON_VERSION=$(awk '/^PYTHON_VERSION/ { print $3 }' $top_builddir/Makefile)
254 export PYTHON_MAJOR_VERSION=$(echo $PYTHON_VERSION | sed 's/\..*//')
255
256 export PYTHON="python${PYTHON_MAJOR_VERSION}"
a731b541
KZ
257}
258
495674f8
KZ
259function ts_valgrind {
260 if [ -z "$TS_VALGRIND_CMD" ]; then
261 $*
262 else
263 $TS_VALGRIND_CMD --tool=memcheck --leak-check=full \
264 --leak-resolution=high --num-callers=20 \
265 --log-file="$TS_VGDUMP" $*
266 fi
267}
268
09888efe
KZ
269function ts_gen_diff {
270 local res=0
271
64a2331f 272 if [ -s "$TS_OUTPUT" ]; then
4210c47a 273
46949388
KZ
274 # remove libtool lt- prefixes
275 sed --in-place 's/^lt\-\(.*\: \)/\1/g' $TS_OUTPUT
276
4210c47a 277 [ -d "$TS_DIFFDIR" ] || mkdir -p "$TS_DIFFDIR"
09888efe 278 diff -u $TS_EXPECTED $TS_OUTPUT > $TS_DIFF
4210c47a
KZ
279
280 if [ -s $TS_DIFF ]; then
281 res=1
282 else
283 rm -f $TS_DIFF;
284 fi
09888efe
KZ
285 else
286 res=1
287 fi
288 return $res
289}
290
495674f8
KZ
291function tt_gen_mem_report {
292 [ -z "$TS_VALGRIND_CMD" ] && echo "$1"
293
294 grep -q -E 'ERROR SUMMARY: [1-9]' $TS_VGDUMP &> /dev/null
295 if [ $? -eq 0 ]; then
296 echo "mem-error detected!"
297 fi
298}
299
09888efe 300function ts_finalize_subtest {
e83446da
KZ
301 local res=0
302
64a2331f 303 if [ -s "$TS_EXPECTED" ]; then
09888efe
KZ
304 ts_gen_diff
305 if [ $? -eq 1 ]; then
306 ts_failed_subtest "$1"
307 res=1
308 else
495674f8 309 ts_ok_subtest "$(tt_gen_mem_report "$1")"
09888efe
KZ
310 fi
311 else
312 ts_skip_subtest "output undefined"
313 fi
314
315 [ $res -ne 0 ] && TS_NSUBFAILED=$(( $TS_NSUBFAILED + 1 ))
db17c74b
KZ
316
317 # reset environment back to parental test
318 ts_init_core_env
319
09888efe
KZ
320 return $res
321}
322
323function ts_finalize {
1b5417ac
KZ
324 for idx in $(seq 0 $((${#TS_SUID_PROGS[*]} - 1))); do
325 PROG=${TS_SUID_PROGS[$idx]}
326 chmod a-s $PROG &> /dev/null
327 chown ${TS_SUID_USER[$idx]}.${TS_SUID_GROUP[$idx]} $PROG &> /dev/null
328 done
329
09888efe 330 if [ $TS_NSUBTESTS -ne 0 ]; then
b8ab3744 331 printf "%11s..."
09888efe
KZ
332 if [ $TS_NSUBFAILED -ne 0 ]; then
333 ts_failed "$TS_NSUBFAILED from $TS_NSUBTESTS sub-tests"
334 else
335 ts_ok "all $TS_NSUBTESTS sub-tests PASSED"
336 fi
e83446da 337 fi
425ca40a
KZ
338
339 if [ -s $TS_EXPECTED ]; then
340 ts_gen_diff
341 if [ $? -eq 1 ]; then
342 ts_failed "$1"
343 fi
344 ts_ok "$1"
345 fi
346
09888efe 347 ts_skip "output undefined"
e83446da
KZ
348}
349
3dfa278e 350function ts_die {
57a917d6 351 ts_log "$1"
3dfa278e
KZ
352 if [ -n "$2" ] && [ -b "$2" ]; then
353 ts_device_deinit "$2"
c98825ac 354 ts_fstab_clean # for sure...
3dfa278e
KZ
355 fi
356 ts_finalize
357}
358
35c636e1
KZ
359function ts_image_md5sum {
360 local img=${1:-"$TS_OUTDIR/${TS_TESTNAME}.img"}
361 echo $(md5sum "$img" | awk '{printf $1}') $(basename "$img")
362}
05de8126 363
35c636e1
KZ
364function ts_image_init {
365 local mib=${1:-"5"} # size in MiBs
366 local img=${2:-"$TS_OUTDIR/${TS_TESTNAME}.img"}
367
368 dd if=/dev/zero of="$img" bs=1M count=$mib &> /dev/null
369 echo "$img"
370 return 0
371}
05de8126 372
35c636e1 373function ts_device_init {
5792255b 374 local img=$(ts_image_init $1 $2)
e2f092d3 375 local dev=$($TS_CMD_LOSETUP --show -f "$img")
df7e52d7 376
632830cc
KZ
377 if [ -z "$dev" ]; then
378 ts_device_deinit $dev
df7e52d7
KZ
379 return 1 # error
380 fi
381
632830cc 382 echo $dev
df7e52d7
KZ
383 return 0 # succes
384}
385
386function ts_device_deinit {
3dfa278e
KZ
387 local DEV="$1"
388
389 if [ -b "$DEV" ]; then
390 $TS_CMD_UMOUNT "$DEV" &> /dev/null
391 $TS_CMD_LOSETUP -d "$DEV" &> /dev/null
df7e52d7
KZ
392 fi
393}
064b8c38 394
3f5bda01 395function ts_uuid_by_devname {
283a8c15 396 echo $($TS_CMD_BLKID -p -s UUID -o value $1)
3f5bda01
KZ
397}
398
399function ts_label_by_devname {
283a8c15 400 echo $($TS_CMD_BLKID -p -s LABEL -o value $1)
3f5bda01
KZ
401}
402
403function ts_fstype_by_devname {
283a8c15 404 echo $($TS_CMD_BLKID -p -s TYPE -o value $1)
3f5bda01
KZ
405}
406
407function ts_device_has {
408 local TAG="$1"
409 local VAL="$2"
410 local DEV="$3"
3dfa278e 411 local vl=""
3f5bda01
KZ
412
413 case $TAG in
414 "TYPE") vl=$(ts_fstype_by_devname $DEV);;
415 "LABEL") vl=$(ts_label_by_devname $DEV);;
416 "UUID") vl=$(ts_uuid_by_devname $DEV);;
417 *) return 1;;
418 esac
419
420 if [ "$vl" == "$VAL" ]; then
421 return 0
422 fi
423 return 1
424}
3dfa278e
KZ
425
426function ts_device_has_uuid {
427 ts_uuid_by_devname "$1" | egrep -q '^[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}$'
428 return $?
429}
430
3ff2557c 431function ts_is_mounted {
6dfe6f0e 432 local DEV=$(ts_canonicalize "$1")
3ff2557c
KZ
433
434 grep -q $DEV /proc/mounts && return 0
435
436 if [ "${DEV#/dev/loop/}" != "$DEV" ]; then
437 return grep -q "/dev/loop${DEV#/dev/loop/}" /proc/mounts
438 fi
439 return 1
440}
441
c98825ac 442function ts_fstab_open {
601d12fb 443 echo "# <!-- util-linux test entry" >> /etc/fstab
c98825ac
KZ
444}
445
446function ts_fstab_close {
447 echo "# -->" >> /etc/fstab
448}
449
450function ts_fstab_addline {
451 local SPEC="$1"
452 local MNT=${2:-"$TS_MOUNTPOINT"}
453 local FS=${3:-"auto"}
b002d021 454 local OPT=${4:-"defaults"}
c98825ac 455
b002d021 456 echo "$SPEC $MNT $FS $OPT 0 0" >> /etc/fstab
c98825ac
KZ
457}
458
459function ts_fstab_add {
460 ts_fstab_open
b002d021 461 ts_fstab_addline $*
c98825ac
KZ
462 ts_fstab_close
463}
464
465function ts_fstab_clean {
466 sed --in-place "
601d12fb 467/# <!-- util-linux/!b
c98825ac
KZ
468:a
469/# -->/!{
470 N
471 ba
472}
601d12fb 473s/# <!-- util-linux.*-->//;
c98825ac
KZ
474/^$/d" /etc/fstab
475}
476
d0bcd9b3 477function ts_fdisk_clean {
e1fe1815 478 local DEVNAME=$1
618ec053 479
d0bcd9b3 480 # remove non comparable parts of fdisk output
618ec053 481 if [ x"${DEVNAME}" != x"" ]; then
e1fe1815 482 sed -i -e "s:${DEVNAME}:<removed>:g" $TS_OUTPUT
618ec053
KZ
483 fi
484
e1fe1815
KZ
485 sed -i -e 's/Disk identifier:.*/Disk identifier: <removed>/g' \
486 -e 's/Created a new.*/Created a new <removed>./g' \
487 -e 's/^Device[[:blank:]]*Start/Device Start/g' \
488 -e 's/^Device[[:blank:]]*Boot/Device Boot/g' \
489 -e 's/^Device[[:blank:]]*Flag/Device Flag/g' \
490 -e 's/Welcome to fdisk.*/Welcome to fdisk <removed>./g' \
d0bcd9b3
FC
491 $TS_OUTPUT
492}
618ec053
KZ
493
494function ts_scsi_debug_init {
495
496 modprobe --dry-run --quiet scsi_debug
497 [ "$?" == 0 ] || ts_skip "missing scsi_debug module"
498
499 rmmod scsi_debug &> /dev/null
500 modprobe scsi_debug $*
501 [ "$?" == 0 ] || ts_die "Cannot init device"
502
ef2c9e3f 503 DEVNAME=$(grep --with-filename scsi_debug /sys/block/*/device/model | awk -F '/' '{print $4}')
618ec053
KZ
504 [ "x${DEVNAME}" == "x" ] && ts_die "Cannot find device"
505
506 DEVICE="/dev/${DEVNAME}"
507
508 sleep 1
509 udevadm settle
510
511 echo $DEVICE
512}