]> git.ipfire.org Git - thirdparty/util-linux.git/blame - tests/functions.sh
mount: rewrite getfs_by_specdir() without mem leaks
[thirdparty/util-linux.git] / tests / functions.sh
CommitLineData
e83446da 1
5db4f8e3
KZ
2TS_OUTDIR="output"
3TS_DIFFDIR="diff"
4TS_EXPECTEDDIR="expected"
5TS_INPUTDIR="input"
57a917d6 6TS_VERBOSE="no"
e83446da 7
b30cd7ee
KZ
8function ts_skip {
9 echo " IGNORE ($1)"
3dfa278e
KZ
10 if [ -n "$2" ] && [ -b "$2" ]; then
11 ts_device_deinit "$2"
12 fi
b30cd7ee
KZ
13 exit 0
14}
15
09892fb6
KZ
16function ts_skip_nonroot {
17 if [ $UID != 0 ]; then
18 ts_skip "not root permissions"
19 fi
20}
21
05de8126
KZ
22function ts_failed {
23 if [ x"$1" == x"" ]; then
24 echo " FAILED ($TS_NAME)"
25 else
26 echo " FAILED ($1)"
27 fi
28 exit 1
29}
30
31function ts_ok {
32 if [ x"$1" == x"" ]; then
33 echo " OK"
34 else
35 echo " OK ($1)"
36 fi
37 exit 0
38}
39
57a917d6
KZ
40function ts_log {
41 echo "$1" >> $TS_OUTPUT
42 [ "$TS_VERBOSE" == "yes" ] && echo "$1"
43}
44
1d9acab1
KZ
45function ts_has_option {
46 NAME="$1"
47 ALL="$2"
48 echo -n $ALL | sed 's/ //g' | gawk 'BEGIN { FS="="; RS="--" } /('$NAME'$|'$NAME'=)/ { print "yes" }'
49}
50
e83446da 51function ts_init {
e9ce5ccc 52 export LANG="en_US.UTF-8":
e83446da
KZ
53 TS_NAME=$(basename $0)
54 if [ ! -d $TS_OUTDIR ]; then
55 mkdir -p $TS_OUTDIR
56 fi
57 if [ ! -d $TS_DIFFDIR ]; then
58 mkdir -p $TS_DIFFDIR
59 fi
1d9acab1
KZ
60
61 TS_VERBOSE=$( ts_has_option "verbose" "$*")
e83446da
KZ
62 TS_OUTPUT="$TS_OUTDIR/$TS_NAME"
63 TS_DIFF="$TS_DIFFDIR/$TS_NAME"
64 TS_EXPECTED="$TS_EXPECTEDDIR/$TS_NAME"
e9ce5ccc 65 TS_INPUT="$TS_INPUTDIR/$TS_NAME"
c98825ac 66 TS_MOUNTPOINT="$(pwd)/$TS_OUTDIR/${TS_NAME}_mnt"
66822df3
KZ
67 TS_BLKIDCACHE=""
68 TS_HAS_VOLUMEID="no"
69
70 ldd $TS_CMD_MOUNT | grep -q 'libvolume_id' &> /dev/null
71 if [ "$?" == "0" ]; then
72 TS_HAS_VOLUMEID="yes"
73 fi
74 if [ "$TS_HAS_VOLUMEID" != "yes" ]; then
75 if [ -f "/etc/blkid/blkid.tab" ]; then
76 TS_BLKIDCACHE="/etc/blkid/blkid.tab"
77 elif [ -f "/etc/blkid.tab" ]; then
78 TS_BLKIDCACHE="/etc/blkid.tab"
79 fi
80 fi
e83446da 81
97cdb3cb 82 rm -f $TS_OUTPUT
3dfa278e 83 touch $TS_OUTPUT
97cdb3cb 84
e83446da
KZ
85 printf "%15s: %-25s ..." "$TS_COMPONENT" "$TS_DESC"
86}
87
88function ts_finalize {
89 local res=0
90
91 if [ -s $TS_EXPECTED ]; then
92 if [ -s $TS_OUTPUT ]; then
93 diff -u $TS_EXPECTED $TS_OUTPUT > $TS_DIFF
94 if [ -s $TS_DIFF ]; then
95 res=1
96 fi
97 else
e9ce5ccc 98 res=1
e83446da 99 fi
97cdb3cb
KZ
100 else
101 echo " IGNORE (expected output undefined)"
102 exit 0
e83446da
KZ
103 fi
104 if [ $res -eq 0 ]; then
05de8126 105 ts_ok $1
e83446da 106 else
05de8126 107 ts_failed $1
e83446da
KZ
108 fi
109}
110
3dfa278e 111function ts_die {
57a917d6 112 ts_log "$1"
3dfa278e
KZ
113 if [ -n "$2" ] && [ -b "$2" ]; then
114 ts_device_deinit "$2"
c98825ac 115 ts_fstab_clean # for sure...
3dfa278e
KZ
116 fi
117 ts_finalize
118}
119
df7e52d7 120function ts_device_init {
3dfa278e
KZ
121 local IMAGE="$TS_OUTDIR/$TS_NAME.img"
122 local IMAGE_RE=$( echo "$IMAGE" | sed 's:/:\\/:g' )
123 local DEV=""
05de8126 124
66822df3
KZ
125 if [ "$TS_HAS_VOLUMEID" != "yes" ] && [ -f "$TS_BLKIDCACHE" ]; then
126 cp $TS_BLKIDCACHE $OUTDIR/$TS_NAME.cache
127 fi
128
df7e52d7 129 dd if=/dev/zero of="$IMAGE" bs=1M count=5 &> /dev/null
05de8126 130
df7e52d7 131 $TS_CMD_LOSETUP -f "$IMAGE" 2>&1 >> $TS_OUTPUT
3dfa278e 132 DEV=$( $TS_CMD_LOSETUP -a | gawk 'BEGIN {FS=":"} /'$IMAGE_RE'/ { print $1 }' )
df7e52d7 133
3dfa278e
KZ
134 if [ -z "$DEV" ]; then
135 ts_device_deinit $DEV
df7e52d7
KZ
136 return 1 # error
137 fi
138
3dfa278e 139 echo $DEV
df7e52d7
KZ
140 return 0 # succes
141}
142
143function ts_device_deinit {
3dfa278e
KZ
144 local DEV="$1"
145
146 if [ -b "$DEV" ]; then
147 $TS_CMD_UMOUNT "$DEV" &> /dev/null
148 $TS_CMD_LOSETUP -d "$DEV" &> /dev/null
66822df3
KZ
149 if [ "$TS_HAS_VOLUMEID" != "yes" ] && [ -f "$TS_BLKIDCACHE" ] && [ -s "$OUTDIR/$TS_NAME.cache" ]; then
150 # We have to remove the device from cache otherwise
151 # libblkid will reuse cached information. The cache
152 # refresh time is 2 seconds -- that's too long. We
153 # re-use the same device more quickly. --kzak
154 mv -f $OUTDIR/$TS_NAME.cache $TS_BLKIDCACHE
155 fi
df7e52d7
KZ
156 fi
157}
064b8c38 158
3dfa278e 159function ts_udev_dev_support {
66822df3 160 if [ "$TS_HAS_VOLUMEID" == "yes" ] && [ ! -L "/dev/disk/$1/$2" ]; then
064b8c38
KZ
161 return 1
162 fi
163 return 0
164}
165
3f5bda01
KZ
166function ts_uuid_by_devname {
167 local DEV="$1"
168 local UUID=""
169 if [ -x "$TS_ECMD_BLKID" ]; then
170 UUID=$($TS_ECMD_BLKID -c /dev/null -w /dev/null -s "UUID" $DEV | sed 's/.*UUID="//g; s/"//g')
171 elif [ -x "$TS_ECMD_VOLID" ]; then
172 UUID=$($TS_ECMD_VOLID -u $DEV)
173 fi
174 echo $UUID
175}
176
177function ts_label_by_devname {
178 local DEV="$1"
179 local TYPE=""
180 if [ -x "$TS_ECMD_BLKID" ]; then
181 LABEL=$($TS_ECMD_BLKID -c /dev/null -w /dev/null -s "LABEL" $DEV | sed 's/.*LABEL="//g; s/"//g')
182 elif [ -x "$TS_ECMD_VOLID" ]; then
183 LABEL=$($TS_ECMD_VOLID -l $DEV)
184 fi
185 echo $LABEL
186}
187
188function ts_fstype_by_devname {
189 local DEV="$1"
190 local TYPE=""
191 if [ -x "$TS_ECMD_BLKID" ]; then
192 TYPE=$($TS_ECMD_BLKID -c /dev/null -w /dev/null -s "TYPE" $DEV | sed 's/.*TYPE="//g; s/"//g')
193 elif [ -x "$TS_ECMD_VOLID" ]; then
194 TYPE=$($TS_ECMD_VOLID -t $DEV)
195 fi
196 echo $TYPE
197}
198
199function ts_device_has {
200 local TAG="$1"
201 local VAL="$2"
202 local DEV="$3"
3dfa278e 203 local vl=""
3f5bda01
KZ
204
205 case $TAG in
206 "TYPE") vl=$(ts_fstype_by_devname $DEV);;
207 "LABEL") vl=$(ts_label_by_devname $DEV);;
208 "UUID") vl=$(ts_uuid_by_devname $DEV);;
209 *) return 1;;
210 esac
211
212 if [ "$vl" == "$VAL" ]; then
213 return 0
214 fi
215 return 1
216}
3dfa278e
KZ
217
218function ts_device_has_uuid {
219 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}$'
220 return $?
221}
222
223function ts_swapoff {
224 local DEV="$1"
225
226 # swapoff doesn't exist in build tree
227 if [ ! -x "$TS_CMD_SWAPOFF" ]; then
228 ln -sf $TS_CMD_SWAPON $TS_CMD_SWAPOFF
229 REMSWAPOFF="true"
230 fi
231 $TS_CMD_SWAPOFF $DEV 2>&1 >> $TS_OUTPUT
232 if [ -n "$REMSWAPOFF" ]; then
233 rm -f $TS_CMD_SWAPOFF
234 fi
235}
c98825ac
KZ
236
237function ts_fstab_open {
238 echo "# <!-- util-linux-ng test entry" >> /etc/fstab
239}
240
241function ts_fstab_close {
242 echo "# -->" >> /etc/fstab
243}
244
245function ts_fstab_addline {
246 local SPEC="$1"
247 local MNT=${2:-"$TS_MOUNTPOINT"}
248 local FS=${3:-"auto"}
b002d021 249 local OPT=${4:-"defaults"}
c98825ac 250
b002d021 251 echo "$SPEC $MNT $FS $OPT 0 0" >> /etc/fstab
c98825ac
KZ
252}
253
254function ts_fstab_add {
255 ts_fstab_open
b002d021 256 ts_fstab_addline $*
c98825ac
KZ
257 ts_fstab_close
258}
259
260function ts_fstab_clean {
261 sed --in-place "
262/# <!-- util-linux-ng/!b
263:a
264/# -->/!{
265 N
266 ba
267}
268s/# <!-- util-linux-ng.*-->//;
269/^$/d" /etc/fstab
270}
271