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