tests: shorten factor's inordinately-long test file names
[platform/upstream/coreutils.git] / init.cfg
1 # This file is sourced by init.sh, *before* its initialization.
2
3 # Copyright (C) 2010-2012 Free Software Foundation, Inc.
4
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14
15 # You should have received a copy of the GNU General Public License
16 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18 # This goes hand in hand with the "exec 9>&2;" in tests/Makefile.am's
19 # TESTS_ENVIRONMENT definition.
20 stderr_fileno_=9
21
22 # Having an unsearchable directory in PATH causes execve to fail with EACCES
23 # when applied to an unresolvable program name, contrary to the desired ENOENT.
24 # Avoid the problem by rewriting PATH to exclude unsearchable directories.
25 # Also, if PATH lacks /sbin and/or /usr/sbin, append it/them.
26 sanitize_path_()
27 {
28   # FIXME: remove double quotes around $IFS when all tests use init.sh.
29   # They constitute a work-around for a bug in FreeBSD 8.1's /bin/sh.
30   local saved_IFS="$IFS"
31     IFS=:
32     set -- $PATH
33   IFS=$saved_IFS
34
35   local d d1
36   local colon=
37   local new_path=
38   for d in "$@"; do
39     test -z "$d" && d1=. || d1=$d
40     if ls -d "$d1/." > /dev/null 2>&1; then
41       new_path="$new_path$colon$d"
42       colon=':'
43     fi
44   done
45
46   for d in /sbin /usr/sbin ; do
47     case ":$new_path:" in
48       *:$d:*) ;;
49       *) new_path="$new_path:$d" ;;
50     esac
51   done
52
53   PATH=$new_path
54   export PATH
55 }
56
57 getlimits_()
58 {
59   eval $(getlimits)
60   test "$INT_MAX" || fatal_ "running getlimits"
61 }
62
63 require_acl_()
64 {
65   getfacl --version < /dev/null > /dev/null 2>&1 \
66     && setfacl --version < /dev/null > /dev/null 2>&1 \
67       || skip_ "This test requires getfacl and setfacl."
68
69   id -u bin > /dev/null 2>&1 \
70     || skip_ "This test requires a local user named bin."
71 }
72
73 is_local_dir_()
74 {
75   test $# = 1 || framework_failure_
76   df --local "$1" >/dev/null 2>&1
77 }
78
79 require_mount_list_()
80 {
81   local mount_list_fail='cannot read table of mounted file systems'
82   df 2>&1 | grep -F "$mount_list_fail" >/dev/null &&
83     skip_ "$mount_list_fail"
84 }
85
86 require_local_dir_()
87 {
88   require_mount_list_
89   is_local_dir_ . ||
90     skip_ "This test must be run on a local file system."
91 }
92
93 # Skip this test if we're not in SELinux "enforcing" mode.
94 require_selinux_enforcing_()
95 {
96   test "$(getenforce)" = Enforcing \
97     || skip_ "This test is useful only with SELinux in Enforcing mode."
98 }
99
100 require_openat_support_()
101 {
102   # Skip this test if your system has neither the openat-style functions
103   # nor /proc/self/fd support with which to emulate them.
104   test -z "$CONFIG_HEADER" \
105     && skip_ 'internal error: CONFIG_HEADER not defined'
106
107   _skip=yes
108   grep '^#define HAVE_OPENAT' "$CONFIG_HEADER" > /dev/null && _skip=no
109   test -d /proc/self/fd && _skip=no
110   if test $_skip = yes; then
111     skip_ 'this system lacks openat support'
112   fi
113 }
114
115 require_ulimit_()
116 {
117   local ulimit_works=yes
118   # Expect to be able to exec a program in 10MiB of virtual memory,
119   # (10MiB is usually plenty, but valgrind-wrapped date requires 19000KiB,
120   # so allow more in that case)
121   # but not in 20KiB.  I chose "date".  It must not be a shell built-in
122   # function, so you can't use echo, printf, true, etc.
123   # Of course, in coreutils, I could use $top_builddir/src/true,
124   # but this should be able to work for other projects, too.
125   local vm
126   case $(printenv LD_PRELOAD) in */valgrind/*) vm=22000;; *) vm=10000;; esac
127
128   ( ulimit -v $vm; date ) > /dev/null 2>&1 || ulimit_works=no
129   ( ulimit -v 20;  date ) > /dev/null 2>&1 && ulimit_works=no
130
131   test $ulimit_works = no \
132     && skip_ "this shell lacks ulimit support"
133 }
134
135 require_readable_root_()
136 {
137   test -r / || skip_ "/ is not readable"
138 }
139
140 # Skip the current test if strace is not available or doesn't work
141 # with the named syscall.  Usage: require_strace_ unlink
142 require_strace_()
143 {
144   test $# = 1 || framework_failure_
145
146   strace -V < /dev/null > /dev/null 2>&1 ||
147     skip_ 'no strace program'
148
149   strace -qe "$1" echo > /dev/null 2>&1 ||
150     skip_ 'strace -qe "'"$1"'" does not work'
151
152   # On some linux/sparc64 systems, strace works fine on 32-bit executables,
153   # but prints only one line of output for every 64-bit executable.
154   strace -o log-help ls --help >/dev/null || framework_failure_
155   n_lines_help=$(wc -l < log-help)
156   rm -f log-help
157   if test $n_lines_help = 0 || test $n_lines_help = 1; then
158     skip_ 'strace produces no more than one line of output'
159   fi
160 }
161
162 # Skip the current test if valgrind doesn't work.
163 require_valgrind_()
164 {
165   valgrind --help >/dev/null || skip_ "requires valgrind"
166 }
167
168 require_setfacl_()
169 {
170   setfacl -m user::rwx . \
171     || skip_ "setfacl does not work on the current file system"
172 }
173
174 # Require a controlling input 'terminal'.
175 require_controlling_input_terminal_()
176 {
177   tty -s || have_input_tty=no
178   test -t 0 || have_input_tty=no
179   if test "$have_input_tty" = no; then
180     skip_ 'requires controlling input terminal
181 This test must have a controlling input "terminal", so it may not be
182 run via "batch", "at", or "ssh".  On some systems, it may not even be
183 run in the background.'
184   fi
185 }
186
187 require_built_()
188 {
189   skip_=no
190   for i in "$@"; do
191     case " $built_programs " in
192       *" $i "*) ;;
193       *) echo "$i: not built" 1>&2; skip_=yes ;;
194     esac
195   done
196
197   test $skip_ = yes && skip_ "required program(s) not built"
198 }
199
200 require_file_system_bytes_free_()
201 {
202   local req=$1
203   local expr=$(stat -f --printf "$req / %S <= %a" .)
204   $AWK "BEGIN{ exit !($expr) }" \
205     || skip_ "this test needs at least $req bytes of free space"
206 }
207
208 uid_is_privileged_()
209 {
210   # Make sure id -u succeeds.
211   my_uid=$(id -u) \
212     || { echo "$0: cannot run 'id -u'" 1>&2; return 1; }
213
214   # Make sure it gives valid output.
215   case $my_uid in
216     0) ;;
217     *[!0-9]*)
218       echo "$0: invalid output ('$my_uid') from 'id -u'" 1>&2
219       return 1 ;;
220     *) return 1 ;;
221   esac
222 }
223
224 get_process_status_()
225 {
226   sed -n '/^State:[      ]*\([[:alpha:]]\).*/s//\1/p' /proc/$1/status
227 }
228
229 # Convert an ls-style permission string, like drwxr----x and -rw-r-x-wx
230 # to the equivalent chmod --mode (-m) argument, (=,u=rwx,g=r,o=x and
231 # =,u=rw,g=rx,o=wx).  Ignore ACLs.
232 rwx_to_mode_()
233 {
234   case $# in
235     1) rwx=$1;;
236     *) echo "$0: wrong number of arguments" 1>&2
237       echo "Usage: $0 ls-style-mode-string" 1>&2
238       return;;
239   esac
240
241   case $rwx in
242     [ld-][rwx-][rwx-][rwxsS-][rwx-][rwx-][rwxsS-][rwx-][rwx-][rwxtT-]) ;;
243     [ld-][rwx-][rwx-][rwxsS-][rwx-][rwx-][rwxsS-][rwx-][rwx-][rwxtT-][+.]) ;;
244     *) echo "$0: invalid mode string: $rwx" 1>&2; return;;
245   esac
246
247   # Perform these conversions:
248   # S  s
249   # s  xs
250   # T  t
251   # t  xt
252   # The 'T' and 't' ones are only valid for 'other'.
253   s='s/S/@/;s/s/x@/;s/@/s/'
254   t='s/T/@/;s/t/x@/;s/@/t/'
255
256   u=$(echo $rwx|sed 's/^.\(...\).*/,u=\1/;s/-//g;s/^,u=$//;'$s)
257   g=$(echo $rwx|sed 's/^....\(...\).*/,g=\1/;s/-//g;s/^,g=$//;'$s)
258   o=$(echo $rwx|sed 's/^.......\(...\).*/,o=\1/;s/-//g;s/^,o=$//;'$s';'$t)
259   echo "=$u$g$o"
260 }
261
262 # Set the global variable stty_reversible_ to a space-separated list of the
263 # reversible settings from stty.c.  stty_reversible_ also starts and ends
264 # with a space.
265 stty_reversible_init_()
266 {
267   # Pad start with one space for the first option to match in query function.
268   stty_reversible_=' '$(perl -lne '/^ *{"(.*?)",.*\bREV\b/ and print $1' \
269     "$abs_top_srcdir"/src/stty.c | tr '\n' ' ')
270   # Ensure that there are at least 62, i.e., so we're alerted if
271   # reformatting the source empties the list.
272   test 62 -le $(echo "$stty_reversible_"|wc -w)  \
273     || framework_failure_ "too few reversible settings"
274 }
275
276 # Test whether $1 is one of stty's reversible options.
277 stty_reversible_query_()
278 {
279   case $stty_reversible_ in
280     '')
281       framework_failure_ "stty_reversible_init_() not called?";;
282     *" $1 "*)
283       return 0;;
284     *)
285       return 1;;
286   esac
287 }
288
289 skip_if_()
290 {
291   case $1 in
292     root) skip_ must be run as root ;;
293     non-root) skip_ must be run as non-root ;;
294     *) ;;  # FIXME?
295   esac
296 }
297
298 require_selinux_()
299 {
300   # When in a chroot of an SELinux-enabled system, but with a mock-simulated
301   # SELinux-*disabled* system, recognize that SELinux is disabled system wide:
302   grep 'selinuxfs$' /proc/filesystems > /dev/null \
303     || skip_ "this system lacks SELinux support"
304
305   # Independent of whether SELinux is enabled system-wide,
306   # the current file system may lack SELinux support.
307   case $(ls -Zd .) in
308     '? .'|'unlabeled .')
309       skip_ "this system (or maybe just" \
310         "the current file system) lacks SELinux support"
311     ;;
312   esac
313 }
314
315 very_expensive_()
316 {
317   if test "$RUN_VERY_EXPENSIVE_TESTS" != yes; then
318     skip_ 'very expensive: disabled by default
319 This test is very expensive, so it is disabled by default.
320 To run it anyway, rerun make check with the RUN_VERY_EXPENSIVE_TESTS
321 environment variable set to yes.  E.g.,
322
323   env RUN_VERY_EXPENSIVE_TESTS=yes make check
324
325 or use the shortcut target of the toplevel Makefile,
326
327   make check-very-expensive
328 '
329   fi
330 }
331
332 expensive_()
333 {
334   if test "$RUN_EXPENSIVE_TESTS" != yes; then
335     skip_ 'expensive: disabled by default
336 This test is relatively expensive, so it is disabled by default.
337 To run it anyway, rerun make check with the RUN_EXPENSIVE_TESTS
338 environment variable set to yes.  E.g.,
339
340   env RUN_EXPENSIVE_TESTS=yes make check
341
342 or use the shortcut target of the toplevel Makefile,
343
344   make check-expensive
345 '
346   fi
347 }
348
349 # Test whether we can run our just-built rm setuidgid-to-root,
350 # i.e., that $NON_ROOT_USERNAME has access to the build directory.
351 setuidgid_has_perm_()
352 {
353   local rm_version=$(
354     setuidgid $NON_ROOT_USERNAME env PATH="$PATH" rm --version |
355     sed -n 'ls/.* //p'
356   )
357   case ":$rm_version:" in
358       :$PACKAGE_VERSION:) ;;
359       *) return 1;;
360   esac
361 }
362
363 require_root_()
364 {
365   uid_is_privileged_ || skip_ "must be run as root"
366   NON_ROOT_USERNAME=${NON_ROOT_USERNAME=nobody}
367   NON_ROOT_GROUP=${NON_ROOT_GROUP=$(id -g $NON_ROOT_USERNAME)}
368
369   # When the current test invokes setuidgid, call setuidgid_has_perm_
370   # to check for a common problem.
371   grep '^[ ]*setuidgid' "../$0" \
372     && { setuidgid_has_perm_ \
373            || skip_ "user $NON_ROOT_USERNAME lacks execute permissions"; }
374 }
375
376 skip_if_root_() { uid_is_privileged_ && skip_ "must be run as non-root"; }
377
378 # Set 'groups' to a space-separated list of at least two groups
379 # of which the user is a member.
380 require_membership_in_two_groups_()
381 {
382   test $# = 0 || framework_failure_
383
384   groups=${COREUTILS_GROUPS-$( (id -G || /usr/xpg4/bin/id -G) 2>/dev/null)}
385   case "$groups" in
386     *' '*) ;;
387     *) skip_ 'requires membership in two groups
388 this test requires that you be a member of more than one group,
389 but running 'id -G'\'' either failed or found just one.  If you really
390 are a member of at least two groups, then rerun this test with
391 COREUTILS_GROUPS set in your environment to the space-separated list
392 of group names or numbers.  E.g.,
393
394   env COREUTILS_GROUPS='\''users cdrom'\'' make check
395
396 '
397      ;;
398   esac
399 }
400
401 # Is /proc/$PID/status supported?
402 require_proc_pid_status_()
403 {
404     sleep 2 &
405     local pid=$!
406     sleep .5
407     grep '^State:[       ]*[S]' /proc/$pid/status > /dev/null 2>&1 ||
408     skip_ "/proc/$pid/status: missing or 'different'"
409     kill $pid
410 }
411
412 # Return nonzero if the specified path is on a file system for
413 # which FIEMAP support exists.  Note some file systems (like ext3 and btrfs)
414 # only support FIEMAP for files, not directories.
415 fiemap_capable_()
416 {
417   if ! python < /dev/null; then
418     warn_ 'fiemap_capable_: python missing: assuming not fiemap capable'
419     return 1
420   fi
421   python "$abs_srcdir"/tests/fiemap-capable "$@"
422 }
423
424 # Skip the current test if "." lacks d_type support.
425 require_dirent_d_type_()
426 {
427   python < /dev/null \
428     || skip_ python missing: assuming no d_type support
429
430   # Manually exclude xfs, since the test would mistakenly report
431   # that it has d_type support: d_type == DT_DIR for "." and "..",
432   # but DT_UNKNOWN for all other types.
433   df -x xfs . > /dev/null 2>&1 \
434     || skip_ requires d_type support
435
436   python "$abs_srcdir"/tests/d_type-check \
437     || skip_ requires d_type support
438 }
439
440 # Skip the current test if we lack Perl.
441 require_perl_()
442 {
443   : ${PERL=perl}
444   $PERL -e 'use warnings' > /dev/null 2>&1 \
445     || skip_ 'configure did not find a usable version of Perl'
446 }
447
448 # Does the current (working-dir) file system support sparse files?
449 require_sparse_support_()
450 {
451   test $# = 0 || framework_failure_
452   # Test whether we can create a sparse file.
453   # For example, on Darwin6.5 with a file system of type hfs, it's not possible.
454   # NTFS requires 128K before a hole appears in a sparse file.
455   t=sparse.$$
456   dd bs=1 seek=128K of=$t < /dev/null 2> /dev/null
457   set x $(du -sk $t)
458   kb_size=$2
459   rm -f $t
460   if test $kb_size -ge 128; then
461     skip_ 'this file system does not support sparse files'
462   fi
463 }
464
465 mkfifo_or_skip_()
466 {
467   test $# = 1 || framework_failure_
468   if ! mkfifo "$1"; then
469     # Make an exception of this case -- usually we interpret framework-creation
470     # failure as a test failure.  However, in this case, when running on a SunOS
471     # system using a disk NFS mounted from OpenBSD, the above fails like this:
472     # mkfifo: cannot make fifo 'fifo-10558': Not owner
473     skip_ 'unable to create a fifo'
474   fi
475 }
476
477 # Disable the current test if the working directory seems to have
478 # the setgid bit set.
479 skip_if_setgid_()
480 {
481   setgid_tmpdir=setgid-$$
482   (umask 77; mkdir $setgid_tmpdir)
483   perms=$(stat --printf %A $setgid_tmpdir)
484   rmdir $setgid_tmpdir
485   case $perms in
486     drwx------);;
487     drwxr-xr-x);;  # Windows98 + DJGPP 2.03
488     *) skip_ 'this directory has the setgid bit set';;
489   esac
490 }
491
492 skip_if_mcstransd_is_running_()
493 {
494   test $# = 0 || framework_failure_
495
496   # When mcstransd is running, you'll see only the 3-component
497   # version of file-system context strings.  Detect that,
498   # and if it's running, skip this test.
499   __ctx=$(stat --printf='%C\n' .) || framework_failure_
500   case $__ctx in
501     *:*:*:*) ;; # four components is ok
502     *) # anything else probably means mcstransd is running
503         skip_ "unexpected context '$__ctx'; turn off mcstransd" ;;
504   esac
505 }
506
507 # Skip the current test if umask doesn't work as usual.
508 # This test should be run in the temporary directory that ends
509 # up being removed via the trap commands.
510 working_umask_or_skip_()
511 {
512   umask 022
513   touch file1 file2
514   chmod 644 file2
515   perms=$(ls -l file1 file2 | sed 's/ .*//' | uniq)
516   rm -f file1 file2
517
518   case $perms in
519   *'
520   '*) skip_ 'your build directory has unusual umask semantics'
521   esac
522 }
523
524 # Retry a function requiring a sufficient delay to _pass_
525 # using a truncated exponential backoff method.
526 #     Example: retry_delay_ dd_reblock_1 .1 6
527 # This example will call the dd_reblock_1 function with
528 # an initial delay of .1 second and call it at most 6 times
529 # with a max delay of 3.2s (doubled each time), or a total of 6.3s
530 # Note ensure you do _not_ quote the parameter to GNU sleep in
531 # your function, as it may contain separate values that sleep
532 # needs to accumulate.
533 retry_delay_()
534 {
535   local test_func=$1
536   local init_delay=$2
537   local max_n_tries=$3
538
539   local attempt=1
540   local num_sleeps=$attempt
541   local time_fail
542   while test $attempt -le $max_n_tries; do
543     local delay=$($AWK -v n=$num_sleeps -v s="$init_delay" \
544                   'BEGIN { print s * n }')
545     "$test_func" "$delay" && { time_fail=0; break; } || time_fail=1
546     attempt=$(expr $attempt + 1)
547     num_sleeps=$(expr $num_sleeps '*' 2)
548   done
549   test "$time_fail" = 0
550 }
551
552 # Call this with a list of programs under test immediately after
553 # sourcing init.sh.
554 print_ver_()
555 {
556   if test "$VERBOSE" = yes; then
557     local i
558     for i in $*; do
559       env $i --version
560     done
561   fi
562 }
563
564 # Are we running on GNU/Hurd?
565 require_gnu_()
566 {
567   test "$(uname)" = GNU \
568     || skip_ 'not running on GNU/Hurd'
569 }
570
571 sanitize_path_