summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2015-01-13 03:30:33 +0000
committerPádraig Brady <P@draigBrady.com>2015-01-14 12:20:32 +0000
commit58cff8a009ed9b8280c5f35074cef97231286023 (patch)
tree771e8b3fa70fab99b548790931803b75dd272603
parent924b1cadff3f2782475516d7eca9aabe856dbf0f (diff)
downloadcoreutils-58cff8a009ed9b8280c5f35074cef97231286023.tar.xz
tests: add extra protection against unexpected exits
Many tests use `program ... && fail=1` to ensure expected error situations are indicated. However that would mask an unexpected exit (like a crash). Therefore explicitly check the expected exit code. Note where error messages are also verified, the extra protection is not added. * tests/init.sh (returns_): A new helper function to check the return code of a command, and used throughout the tests. * cfg.mk (sc_prohibit_and_fail_1): Add a syntax check to avoid new instances of this issue.
-rw-r--r--cfg.mk11
-rwxr-xr-xtests/chmod/octal.sh6
-rwxr-xr-xtests/chmod/umask-x.sh2
-rwxr-xr-xtests/chmod/usage.sh4
-rwxr-xr-xtests/chown/basic.sh2
-rwxr-xr-xtests/chown/separator.sh2
-rwxr-xr-xtests/cp/cp-HL.sh2
-rwxr-xr-xtests/cp/cp-a-selinux.sh15
-rwxr-xr-xtests/cp/cp-i.sh2
-rwxr-xr-xtests/cp/cp-parents.sh2
-rwxr-xr-xtests/cp/dir-vs-file.sh2
-rwxr-xr-xtests/cp/fail-perm.sh2
-rwxr-xr-xtests/cp/no-ctx.sh2
-rwxr-xr-xtests/cp/reflink-auto.sh2
-rwxr-xr-xtests/cp/sparse.sh4
-rwxr-xr-xtests/dd/misc.sh10
-rwxr-xr-xtests/dd/nocache.sh4
-rwxr-xr-xtests/dd/stderr.sh4
-rwxr-xr-xtests/df/no-mtab-status.sh26
-rwxr-xr-xtests/df/skip-rootfs.sh2
-rwxr-xr-xtests/du/deref.sh2
-rwxr-xr-xtests/id/context.sh7
-rwxr-xr-xtests/id/gnu-zero-uids.sh2
-rwxr-xr-xtests/id/uid.sh2
-rwxr-xr-xtests/id/zero.sh6
-rwxr-xr-xtests/init.sh13
-rwxr-xr-xtests/install/basic-1.sh4
-rwxr-xr-xtests/install/install-C.sh4
-rwxr-xr-xtests/install/strip-program.sh2
-rwxr-xr-xtests/ln/misc.sh8
-rwxr-xr-xtests/ln/slash-decorated-nonexistent-dest.sh2
-rwxr-xr-xtests/ls/dangle.sh12
-rwxr-xr-xtests/ls/follow-slink.sh4
-rwxr-xr-xtests/ls/stat-failed.sh4
-rwxr-xr-xtests/misc/cat-self.sh2
-rwxr-xr-xtests/misc/chcon-fail.sh8
-rwxr-xr-xtests/misc/chroot-credentials.sh7
-rwxr-xr-xtests/misc/close-stdout.sh16
-rwxr-xr-xtests/misc/cut-huge-range.sh4
-rwxr-xr-xtests/misc/env.sh2
-rwxr-xr-xtests/misc/false-status.sh8
-rwxr-xr-xtests/misc/md5sum-bsd.sh6
-rwxr-xr-xtests/misc/nproc-positive.sh2
-rwxr-xr-xtests/misc/pathchk1.sh10
-rwxr-xr-xtests/misc/printf.sh14
-rwxr-xr-xtests/misc/realpath.sh12
-rwxr-xr-xtests/misc/selinux.sh2
-rwxr-xr-xtests/misc/shred-remove.sh4
-rwxr-xr-xtests/misc/sort-compress-proc.sh5
-rwxr-xr-xtests/misc/sort-exit-early.sh8
-rwxr-xr-xtests/misc/stat-hyphen.sh2
-rwxr-xr-xtests/misc/stat-slash.sh2
-rwxr-xr-xtests/misc/stty-invalid.sh6
-rwxr-xr-xtests/misc/stty.sh6
-rwxr-xr-xtests/misc/tr-case-class.sh10
-rwxr-xr-xtests/misc/truncate-dir-fail.sh2
-rwxr-xr-xtests/misc/truncate-overflow.sh6
-rwxr-xr-xtests/misc/truncate-parameters.sh12
-rwxr-xr-xtests/misc/truncate-relative.sh8
-rwxr-xr-xtests/misc/wc-parallel.sh3
-rwxr-xr-xtests/mkdir/p-3.sh3
-rwxr-xr-xtests/mkdir/parents.sh2
-rwxr-xr-xtests/mkdir/perm.sh2
-rwxr-xr-xtests/mkdir/special-1.sh2
-rwxr-xr-xtests/mv/childproof.sh8
-rwxr-xr-xtests/mv/dir-file.sh4
-rwxr-xr-xtests/mv/hardlink-case.sh2
-rwxr-xr-xtests/mv/into-self-4.sh2
-rwxr-xr-xtests/mv/mv-n.sh2
-rwxr-xr-xtests/mv/no-target-dir.sh8
-rwxr-xr-xtests/mv/part-rename.sh6
-rwxr-xr-xtests/mv/trailing-slash.sh4
-rwxr-xr-xtests/readlink/can-e.sh26
-rwxr-xr-xtests/readlink/can-f.sh38
-rwxr-xr-xtests/readlink/can-m.sh2
-rwxr-xr-xtests/readlink/multi.sh4
-rwxr-xr-xtests/readlink/rl-1.sh6
-rwxr-xr-xtests/rm/i-no-r.sh2
-rwxr-xr-xtests/rm/no-give-up.sh4
-rwxr-xr-xtests/rm/r-4.sh4
-rwxr-xr-xtests/rm/r-root.sh12
-rwxr-xr-xtests/rm/rm4.sh2
-rwxr-xr-xtests/rm/sunos-1.sh2
-rwxr-xr-xtests/rmdir/fail-perm.sh2
-rwxr-xr-xtests/split/additional-suffix.sh2
-rwxr-xr-xtests/split/fail.sh26
-rwxr-xr-xtests/split/filter.sh2
-rwxr-xr-xtests/split/guard-input.sh8
-rwxr-xr-xtests/split/numeric.sh6
-rwxr-xr-xtests/split/suffix-auto-length.sh2
-rwxr-xr-xtests/split/suffix-length.sh2
-rwxr-xr-xtests/touch/no-dereference.sh4
-rwxr-xr-xtests/touch/trailing-slash.sh20
93 files changed, 307 insertions, 259 deletions
diff --git a/cfg.mk b/cfg.mk
index 91045b852..70ca2e5dd 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -377,6 +377,17 @@ sc_prohibit_fail_0:
halt='fail=0 initialization' \
$(_sc_search_regexp)
+# Ensure that tests don't use `cmd ... && fail=1` as that hides crashes.
+# The "exclude" expression allows common idioms like `test ... && fail=1`
+# and the 2>... portion allows commands that redirect stderr and so probably
+# independently check its contents and thus detect any crash messages.
+sc_prohibit_and_fail_1:
+ @prohibit='&& fail=1' \
+ exclude='(stat|kill|test |EGREP|grep|env|2> *[^/])' \
+ halt='&& fail=1 detected. Please use: returns_ 1 ... || fail=1' \
+ in_vc_files='^tests/' \
+ $(_sc_search_regexp)
+
# The mode part of a setfacl -m option argument must be three bytes long.
# I.e., an argument of user:bin:rw or user:bin:r will make Solaris 10's
# setfacl reject it with: "Unrecognized character found in mode field".
diff --git a/tests/chmod/octal.sh b/tests/chmod/octal.sh
index 6f47a076c..23d0542f7 100755
--- a/tests/chmod/octal.sh
+++ b/tests/chmod/octal.sh
@@ -22,8 +22,8 @@ print_ver_ chmod
# Before coreutils-5.92, this would mistakenly succeed,
# and act like 'chmod 0 .'.
-chmod 0-followed-by-anything . 2> /dev/null && fail=1
-chmod 7-followed-by-anything . 2> /dev/null && fail=1
-chmod 8 . 2> /dev/null && fail=1
+for mode in '0-anything' '7-anything' '8'; do
+ returns_ 1 chmod "$mode" . 2>/dev/null || fail=1
+done
Exit $fail
diff --git a/tests/chmod/umask-x.sh b/tests/chmod/umask-x.sh
index 85b087d05..f31452a3c 100755
--- a/tests/chmod/umask-x.sh
+++ b/tests/chmod/umask-x.sh
@@ -21,6 +21,6 @@ print_ver_ chmod
touch file
chmod 755 file
-(umask 77 && chmod -x file) 2>/dev/null && fail=1
+(umask 77 && returns_ 1 chmod -x file) 2>/dev/null || fail=1
Exit $fail
diff --git a/tests/chmod/usage.sh b/tests/chmod/usage.sh
index 133115233..ac6d635ab 100755
--- a/tests/chmod/usage.sh
+++ b/tests/chmod/usage.sh
@@ -67,7 +67,7 @@ for case in $cases; do
case $files in
'')
touch -- $all_files || framework_failure_
- chmod $args 2>/dev/null && fail=1
+ returns_ 1 chmod $args 2>/dev/null || fail=1
;;
?*)
touch -- $files || framework_failure_
@@ -77,7 +77,7 @@ for case in $cases; do
# chmod has a bug if it succeeds even though $file is absent.
rm -f -- $all_files && touch -- $files && rm -- $file \
|| framework_failure_
- chmod $args 2>/dev/null && fail=1
+ returns_ 1 chmod $args 2>/dev/null || fail=1
done
;;
esac
diff --git a/tests/chown/basic.sh b/tests/chown/basic.sh
index 3eee15694..e57b9c890 100755
--- a/tests/chown/basic.sh
+++ b/tests/chown/basic.sh
@@ -34,7 +34,7 @@ printf "ownership of 'f' retained as $(id -nu)\n" > exp
compare exp out || fail=1
# Ensure diagnostics work for non existent files.
-chown -v 0 nf > out && fail=1
+returns_ 1 chown -v 0 nf > out || fail=1
printf "failed to change ownership of 'nf' to 0\n" > exp
compare exp out || fail=1
diff --git a/tests/chown/separator.sh b/tests/chown/separator.sh
index 815533036..642b00238 100755
--- a/tests/chown/separator.sh
+++ b/tests/chown/separator.sh
@@ -59,7 +59,7 @@ for u in $id_u "$id_un" ''; do
esac
for sep in $seps; do
case $u$sep$g in
- [0-9]*$sep) chown "$u$sep$g" . 2> /dev/null && fail=1 ;;
+ [0-9]*$sep) returns_ 1 chown "$u$sep$g" . 2>/dev/null || fail=1 ;;
*) chown "$u$sep$g" . || fail=1 ;;
esac
done
diff --git a/tests/cp/cp-HL.sh b/tests/cp/cp-HL.sh
index fa9832537..08a72b13a 100755
--- a/tests/cp/cp-HL.sh
+++ b/tests/cp/cp-HL.sh
@@ -33,7 +33,7 @@ test -d dest-dir/src-dir || fail=1
cat dest-dir/slink > /dev/null 2>&1 || fail=1
# Expect this to fail since *this* slink is a dangling symlink.
-cat dest-dir/src-dir/slink > /dev/null 2>&1 && fail=1
+returns_ 1 cat dest-dir/src-dir/slink >/dev/null 2>&1 || fail=1
# FIXME: test -L, too.
diff --git a/tests/cp/cp-a-selinux.sh b/tests/cp/cp-a-selinux.sh
index 2ecbd2386..d000ee8f1 100755
--- a/tests/cp/cp-a-selinux.sh
+++ b/tests/cp/cp-a-selinux.sh
@@ -49,14 +49,16 @@ rm -f f
# in the destination, so SELinux contexts should be updated too.
chmod o+rw restore/existing_dir
mkdir -p backup/existing_dir/ || framework_failure_
-ls -Zd backup/existing_dir | grep $ctx && framework_failure_
+ls -Zd backup/existing_dir > ed_ctx || fail=1
+grep $ctx ed_ctx && framework_failure_
touch backup/existing_dir/file || framework_failure_
chcon $ctx backup/existing_dir/file || framework_failure_
# Set the dir context to ensure it is reset
mkdir -p --context="$ctx" restore/existing_dir || framework_failure_
# Copy and ensure existing directories updated
cp -a backup/. restore/
-ls -Zd restore/existing_dir | grep $ctx &&
+ls -Zd restore/existing_dir > ed_ctx || fail=1
+grep $ctx ed_ctx &&
{ ls -lZd restore/existing_dir; fail=1; }
# Check restorecon (-Z) functionality for file and directory
@@ -175,6 +177,7 @@ for no_g_cmd in '' 'rm -f g'; do
# restorecon equivalent. Note even though the context
# returned from matchpathcon() will not match $ctx
# the resulting ENOTSUP warning will be suppressed.
+
# With absolute path
$no_g_cmd
cp -Z ../f $(realpath g) || fail=1
@@ -186,7 +189,7 @@ for no_g_cmd in '' 'rm -f g'; do
cp -Z -a ../f g || fail=1
# -Z doesn't take an arg
$no_g_cmd
- cp -Z "$ctx" ../f g && fail=1
+ returns_ 1 cp -Z "$ctx" ../f g || fail=1
# Explicit context
$no_g_cmd
@@ -198,8 +201,8 @@ for no_g_cmd in '' 'rm -f g'; do
done
# Mutually exclusive options
-cp -Z --preserve=context ../f g && fail=1
-cp --preserve=context -Z ../f g && fail=1
-cp --preserve=context --context="$ctx" ../f g && fail=1
+returns_ 1 cp -Z --preserve=context ../f g || fail=1
+returns_ 1 cp --preserve=context -Z ../f g || fail=1
+returns_ 1 cp --preserve=context --context="$ctx" ../f g || fail=1
Exit $fail
diff --git a/tests/cp/cp-i.sh b/tests/cp/cp-i.sh
index d9d805116..e74141307 100755
--- a/tests/cp/cp-i.sh
+++ b/tests/cp/cp-i.sh
@@ -60,6 +60,6 @@ echo n | cp -vnf c d 2>/dev/null > out7 || fail=1
compare out7 out_empty || fail=1
# options --backup and --no-clobber are mutually exclusive
-cp -bn c d 2>/dev/null && fail=1
+returns_ 1 cp -bn c d 2>/dev/null || fail=1
Exit $fail
diff --git a/tests/cp/cp-parents.sh b/tests/cp/cp-parents.sh
index 4814d6557..f0454f714 100755
--- a/tests/cp/cp-parents.sh
+++ b/tests/cp/cp-parents.sh
@@ -42,7 +42,7 @@ test -d d/a/b/c || fail=1
# With 6.7 and earlier, cp --parents f/g d would mistakenly create a
# directory d/f, even though f is a regular file.
-cp --parents f/g d 2>/dev/null && fail=1
+returns_ 1 cp --parents f/g d 2>/dev/null || fail=1
test -d d/f && fail=1
# Check that re_protect works.
diff --git a/tests/cp/dir-vs-file.sh b/tests/cp/dir-vs-file.sh
index 826d9bce0..8ac159c04 100755
--- a/tests/cp/dir-vs-file.sh
+++ b/tests/cp/dir-vs-file.sh
@@ -24,7 +24,7 @@ touch file || framework_failure_
# In 4.0.35, this cp invocation silently succeeded.
-cp -R dir file 2>/dev/null && fail=1
+returns_ 1 cp -R dir file 2>/dev/null || fail=1
# Make sure file is not replaced with a directory.
# In 4.0.35, it was.
diff --git a/tests/cp/fail-perm.sh b/tests/cp/fail-perm.sh
index abc5e4ebe..6a9cc8804 100755
--- a/tests/cp/fail-perm.sh
+++ b/tests/cp/fail-perm.sh
@@ -27,7 +27,7 @@ chmod u=rx,go=,-st D || framework_failure_
# This is expected to exit non-zero, because it can't read D/a.
-cp -pR D DD > /dev/null 2>&1 && fail=1
+returns_ 1 cp -pR D DD > /dev/null 2>&1 || fail=1
# Permissions on DD must be 'dr-x------'
diff --git a/tests/cp/no-ctx.sh b/tests/cp/no-ctx.sh
index 3cae58314..19d68b8ff 100755
--- a/tests/cp/no-ctx.sh
+++ b/tests/cp/no-ctx.sh
@@ -57,7 +57,7 @@ LD_PRELOAD=./k.so cp -a file_src file_dst || fail=1
# ENODATA should give an immediate error when required to preserve ctx
# This is debatable, and maybe we should not fail when no context available?
-LD_PRELOAD=./k.so cp --preserve=context file_src file_dst && fail=1
+LD_PRELOAD=./k.so returns_ 1 cp --preserve=context file_src file_dst || fail=1
test -e preloaded || skip_ 'LD_PRELOAD interception failed'
diff --git a/tests/cp/reflink-auto.sh b/tests/cp/reflink-auto.sh
index 666620879..b0464a2eb 100755
--- a/tests/cp/reflink-auto.sh
+++ b/tests/cp/reflink-auto.sh
@@ -27,7 +27,7 @@ rm -f "$a_other" || framework_failure_
echo non_zero_size > "$a_other" || framework_failure_
# we shouldn't be able to reflink() files on separate partitions
-cp --reflink "$a_other" b && fail=1
+returns_ 1 cp --reflink "$a_other" b || fail=1
# --reflink=auto should fall back to a normal copy
cp --reflink=auto "$a_other" b || fail=1
diff --git a/tests/cp/sparse.sh b/tests/cp/sparse.sh
index 3d6fb5876..958de8306 100755
--- a/tests/cp/sparse.sh
+++ b/tests/cp/sparse.sh
@@ -34,8 +34,8 @@ cp --sparse=always sparse copy || fail=1
test $(stat --printf %b copy) -le $(stat --printf %b sparse) || fail=1
# Ensure that --sparse={always,never} with --reflink fail.
-cp --sparse=always --reflink sparse copy && fail=1
-cp --sparse=never --reflink sparse copy && fail=1
+returns_ 1 cp --sparse=always --reflink sparse copy || fail=1
+returns_ 1 cp --sparse=never --reflink sparse copy || fail=1
# Ensure we handle sparse/non-sparse transitions correctly
diff --git a/tests/dd/misc.sh b/tests/dd/misc.sh
index 59f0f50a7..2a536e8d7 100755
--- a/tests/dd/misc.sh
+++ b/tests/dd/misc.sh
@@ -40,7 +40,7 @@ dd status=noxfer status=none if=$tmp_in of=/dev/null 2> err || fail=1
compare /dev/null err || fail=1
# check later status=noxfer overrides earlier status=none
dd status=none status=noxfer if=$tmp_in of=/dev/null 2> err || fail=1
-compare /dev/null err && fail=1
+test -s err || fail=1
dd if=$tmp_in of=$tmp_out 2> /dev/null || fail=1
compare $tmp_in $tmp_out || fail=1
@@ -61,12 +61,12 @@ case $(cat /dev/stdin <$tmp_in 2>/dev/null) in
esac
if dd iflag=nofollow if=$tmp_in count=0 2> /dev/null; then
- dd iflag=nofollow if=$tmp_sym count=0 2> /dev/null && fail=1
+ returns_ 1 dd iflag=nofollow if=$tmp_sym count=0 2> /dev/null || fail=1
fi
if dd iflag=directory if=. count=0 2> /dev/null; then
dd iflag=directory count=0 <. 2> /dev/null || fail=1
- dd iflag=directory count=0 <$tmp_in 2> /dev/null && fail=1
+ returns_ 1 dd iflag=directory count=0 <$tmp_in 2> /dev/null || fail=1
fi
old_ls=$(ls -u --full-time $tmp_in)
@@ -87,8 +87,8 @@ EOF
fi
if dd oflag=nolinks if=$tmp_in of=$tmp_out 2> /dev/null; then
- dd iflag=nolinks if=$tmp_in > /dev/null 2>&1 && fail=1
- dd iflag=nolinks < $tmp_in > /dev/null 2>&1 && fail=1
+ returns_ 1 dd iflag=nolinks if=$tmp_in > /dev/null 2>&1 || fail=1
+ returns_ 1 dd iflag=nolinks < $tmp_in > /dev/null 2>&1 || fail=1
dd oflag=nolinks < $tmp_in > $tmp_out 2>&1 || fail=1
fi
diff --git a/tests/dd/nocache.sh b/tests/dd/nocache.sh
index 33421480a..e7fdf4e5e 100755
--- a/tests/dd/nocache.sh
+++ b/tests/dd/nocache.sh
@@ -23,10 +23,10 @@ print_ver_ dd
dd iflag=nocache oflag=nocache if=/dev/null of=/dev/null || fail=1
# We should get an error for trying to process a pipe
-dd count=0 | dd iflag=nocache count=0 && fail=1
+dd count=0 | returns_ 1 dd iflag=nocache count=0 || fail=1
# O_DIRECT is orthogonal to drop cache so mutually exclusive
-dd iflag=nocache,direct if=/dev/null && fail=1
+returns_ 1 dd iflag=nocache,direct if=/dev/null || fail=1
# The rest ensure that the documented uses cases
# proceed without error
diff --git a/tests/dd/stderr.sh b/tests/dd/stderr.sh
index ce67a7a9e..82ab08f17 100755
--- a/tests/dd/stderr.sh
+++ b/tests/dd/stderr.sh
@@ -32,12 +32,12 @@ dd --help >/dev/null 2>&- || fail=1
# This exposes a failure present in 6.11 through 7.5.
if "$p/src/test" -w /dev/stderr 2>/dev/null &&
"$p/src/test" ! -w /dev/stderr 2>&-; then
- : | dd 2>&- && fail=1
+ : | returns_ 1 dd 2>&- || fail=1
fi
# Likewise for /dev/full, if /dev/full works.
if test -w /dev/full && test -c /dev/full; then
- : | dd 2>/dev/full && fail=1
+ : | returns_ 1 dd 2>/dev/full || fail=1
fi
Exit $fail
diff --git a/tests/df/no-mtab-status.sh b/tests/df/no-mtab-status.sh
index d9899c4ad..0c1bec8ef 100755
--- a/tests/df/no-mtab-status.sh
+++ b/tests/df/no-mtab-status.sh
@@ -77,22 +77,22 @@ LD_PRELOAD=./k.so df -Ti '.' || fail=1
LD_PRELOAD=./k.so df --total '.' || fail=1
# These tests are supposed to fail:
-LD_PRELOAD=./k.so df && fail=1
-LD_PRELOAD=./k.so df -i && fail=1
-LD_PRELOAD=./k.so df -T && fail=1
-LD_PRELOAD=./k.so df -Ti && fail=1
-LD_PRELOAD=./k.so df --total && fail=1
+LD_PRELOAD=./k.so returns_ 1 df || fail=1
+LD_PRELOAD=./k.so returns_ 1 df -i || fail=1
+LD_PRELOAD=./k.so returns_ 1 df -T || fail=1
+LD_PRELOAD=./k.so returns_ 1 df -Ti || fail=1
+LD_PRELOAD=./k.so returns_ 1 df --total || fail=1
-LD_PRELOAD=./k.so df -a && fail=1
-LD_PRELOAD=./k.so df -a '.' && fail=1
+LD_PRELOAD=./k.so returns_ 1 df -a || fail=1
+LD_PRELOAD=./k.so returns_ 1 df -a '.' || fail=1
-LD_PRELOAD=./k.so df -l && fail=1
-LD_PRELOAD=./k.so df -l '.' && fail=1
+LD_PRELOAD=./k.so returns_ 1 df -l || fail=1
+LD_PRELOAD=./k.so returns_ 1 df -l '.' || fail=1
-LD_PRELOAD=./k.so df -t hello && fail=1
-LD_PRELOAD=./k.so df -t hello '.' && fail=1
+LD_PRELOAD=./k.so returns_ 1 df -t hello || fail=1
+LD_PRELOAD=./k.so returns_ 1 df -t hello '.' || fail=1
-LD_PRELOAD=./k.so df -x hello && fail=1
-LD_PRELOAD=./k.so df -x hello '.' && fail=1
+LD_PRELOAD=./k.so returns_ 1 df -x hello || fail=1
+LD_PRELOAD=./k.so returns_ 1 df -x hello '.' || fail=1
Exit $fail
diff --git a/tests/df/skip-rootfs.sh b/tests/df/skip-rootfs.sh
index ed5364eb3..c42253dc3 100755
--- a/tests/df/skip-rootfs.sh
+++ b/tests/df/skip-rootfs.sh
@@ -34,7 +34,7 @@ grep '^rootfs' out && { fail=1; cat out; }
# Ensure that rootfs is yet skipped when explicitly specifying "-t rootfs".
# As df emits "no file systems processed" in this case, it would be a failure
# if df exited with status Zero.
-df -t rootfs >out && fail=1
+returns_ 1 df -t rootfs >out || fail=1
grep '^rootfs' out && { fail=1; cat out; }
# Ensure that the rootfs is shown when explicitly both specifying "-t rootfs"
diff --git a/tests/du/deref.sh b/tests/du/deref.sh
index 670ee5cc6..6c2a47241 100755
--- a/tests/du/deref.sh
+++ b/tests/du/deref.sh
@@ -34,7 +34,7 @@ ln -s nowhere dangle || framework_failure_
du -sD slink b > /dev/null 2>&1 || fail=1
# This used to fail to report the dangling symlink.
-du -L dangle > /dev/null 2>&1 && fail=1
+returns_ 1 du -L dangle > /dev/null 2>&1 || fail=1
# du -L used to mess up, either by counting the symlink's disk space itself
# (-L should follow symlinks, not count their space)
diff --git a/tests/id/context.sh b/tests/id/context.sh
index 754d0c3ba..b1aefe73f 100755
--- a/tests/id/context.sh
+++ b/tests/id/context.sh
@@ -26,7 +26,10 @@ id | grep context= >/dev/null || fail=1
# Check with specified user, no context string should be present.
# But if the current user is nameless, skip this part.
-id -nu > /dev/null \
- && id $(id -nu) | grep context= >/dev/null && fail=1
+name=$(id -nu) || { test $? -ne 1 && fail=1; }
+if test "$name"; then
+ id "$name" > id_name || fail=1
+ grep context= id_name >/dev/null && fail=1
+fi
Exit $fail
diff --git a/tests/id/gnu-zero-uids.sh b/tests/id/gnu-zero-uids.sh
index edd74f7dd..c2ee6cfb3 100755
--- a/tests/id/gnu-zero-uids.sh
+++ b/tests/id/gnu-zero-uids.sh
@@ -24,6 +24,6 @@ require_gnu_
sush - true || skip_ "the 'sush' command does not work"
# Run 'id' with zero UIDs. It should exit with a non-zero status.
-sush - id > out && fail=1
+returns_ 1 sush - id > out || fail=1
Exit $fail
diff --git a/tests/id/uid.sh b/tests/id/uid.sh
index c0766b321..e7a838586 100755
--- a/tests/id/uid.sh
+++ b/tests/id/uid.sh
@@ -22,7 +22,7 @@ uid=$(id -u) || fail=1
user=$(id -nu) || fail=1
# Ensure the empty user spec is discarded
-id '' && fail=1
+returns_ 1 id '' || fail=1
for mode in '' '-G' '-g'; do
id $mode $user > user_out || fail=1 # lookup name for comparison
diff --git a/tests/id/zero.sh b/tests/id/zero.sh
index a67a789e2..7bee3a644 100755
--- a/tests/id/zero.sh
+++ b/tests/id/zero.sh
@@ -51,8 +51,10 @@ while read u ; do
printf '\n%s: ' "id -${o}${n}[z] $u" >> out || framework_failure_
# There may be no name corresponding to an id, so don't check
# exit status when in name lookup mode
- id -${o}${n} $u >> exp || { test -z "$n" && fail=1; }
- id -${o}${n}z $u > tmp || { test -z "$n" && fail=1; }
+ id -${o}${n} $u >> exp ||
+ { test $? -ne 1 || test -z "$n" && fail=1; }
+ id -${o}${n}z $u > tmp ||
+ { test $? -ne 1 || test -z "$n" && fail=1; }
head -c-1 < tmp >> out || framework_failure_
done
done
diff --git a/tests/init.sh b/tests/init.sh
index 37fc7b62e..added1760 100755
--- a/tests/init.sh
+++ b/tests/init.sh
@@ -93,6 +93,19 @@ skip_ () { warn_ "$ME_: skipped test: $@"; Exit 77; }
fatal_ () { warn_ "$ME_: hard error: $@"; Exit 99; }
framework_failure_ () { warn_ "$ME_: set-up failure: $@"; Exit 99; }
+# This is used to simplify checking of the return value
+# which is useful when ensuring a command fails as desired.
+# I.E. just doing `command ... &&fail=1` will not catch
+# a segfault in command for example. With this helper you
+# instead check an explicit exit code like
+# returns_ 1 command ... || fail
+returns_ () {
+ local exp_exit="$1"
+ shift
+ "$@"
+ test $? -eq $exp_exit
+}
+
# Sanitize this shell to POSIX mode, if possible.
DUALCASE=1; export DUALCASE
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
diff --git a/tests/install/basic-1.sh b/tests/install/basic-1.sh
index 3a1bfae8d..db3b3c31d 100755
--- a/tests/install/basic-1.sh
+++ b/tests/install/basic-1.sh
@@ -80,8 +80,8 @@ iwd=$(pwd)
mkdir sub || fail=1
(cd sub &&
chmod 0 . &&
- ginstall -d "$iwd/xx/yy" rel/sub1 rel/sub2 2> /dev/null
-) && fail=1
+ returns_ 1 ginstall -d "$iwd/xx/yy" rel/sub1 rel/sub2 2> /dev/null
+) || fail=1
chmod 755 sub
# Ensure that the first argument-dir has been created.
diff --git a/tests/install/install-C.sh b/tests/install/install-C.sh
index 214e3ae14..630005c89 100755
--- a/tests/install/install-C.sh
+++ b/tests/install/install-C.sh
@@ -107,9 +107,9 @@ ginstall -Cv -m$mode2 a b > out || fail=1
compare out out_empty || fail=1
# options -C and --preserve-timestamps are mutually exclusive
-ginstall -C --preserve-timestamps a b && fail=1
+returns_ 1 ginstall -C --preserve-timestamps a b || fail=1
# options -C and --strip are mutually exclusive
-ginstall -C --strip --strip-program=echo a b && fail=1
+returns_ 1 ginstall -C --strip --strip-program=echo a b || fail=1
Exit $fail
diff --git a/tests/install/strip-program.sh b/tests/install/strip-program.sh
index 1350e30d2..7ac2165ea 100755
--- a/tests/install/strip-program.sh
+++ b/tests/install/strip-program.sh
@@ -34,7 +34,7 @@ ginstall src dest -s --strip-program=./b || fail=1
compare exp dest || fail=1
# Check that install cleans up properly if strip fails.
-ginstall src dest2 -s --strip-program=./FOO && fail=1
+returns_ 1 ginstall src dest2 -s --strip-program=./FOO || fail=1
test -e dest2 && fail=1
Exit $fail
diff --git a/tests/ln/misc.sh b/tests/ln/misc.sh
index 9b23fdab4..68756309a 100755
--- a/tests/ln/misc.sh
+++ b/tests/ln/misc.sh
@@ -52,20 +52,20 @@ rm -rf $d $f
touch $f || framework_failure_
rm -rf $d || framework_failure_
mkdir $d $d/$f || framework_failure_
-ln $f $d/ 2> /dev/null && fail=1
-ln -s $f $d/ 2> /dev/null && fail=1
+returns_ 1 ln $f $d/ 2> /dev/null || fail=1
+returns_ 1 ln -s $f $d/ 2> /dev/null || fail=1
rm -rf $d $f
# Make sure we get a failure with existing dest without -f option
touch $t || framework_failure_
# FIXME: don't ignore the error message but rather test
# it to make sure it's the right one.
-ln -s $t $t 2> /dev/null && fail=1
+returns_ 1 ln -s $t $t 2> /dev/null || fail=1
rm $t
# Make sure -sf fails when src and dest are the same
touch $t || framework_failure_
-ln -sf $t $t 2> /dev/null && fail=1
+returns_ 1 ln -sf $t $t 2> /dev/null || fail=1
rm $t
# Create a symlink with source file and no explicit directory
diff --git a/tests/ln/slash-decorated-nonexistent-dest.sh b/tests/ln/slash-decorated-nonexistent-dest.sh
index dc5b18994..7a0696f2f 100755
--- a/tests/ln/slash-decorated-nonexistent-dest.sh
+++ b/tests/ln/slash-decorated-nonexistent-dest.sh
@@ -23,7 +23,7 @@ touch f || framework_failure_
# Before coreutils-7.6, this would succeed on Solaris 10
-ln -T f no-such-file/ && fail=1
+returns_ 1 ln -T f no-such-file/ || fail=1
test -e no-such-file && fail=1
Exit $fail
diff --git a/tests/ls/dangle.sh b/tests/ls/dangle.sh
index 1f1849d2b..d27f03fe5 100755
--- a/tests/ls/dangle.sh
+++ b/tests/ls/dangle.sh
@@ -19,6 +19,9 @@
. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
print_ver_ ls
+LS_MINOR_PROBLEM=1
+LS_FAILURE=2
+
ln -s no-such-file dangle || framework_failure_
mkdir -p dir/sub || framework_failure_
ln -s dir slink-to-dir || framework_failure_
@@ -27,11 +30,10 @@ ln -s no-such d/dangle || framework_failure_
printf '? dangle\n' > subdir_Li_exp || framework_failure_
printf 'total 0\n? dangle\n' > subdir_Ls_exp || framework_failure_
-
# This must exit nonzero.
-ls -L dangle > /dev/null 2>&1 && fail=1
+returns_ $LS_FAILURE ls -L dangle > /dev/null 2>&1 || fail=1
# So must this.
-ls -H dangle > /dev/null 2>&1 && fail=1
+returns_ $LS_FAILURE ls -H dangle > /dev/null 2>&1 || fail=1
# This must exit successfully.
ls dangle >> out || fail=1
@@ -51,12 +53,12 @@ compare exp out || fail=1
# Ensure that ls -Li prints "?" as the inode of a dangling symlink.
rm -f out
-ls -Li d > out 2>/dev/null && fail=1
+returns_ $LS_MINOR_PROBLEM ls -Li d > out 2>/dev/null || fail=1
compare subdir_Li_exp out || fail=1
# Ensure that ls -Ls prints "?" as the allocation of a dangling symlink.
rm -f out
-ls -Ls d > out 2>/dev/null && fail=1
+returns_ $LS_MINOR_PROBLEM ls -Ls d > out 2>/dev/null || fail=1
compare subdir_Ls_exp out || fail=1
Exit $fail
diff --git a/tests/ls/follow-slink.sh b/tests/ls/follow-slink.sh
index 58d77fba4..edf6a4810 100755
--- a/tests/ls/follow-slink.sh
+++ b/tests/ls/follow-slink.sh
@@ -19,6 +19,8 @@
. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
print_ver_ ls
+LS_FAILURE=2
+
# Isolate output files from directory being listed
mkdir dir dir/sub dir1 || framework_failure_
cd dir || framework_failure_
@@ -32,7 +34,7 @@ ls -F link > /dev/null || framework_failure_
# When explicitly listing a broken link, the command must fail.
-ls -L link 2> /dev/null && fail=1
+returns_ $LS_FAILURE ls -L link 2> /dev/null || fail=1
# When encountering a broken link implicitly, Solaris 9 and OpenBSD 3.4
# list the link, provided no further information about the link needed
diff --git a/tests/ls/stat-failed.sh b/tests/ls/stat-failed.sh
index cb8b3bd26..002b71cf4 100755
--- a/tests/ls/stat-failed.sh
+++ b/tests/ls/stat-failed.sh
@@ -21,6 +21,8 @@
print_ver_ ls
skip_if_root_
+LS_MINOR_PROBLEM=1
+
mkdir d || framework_failure_
ln -s / d/s || framework_failure_
chmod 600 d || framework_failure_
@@ -38,7 +40,7 @@ sed 's/^l/?/' out | compare exp - || fail=1
# Ensure that the offsets in --dired output are accurate.
rm -f out exp
-ls --dired -l d > out && fail=1
+returns_ $LS_MINOR_PROBLEM ls --dired -l d > out || fail=1
cat <<\EOF > exp || fail=1
total 0
diff --git a/tests/misc/cat-self.sh b/tests/misc/cat-self.sh
index 555177b1f..57777e537 100755
--- a/tests/misc/cat-self.sh
+++ b/tests/misc/cat-self.sh
@@ -21,7 +21,7 @@ print_ver_ cat
echo x >out || framework_failure_
echo x >out1 || framework_failure_
-cat out >>out && fail=1
+returns_ 1 cat out >>out || fail=1
compare out out1 || fail=1
# This example is taken from the POSIX spec for 'cat'.
diff --git a/tests/misc/chcon-fail.sh b/tests/misc/chcon-fail.sh
index 48c3fcdfc..5265fa011 100755
--- a/tests/misc/chcon-fail.sh
+++ b/tests/misc/chcon-fail.sh
@@ -22,16 +22,16 @@ print_ver_ chcon
# neither context nor file
-chcon 2> /dev/null && fail=1
+returns_ 1 chcon 2> /dev/null || fail=1
# No file
-chcon CON 2> /dev/null && fail=1
+returns_ 1 chcon CON 2> /dev/null || fail=1
# No file
touch f
-chcon --reference=f 2> /dev/null && fail=1
+returns_ 1 chcon --reference=f 2> /dev/null || fail=1
# No file
-chcon -u anyone 2> /dev/null && fail=1
+returns_ 1 chcon -u anyone 2> /dev/null || fail=1
Exit $fail
diff --git a/tests/misc/chroot-credentials.sh b/tests/misc/chroot-credentials.sh
index d33fe97b1..8b6771000 100755
--- a/tests/misc/chroot-credentials.sh
+++ b/tests/misc/chroot-credentials.sh
@@ -22,6 +22,8 @@ print_ver_ chroot
require_root_
+EXIT_CANCELED=125
+
grep '^#define HAVE_SETGROUPS 1' "$CONFIG_HEADER" >/dev/null \
&& HAVE_SETGROUPS=1
@@ -36,7 +38,8 @@ chroot --userspec=$NON_ROOT_UID: / true || fail=1
# verify that invalid groups are diagnosed
for g in ' ' ',' '0trail'; do
- test "$(chroot --groups="$g" / id -G)" && fail=1
+ returns_ $EXIT_CANCELED chroot --groups="$g" / id -G >invalid || fail=1
+ compare /dev/null invalid || fail=1
done
# Verify that root credentials are kept.
@@ -111,7 +114,7 @@ if ! id -u +12342; then
test "$(chroot --userspec=+12342:+5678 / id -G)" = '5678' || fail=1
# Ensure we fail when we don't know what groups to set for an unknown ID
- chroot --userspec=+12342 / true && fail=1
+ returns_ $EXIT_CANCELED chroot --userspec=+12342 / true || fail=1
fi
Exit $fail
diff --git a/tests/misc/close-stdout.sh b/tests/misc/close-stdout.sh
index 0210678db..6714ec0f3 100755
--- a/tests/misc/close-stdout.sh
+++ b/tests/misc/close-stdout.sh
@@ -44,21 +44,21 @@ sleep 0 >&- || fail=1
# This test is ineffective unless /dev/stdout also works.
if "$p/src/test" -w /dev/stdout >/dev/null &&
"$p/src/test" ! -w /dev/stdout >&-; then
- "$p/src/printf" 'foo' >&- 2>/dev/null && fail=1
- cp --verbose a b >&- 2>/dev/null && fail=1
+ returns_ 1 "$p/src/printf" 'foo' >&- 2>/dev/null || fail=1
+ returns_ 1 cp --verbose a b >&- 2>/dev/null || fail=1
rm -Rf tmpfile-?????? || fail=1
- mktemp tmpfile-XXXXXX >&- 2>/dev/null && fail=1
- mktemp tmpfile-XXXXXX -q >&- 2>/dev/null && fail=1
+ returns_ 1 mktemp tmpfile-XXXXXX >&- 2>/dev/null || fail=1
+ returns_ 1 mktemp tmpfile-XXXXXX -q >&- 2>/dev/null || fail=1
case $(echo tmpfile-??????) in 'tmpfile-??????') ;; *) fail=1 ;; esac
fi
# Likewise for /dev/full, if /dev/full works.
if test -w /dev/full && test -c /dev/full; then
- "$p/src/printf" 'foo' >/dev/full 2>/dev/null && fail=1
- cp --verbose a b >/dev/full 2>/dev/null && fail=1
+ returns_ 1 "$p/src/printf" 'foo' >/dev/full 2>/dev/null || fail=1
+ returns_ 1 cp --verbose a b >/dev/full 2>/dev/null || fail=1
rm -Rf tmpdir-?????? || fail=1
- mktemp -d tmpdir-XXXXXX >/dev/full 2>/dev/null && fail=1
- mktemp -d -q tmpdir-XXXXXX >/dev/full 2>/dev/null && fail=1
+ returns_ 1 mktemp -d tmpdir-XXXXXX >/dev/full 2>/dev/null || fail=1
+ returns_ 1 mktemp -d -q tmpdir-XXXXXX >/dev/full 2>/dev/null || fail=1
case $(echo tmpfile-??????) in 'tmpfile-??????') ;; *) fail=1 ;; esac
fi
diff --git a/tests/misc/cut-huge-range.sh b/tests/misc/cut-huge-range.sh
index f0713d05a..035d8d087 100755
--- a/tests/misc/cut-huge-range.sh
+++ b/tests/misc/cut-huge-range.sh
@@ -56,8 +56,8 @@ CUT_MAX=$(echo $SIZE_MAX | sed "$subtract_one")
(ulimit -v 20000; : | cut -b1-$CUT_MAX >> err 2>&1) || fail=1
# Explicitly disallow values above CUT_MAX
-(ulimit -v 20000; : | cut -b$SIZE_MAX 2>/dev/null) && fail=1
-(ulimit -v 20000; : | cut -b$SIZE_OFLOW 2>/dev/null) && fail=1
+(ulimit -v 20000; : | returns_ 1 cut -b$SIZE_MAX 2>/dev/null) || fail=1
+(ulimit -v 20000; : | returns_ 1 cut -b$SIZE_OFLOW 2>/dev/null) || fail=1
compare /dev/null err || fail=1
diff --git a/tests/misc/env.sh b/tests/misc/env.sh
index 6994738f0..d7c5a099a 100755
--- a/tests/misc/env.sh
+++ b/tests/misc/env.sh
@@ -102,7 +102,7 @@ cat <<EOF > unlikely_name/also_unlikely || framework_failure_
echo pass
EOF
chmod +x unlikely_name/also_unlikely || framework_failure_
-env also_unlikely && fail=1
+returns_ 127 env also_unlikely || fail=1
test x$(PATH=$PATH:unlikely_name env also_unlikely) = xpass || fail=1
test x$(env PATH="$PATH":unlikely_name also_unlikely) = xpass || fail=1
diff --git a/tests/misc/false-status.sh b/tests/misc/false-status.sh
index 0b72c6aad..03fe98c2e 100755
--- a/tests/misc/false-status.sh
+++ b/tests/misc/false-status.sh
@@ -20,12 +20,12 @@
. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
print_ver_ false true
-env false --version > /dev/null && fail=1
-env false --help > /dev/null && fail=1
+returns_ 1 env false --version > /dev/null || fail=1
+returns_ 1 env false --help > /dev/null || fail=1
if test -w /dev/full && test -c /dev/full; then
- env true --version > /dev/full && fail=1
- env true --help > /dev/full && fail=1
+ returns_ 1 env true --version > /dev/full || fail=1
+ returns_ 1 env true --help > /dev/full || fail=1
fi
Exit $fail
diff --git a/tests/misc/md5sum-bsd.sh b/tests/misc/md5sum-bsd.sh
index 9031c1901..a092894b5 100755
--- a/tests/misc/md5sum-bsd.sh
+++ b/tests/misc/md5sum-bsd.sh
@@ -40,20 +40,20 @@ md5sum --strict -c check.md5 || fail=1
# then it'll be detected as standard format and error.
# This unlikely caveat was thought better than mandating
# an option to avoid the ambiguity.
-tail -n+2 check.md5 | md5sum --strict -c && fail=1
+tail -n+2 check.md5 | returns_ 1 md5sum --strict -c || fail=1
## BSD traditional format tests (--tag option) ##
# Ensure --tag and --check are mutually exclusive
-md5sum --tag --check /dev/null && fail=1
+returns_ 1 md5sum --tag --check /dev/null || fail=1
# Ensure --tag and --text are mutually exclusive
# We don't support --text with BSD tradition format,
# as that would complicate the output format,
# while providing little benefit over --text processing
# available with the default md5sum output format.
-md5sum --tag --text /dev/null && fail=1
+returns_ 1 md5sum --tag --text /dev/null || fail=1
# Ensure we can --check BSD traditional format we produce
rm check.md5
diff --git a/tests/misc/nproc-positive.sh b/tests/misc/nproc-positive.sh
index a001d8049..fb825facb 100755
--- a/tests/misc/nproc-positive.sh
+++ b/tests/misc/nproc-positive.sh
@@ -35,7 +35,7 @@ for i in 0 ' 1' 1000; do
done
for i in -1 N; do
- nproc --ignore=$i && fail=1
+ returns_ 1 nproc --ignore=$i || fail=1
done
procs=$(OMP_NUM_THREADS=42 nproc --ignore=40)
diff --git a/tests/misc/pathchk1.sh b/tests/misc/pathchk1.sh
index 74a1c850c..6c8a50883 100755
--- a/tests/misc/pathchk1.sh
+++ b/tests/misc/pathchk1.sh
@@ -25,14 +25,14 @@ touch file || framework_failure_
# This should exit nonzero. Before 2.0.13, it gave a diagnostic,
# but exited successfully.
-pathchk file/x > /dev/null 2>&1 && fail=1
+returns_ 1 pathchk file/x > /dev/null 2>&1 || fail=1
# This should exit nonzero. Through 5.3.0 it exited with status zero.
-pathchk -p '' > /dev/null 2>&1 && fail=1
+returns_ 1 pathchk -p '' > /dev/null 2>&1 || fail=1
# This tests the new -P option.
-pathchk -P '' > /dev/null 2>&1 && fail=1
-pathchk -P -- - > /dev/null 2>&1 && fail=1
-pathchk -p -P x/- > /dev/null 2>&1 && fail=1
+returns_ 1 pathchk -P '' > /dev/null 2>&1 || fail=1
+returns_ 1 pathchk -P -- - > /dev/null 2>&1 || fail=1
+returns_ 1 pathchk -p -P x/- > /dev/null 2>&1 || fail=1
Exit $fail
diff --git a/tests/misc/printf.sh b/tests/misc/printf.sh
index 142328595..87ca489f2 100755
--- a/tests/misc/printf.sh
+++ b/tests/misc/printf.sh
@@ -25,7 +25,9 @@ getlimits_
# Verify the 3 methods of specifying "Escape":
-test $($prog "\x1b\n\33\n\e\n" | uniq -u) && fail=1
+printf '%s\n' . . . | tr . '\033' > exp
+$prog '\x1b\n\33\n\e\n' > out || fail=1
+compare exp out || fail=1
# This would fail (by printing the '--') for printf in sh-utils
# and in coreutils 4.5.1.
@@ -68,17 +70,17 @@ $prog '8 %b %b %b %b\n' '\1y' '\01y' '\001y' '\0001y'|tr '\1' = >> out
$prog '9 %*dx\n' -2 0 >>out || fail=1
$prog '10 %.*dx\n' $INT_UFLOW 0 >>out || fail=1
-$prog '%.*dx\n' $INT_OFLOW 0 >>out 2> /dev/null && fail=1
+returns_ 1 $prog '%.*dx\n' $INT_OFLOW 0 >>out 2> /dev/null || fail=1
$prog '11 %*c\n' 2 x >>out || fail=1
-$prog '%#d\n' 0 >>out 2> /dev/null && fail=1
+returns_ 1 $prog '%#d\n' 0 >>out 2> /dev/null || fail=1
-$prog '%0s\n' 0 >>out 2> /dev/null && fail=1
+returns_ 1 $prog '%0s\n' 0 >>out 2> /dev/null || fail=1
-$prog '%.9c\n' 0 >>out 2> /dev/null && fail=1
+returns_ 1 $prog '%.9c\n' 0 >>out 2> /dev/null || fail=1
-$prog '%'\''s\n' 0 >>out 2> /dev/null && fail=1
+returns_ 1 $prog '%'\''s\n' 0 >>out 2> /dev/null || fail=1
cat <<\EOF > exp
1 x y
diff --git a/tests/misc/realpath.sh b/tests/misc/realpath.sh
index 1d1d3ed75..ed4be3962 100755
--- a/tests/misc/realpath.sh
+++ b/tests/misc/realpath.sh
@@ -42,17 +42,17 @@ ln -s /// three || framework_failure_
# Basic operation
realpath -Pqz . >/dev/null || fail=1
# Operand is required
-realpath >/dev/null && fail=1
-realpath --relative-base . --relative-to . && fail=1
-realpath --relative-base . && fail=1
+returns_ 1 realpath >/dev/null || fail=1
+returns_ 1 realpath --relative-base . --relative-to . || fail=1
+returns_ 1 realpath --relative-base . || fail=1
# -e --relative-* require directories
-realpath -e --relative-to=dir1/f --relative-base=. . && fail=1
+returns_ 1 realpath -e --relative-to=dir1/f --relative-base=. . || fail=1
realpath -e --relative-to=dir1/ --relative-base=. . || fail=1
# Note NUL params are unconditionally rejected by canonicalize_filename_mode
-realpath -m '' && fail=1
-realpath --relative-base= --relative-to=. . && fail=1
+returns_ 1 realpath -m '' || fail=1
+returns_ 1 realpath --relative-base= --relative-to=. . || fail=1
# symlink resolution
this=$(realpath .)
diff --git a/tests/misc/selinux.sh b/tests/misc/selinux.sh
index 0914f50dd..1f906dde9 100755
--- a/tests/misc/selinux.sh
+++ b/tests/misc/selinux.sh
@@ -47,7 +47,7 @@ c=$(ls -l f|cut -c11); test "$c" = . || fail=1
# Copy with an invalid context and ensure it fails
# Note this may succeed when root and selinux is in permissive mode
if test "$(getenforce)" = Enforcing; then
- cp --context='invalid-selinux-context' f f.cp && fail=1
+ returns_ 1 cp --context='invalid-selinux-context' f f.cp || fail=1
fi
# Copy each to a new directory and ensure that context is preserved.
diff --git a/tests/misc/shred-remove.sh b/tests/misc/shred-remove.sh
index 8c04c26a3..cb27c1caf 100755
--- a/tests/misc/shred-remove.sh
+++ b/tests/misc/shred-remove.sh
@@ -30,7 +30,7 @@ chmod u-w $file || framework_failure_
# This would take so long that it appears to infloop
# when using version from fileutils-4.0k.
# When the command completes, expect it to fail.
-shred -u $file > /dev/null 2>&1 && fail=1
+returns_ 1 shred -u $file > /dev/null 2>&1 || fail=1
rm -f $file || framework_failure_
# Ensure all --remove methods at least unlink the file
@@ -42,6 +42,6 @@ done
# Ensure incorrect params are diagnosed
touch $file || framework_failure_
-shred -n0 --remove=none $file 2>/dev/null && fail=1
+returns_ 1 shred -n0 --remove=none $file 2>/dev/null || fail=1
Exit $fail
diff --git a/tests/misc/sort-compress-proc.sh b/tests/misc/sort-compress-proc.sh
index 719dfc6ca..a191a3c51 100755
--- a/tests/misc/sort-compress-proc.sh
+++ b/tests/misc/sort-compress-proc.sh
@@ -20,6 +20,8 @@
print_ver_ sort
expensive_
+SORT_FAILURE=2
+
seq -w 2000 > exp || fail=1
tac exp > in || fail=1
insize=$(stat -c %s - <in) || fail=1
@@ -52,7 +54,8 @@ do
exec >/dev/null 2>&1 <&1 || exit
expr $size "<" '"$insize"' / 2 || { sleep 1; exit 1; }
}
- ' sort --compress-program=./compress -S 1k --batch-size=2 in > out && fail=1
+ ' sort --compress-program=./compress -S 1k --batch-size=2 in > out
+ test $? -eq $SORT_FAILURE || fail=1
done
# "Pre-exec child" test
diff --git a/tests/misc/sort-exit-early.sh b/tests/misc/sort-exit-early.sh
index c2bc9949d..c675503c4 100755
--- a/tests/misc/sort-exit-early.sh
+++ b/tests/misc/sort-exit-early.sh
@@ -20,18 +20,18 @@
print_ver_ sort
skip_if_root_
+SORT_FAILURE=2
+
# Check output is writable before starting to sort
touch input
chmod a-w input
-timeout 10 sort -o input && fail=1
-test $? = 124 && fail=1
+returns_ $SORT_FAILURE timeout 10 sort -o input || fail=1
# Check all inputs are readable before starting to sort
# Also ensure the output isn't created in this case
touch output
chmod a-r output
-timeout 10 sort -o typo - output && fail=1
-test $? = 124 && fail=1
+returns_ $SORT_FAILURE timeout 10 sort -o typo - output || fail=1
test -e typo && fail=1
Exit $fail
diff --git a/tests/misc/stat-hyphen.sh b/tests/misc/stat-hyphen.sh
index 2896bcb5b..a2e0a3fbd 100755
--- a/tests/misc/stat-hyphen.sh
+++ b/tests/misc/stat-hyphen.sh
@@ -23,7 +23,7 @@ printf -- '-\n' > exp || framework_failure_
touch f || framework_failure_
stat --format=%n - < f > out || fail=1
-stat -f - < f && fail=1
+returns_ 1 stat -f - < f || fail=1
compare exp out || fail=1
diff --git a/tests/misc/stat-slash.sh b/tests/misc/stat-slash.sh
index 39cce2d75..fecb7b695 100755
--- a/tests/misc/stat-slash.sh
+++ b/tests/misc/stat-slash.sh
@@ -33,7 +33,7 @@ EOF
# This failed on Solaris 9 for coreutils 8.0.
stat --format=%n link1 > out || fail=1
-stat --format=%n link1/ >> out && fail=1
+returns_ 1 stat --format=%n link1/ >> out || fail=1
stat --format=%F link2 >> out || fail=1
stat -L --format=%F link2 >> out || fail=1
diff --git a/tests/misc/stty-invalid.sh b/tests/misc/stty-invalid.sh
index f14af840d..881146f65 100755
--- a/tests/misc/stty-invalid.sh
+++ b/tests/misc/stty-invalid.sh
@@ -34,8 +34,10 @@ stty $saved_state || fail=1
# For each of the following, with coreutils-6.9 and earlier,
# stty would fail to diagnose the error on at least Solaris 10.
hex_2_64=10000000000000000
-stty $(echo $saved_state |sed 's/^[^:]*:/'$hex_2_64:/) 2>/dev/null && fail=1
-stty $(echo $saved_state |sed 's/:[0-9a-f]*$/:'$hex_2_64/) 2>/dev/null && fail=1
+returns_ 1 stty $(echo $saved_state |sed 's/^[^:]*:/'$hex_2_64:/) \
+ 2>/dev/null || fail=1
+returns_ 1 stty $(echo $saved_state |sed 's/:[0-9a-f]*$/:'$hex_2_64/) \
+ 2>/dev/null || fail=1
# Just in case either of the above mistakenly succeeds (and changes
# the state of our tty), try to restore the initial state.
diff --git a/tests/misc/stty.sh b/tests/misc/stty.sh
index 787915b87..5c2575522 100755
--- a/tests/misc/stty.sh
+++ b/tests/misc/stty.sh
@@ -34,9 +34,9 @@ stty $(cat $saved_state) || fail=1
stty erase - || fail=1
# These would improperly ignore invalid options through coreutils 5.2.1.
-stty -F 2>/dev/null && fail=1
-stty -raw -F no/such/file 2>/dev/null && fail=1
-stty -raw -a 2>/dev/null && fail=1
+returns_ 1 stty -F 2>/dev/null || fail=1
+returns_ 1 stty -raw -F no/such/file 2>/dev/null || fail=1
+returns_ 1 stty -raw -a 2>/dev/null || fail=1
# Build a list of all boolean options stty accepts on this system.
# Don't depend on terminal width. Put each option on its own line,
diff --git a/tests/misc/tr-case-class.sh b/tests/misc/tr-case-class.sh
index 162b74f3a..07c376077 100755
--- a/tests/misc/tr-case-class.sh
+++ b/tests/misc/tr-case-class.sh
@@ -29,11 +29,11 @@ tr '[:lower:][:lower:]' '[:upper:]0-9' > out || fail=1
compare exp out || fail=1
# Validate the alignment of case classes
-tr 'A-Z[:lower:]' 'a-y[:upper:]' < /dev/null && fail=1
-tr '[:upper:][:lower:]' 'a-y[:upper:]' < /dev/null && fail=1
-tr 'A-Y[:lower:]' 'a-z[:upper:]' < /dev/null && fail=1
-tr 'A-Z[:lower:]' '[:lower:][:upper:]' < /dev/null && fail=1
-tr 'A-Z[:lower:]' '[:lower:]A-Z' < /dev/null && fail=1
+returns_ 1 tr 'A-Z[:lower:]' 'a-y[:upper:]' </dev/null || fail=1
+returns_ 1 tr '[:upper:][:lower:]' 'a-y[:upper:]' </dev/null || fail=1
+returns_ 1 tr 'A-Y[:lower:]' 'a-z[:upper:]' </dev/null || fail=1
+returns_ 1 tr 'A-Z[:lower:]' '[:lower:][:upper:]' </dev/null || fail=1
+returns_ 1 tr 'A-Z[:lower:]' '[:lower:]A-Z' </dev/null || fail=1
tr '[:upper:][:lower:]' 'a-z[:upper:]' < /dev/null || fail=1
tr '[:upper:][:lower:]' '[:upper:]a-z' < /dev/null || fail=1
diff --git a/tests/misc/truncate-dir-fail.sh b/tests/misc/truncate-dir-fail.sh
index b2e76772f..7787381ee 100755
--- a/tests/misc/truncate-dir-fail.sh
+++ b/tests/misc/truncate-dir-fail.sh
@@ -20,6 +20,6 @@
print_ver_ truncate
# truncate on dir not allowed
-truncate -s+0 . && fail=1
+returns_ 1 truncate -s+0 . || fail=1
Exit $fail
diff --git a/tests/misc/truncate-overflow.sh b/tests/misc/truncate-overflow.sh
index a4a513cf0..c690c4068 100755
--- a/tests/misc/truncate-overflow.sh
+++ b/tests/misc/truncate-overflow.sh
@@ -27,13 +27,13 @@ truncate -s-1 create-zero-len-file || fail=1
echo > non-empty-file
# signed overflow
-truncate -s$OFF_T_OFLOW file && fail=1
+returns_ 1 truncate -s$OFF_T_OFLOW file || fail=1
# += signed overflow
-truncate -s+$OFF_T_MAX non-empty-file && fail=1
+returns_ 1 truncate -s+$OFF_T_MAX non-empty-file || fail=1
# *= signed overflow
IO_BLOCK_OFLOW=$(expr $OFF_T_MAX / $(stat -f -c%s .) + 1)
-truncate --io-blocks --size=$IO_BLOCK_OFLOW file && fail=1
+returns_ 1 truncate --io-blocks --size=$IO_BLOCK_OFLOW file || fail=1
Exit $fail
diff --git a/tests/misc/truncate-parameters.sh b/tests/misc/truncate-parameters.sh
index 62eb2c18f..d3cf59400 100755
--- a/tests/misc/truncate-parameters.sh
+++ b/tests/misc/truncate-parameters.sh
@@ -21,22 +21,22 @@ print_ver_ truncate
# must specify at least 1 file
-truncate --size=0 && fail=1
+returns_ 1 truncate --size=0 || fail=1
# must specify size. don't default to 0
-truncate file && fail=1
+returns_ 1 truncate file || fail=1
# mixture of absolute size & reference not allowed
-truncate --size=0 --reference=file file && fail=1
+returns_ 1 truncate --size=0 --reference=file file || fail=1
# blocks without size is not valid
-truncate --io-blocks --reference=file file && fail=1
+returns_ 1 truncate --io-blocks --reference=file file || fail=1
# must specify valid numbers
-truncate --size="invalid" file && fail=1
+returns_ 1 truncate --size="invalid" file || fail=1
# spaces not significant around size
-truncate --size="> -1" file && fail=1
+returns_ 1 truncate --size="> -1" file || fail=1
truncate --size=" >1" file || fail=1 #file now 1
truncate --size=" +1" file || fail=1 #file now 2
test $(stat --format %s file) = 2 || fail=1
diff --git a/tests/misc/truncate-relative.sh b/tests/misc/truncate-relative.sh
index 933e76385..97be8cb7d 100755
--- a/tests/misc/truncate-relative.sh
+++ b/tests/misc/truncate-relative.sh
@@ -21,15 +21,15 @@ print_ver_ truncate
# mixture of relative modifiers not allowed
-truncate --size="+>0" file && fail=1
+returns_ 1 truncate --size="+>0" file || fail=1
# mixture of relative modifiers not allowed
-truncate --size=">+0" file && fail=1
+returns_ 1 truncate --size=">+0" file || fail=1
# division by zero
-truncate --size="/0" file && fail=1
+returns_ 1 truncate --size="/0" file || fail=1
# division by zero
-truncate --size="%0" file && fail=1
+returns_ 1 truncate --size="%0" file || fail=1
Exit $fail
diff --git a/tests/misc/wc-parallel.sh b/tests/misc/wc-parallel.sh
index c522ea7d7..2d1e9f405 100755
--- a/tests/misc/wc-parallel.sh
+++ b/tests/misc/wc-parallel.sh
@@ -25,8 +25,9 @@ print_ver_ wc
# This will output at least 16KiB per process
# and start 3 processes, with 2 running concurrently,
# which triggers often on Fedora 11 at least.
-(find tmp tmp tmp -type f | xargs -n2000 -P2 wc) |
+(find tmp tmp tmp -type f | xargs -n2000 -P2 wc 2>err) |
sed -n '/0 0 0 /!p' |
grep . > /dev/null && fail=1
+compare /dev/null err || fail=1
Exit $fail
diff --git a/tests/mkdir/p-3.sh b/tests/mkdir/p-3.sh
index 6ffa533a2..199e7e1de 100755
--- a/tests/mkdir/p-3.sh
+++ b/tests/mkdir/p-3.sh
@@ -27,7 +27,8 @@ mkdir no-acce2s || framework_failure_
mkdir -p no-acce3s/d || framework_failure_
p=$(pwd)
-(cd no-access && chmod 0 . && mkdir -p "$p/a/b" u/v) 2> /dev/null && fail=1
+(cd no-access && chmod 0 . && mkdir -p "$p/a/b" u/v) 2> /dev/null
+test $? -eq 1 || fail=1
test -d "$p/a/b" || fail=1
# Same as above, but with a following *absolute* name, it should succeed
diff --git a/tests/mkdir/parents.sh b/tests/mkdir/parents.sh
index 2bc5419ba..ebdb52713 100755
--- a/tests/mkdir/parents.sh
+++ b/tests/mkdir/parents.sh
@@ -26,7 +26,7 @@ mkdir -m 700 e-dir || framework_failure_
# Make sure 'mkdir -p existing-dir' succeeds
# and that 'mkdir existing-dir' fails.
mkdir -p e-dir || fail=1
-mkdir e-dir > /dev/null 2>&1 && fail=1
+returns_ 1 mkdir e-dir > /dev/null 2>&1 || fail=1
# Create an existing directory.
umask 077
diff --git a/tests/mkdir/perm.sh b/tests/mkdir/perm.sh
index ab78f1f89..ff0a57dce 100755
--- a/tests/mkdir/perm.sh
+++ b/tests/mkdir/perm.sh
@@ -59,7 +59,7 @@ for p in empty -p; do
# If we're not using -p, then create the parent manually,
# and adjust expectations accordingly.
- test x$p = x && \
+ test x$p = x &&
{
mkdir -m =,u=rwx parent || fail=1
parent_perms=drwx------
diff --git a/tests/mkdir/special-1.sh b/tests/mkdir/special-1.sh
index 94b6f8c34..a6ba642f8 100755
--- a/tests/mkdir/special-1.sh
+++ b/tests/mkdir/special-1.sh
@@ -36,7 +36,7 @@ rmdir $tmp || fail=1
tmp2=$tmp/sub
# This should fail.
-mkdir -m$set_mode_string $tmp2 2> /dev/null && fail=1
+returns_ 1 mkdir -m$set_mode_string $tmp2 2> /dev/null || fail=1
# Now test the --parents option.
mkdir --parents -m$set_mode_string $tmp2 || fail=1
diff --git a/tests/mv/childproof.sh b/tests/mv/childproof.sh
index bb7e661c3..cc879ff19 100755
--- a/tests/mv/childproof.sh
+++ b/tests/mv/childproof.sh
@@ -28,7 +28,7 @@ echo a > a/f || framework_failure_
echo b > b/f || framework_failure_
-cp a/f b/f c 2> /dev/null && fail=1
+returns_ 1 cp a/f b/f c 2> /dev/null || fail=1
test -f a/f || fail=1
test -f b/f || fail=1
test -f c/f || fail=1
@@ -43,7 +43,7 @@ test -f c/f || fail=1
test -f c/f.~1~ || fail=1
rm -f c/f*
-mv a/f b/f c 2> /dev/null && fail=1
+returns_ 1 mv a/f b/f c 2> /dev/null || fail=1
test -f a/f && fail=1
test -f b/f || fail=1
test -f c/f || fail=1
@@ -62,7 +62,7 @@ test -f c/f || fail=1
test -f c/g || fail=1
touch a/f b/f b/g
-mv a/f b/f b/g c 2> /dev/null && fail=1
+returns_ 1 mv a/f b/f b/g c 2> /dev/null || fail=1
test -f a/f && fail=1 # a/f should have been moved
test -f b/f || fail=1 # b/f should remain
test -f b/g && fail=1 # b/g should have been moved
@@ -74,7 +74,7 @@ test -f c/g || fail=1
rm -f a/f b/f c/f
echo a > a/f || fail=1
echo b > b/f || fail=1
-ln -f a/f b/f c 2> /dev/null && fail=1
+returns_ 1 ln -f a/f b/f c 2> /dev/null || fail=1
# a/f and c/f must be linked
test $(stat --format %i a/f) = $(stat --format %i c/f) || fail=1
# b/f and c/f must not be linked
diff --git a/tests/mv/dir-file.sh b/tests/mv/dir-file.sh
index 36b1a7dcf..7b798ed6f 100755
--- a/tests/mv/dir-file.sh
+++ b/tests/mv/dir-file.sh
@@ -24,7 +24,7 @@ mkdir -p dir/file || framework_failure_
# These should both fail, but until fileutils-4.0q only the second one did.
-mv dir file > /dev/null 2>&1 && fail=1
-mv file dir > /dev/null 2>&1 && fail=1
+returns_ 1 mv dir file > /dev/null 2>&1 || fail=1
+returns_ 1 mv file dir > /dev/null 2>&1 || fail=1
Exit $fail
diff --git a/tests/mv/hardlink-case.sh b/tests/mv/hardlink-case.sh
index 4a0b2a54f..3e51c38a5 100755
--- a/tests/mv/hardlink-case.sh
+++ b/tests/mv/hardlink-case.sh
@@ -31,7 +31,7 @@ mount hfs.img mnt || skip_ 'failed to mount hfs file system'
cd mnt
touch foo
ln foo whatever
-mv foo Foo && fail=1
+returns_ 1 mv foo Foo || fail=1
test -r foo || fail=1
Exit $fail
diff --git a/tests/mv/into-self-4.sh b/tests/mv/into-self-4.sh
index fe0322ea5..2ae0468fd 100755
--- a/tests/mv/into-self-4.sh
+++ b/tests/mv/into-self-4.sh
@@ -25,7 +25,7 @@ ln -s file s || framework_failure_
# This must fail.
-mv s s 2> /dev/null && fail=1
+returns_ 1 mv s s 2> /dev/null || fail=1
# But the symlink, s, must not be removed.
# Before 4.0.36, 's' would have been removed.
diff --git a/tests/mv/mv-n.sh b/tests/mv/mv-n.sh
index 97133339c..8c3fedb81 100755
--- a/tests/mv/mv-n.sh
+++ b/tests/mv/mv-n.sh
@@ -52,6 +52,6 @@ compare out5 out_empty || fail=1
# options --backup and --no-clobber are mutually exclusive
touch a || framework_failure_
-mv -bn a b 2>/dev/null && fail=1
+returns_ 1 mv -bn a b 2>/dev/null || fail=1
Exit $fail
diff --git a/tests/mv/no-target-dir.sh b/tests/mv/no-target-dir.sh
index 9f8ece0a1..d7bca59b1 100755
--- a/tests/mv/no-target-dir.sh
+++ b/tests/mv/no-target-dir.sh
@@ -20,6 +20,8 @@
. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
print_ver_ mv
+LS_FAILURE=2
+
mkdir -p d/sub empty src d2/sub e2 || framework_failure_
touch f || framework_failure_
@@ -35,15 +37,15 @@ mv a b ||
mv -fT d empty || fail=1
# Ensure that the source, d, is gone.
-ls -d d > /dev/null 2>&1 && fail=1
+returns_ $LS_FAILURE ls -d d > /dev/null 2>&1 || fail=1
# Ensure that the dest dir now has a subdirectory.
test -d empty/sub || fail=1
# rename must fail, since the dest is non-empty.
-mv -fT src d2 2> /dev/null && fail=1
+returns_ 1 mv -fT src d2 2> /dev/null || fail=1
# rename must fail, since the src is not a directory.
-mv -fT f e2 2> /dev/null && fail=1
+returns_ 1 mv -fT f e2 2> /dev/null || fail=1
Exit $fail
diff --git a/tests/mv/part-rename.sh b/tests/mv/part-rename.sh
index da88260a8..b84f68864 100755
--- a/tests/mv/part-rename.sh
+++ b/tests/mv/part-rename.sh
@@ -31,13 +31,13 @@ mv foo/ "$other_partition_tmpdir/bar" || fail=1
# Moving a non directory from source shouldn't replace empty dir in dest
touch bar || framework_failure_
-mv bar "$other_partition_tmpdir/" && fail=1
+returns_ 1 mv bar "$other_partition_tmpdir/" || fail=1
# Moving a directory from source shouldn't replace non directory in dest
mkdir bar2
touch "$other_partition_tmpdir/bar2"
-mv bar2 "$other_partition_tmpdir/" && fail=1
+returns_ 1 mv bar2 "$other_partition_tmpdir/" || fail=1
# As per POSIX moving directory from source should replace empty dir in dest
@@ -51,7 +51,7 @@ test -e "$other_partition_tmpdir/bar3/file" || fail=1
# As per POSIX moving directory from source shouldn't update dir in dest
mkdir bar3
touch bar3/file2
-mv bar3 "$other_partition_tmpdir/" && fail=1
+returns_ 1 mv bar3 "$other_partition_tmpdir/" || fail=1
test -e "$other_partition_tmpdir/bar3/file2" && fail=1
Exit $fail
diff --git a/tests/mv/trailing-slash.sh b/tests/mv/trailing-slash.sh
index da2d95d1a..47335d3ca 100755
--- a/tests/mv/trailing-slash.sh
+++ b/tests/mv/trailing-slash.sh
@@ -48,14 +48,14 @@ done
# underlying rename syscall handles the trailing slash.
# It does fail, as desired, on recent Linux and Solaris systems.
#touch a a2
-#mv a a2/ && fail=1
+#returns_ 1 mv a a2/ || fail=1
# Test for a cp-specific diagnostic introduced after coreutils-8.7:
printf '%s\n' \
"cp: cannot create regular file 'no-such/': Not a directory" \
> expected-err
touch b
-cp b no-such/ 2> err && fail=1
+cp b no-such/ 2> err
# Map "No such file..." diagnostic to the expected "Not a directory"
sed 's/No such file or directory/Not a directory/' err > k && mv k err
diff --git a/tests/readlink/can-e.sh b/tests/readlink/can-e.sh
index 91bea7807..05f297b7c 100755
--- a/tests/readlink/can-e.sh
+++ b/tests/readlink/can-e.sh
@@ -38,7 +38,7 @@ cd "$pwd/$tmp/removed" || framework_failure_
# Skip this test if the system doesn't let you remove the working directory.
if rmdir ../removed 2>/dev/null; then
- v=$(readlink -e .) && fail=1
+ v=$(returns_ 1 readlink -e .) || fail=1
test -z "$v" || fail=1
fi
@@ -49,7 +49,7 @@ for p in "" "$pwd/$tmp/"; do
v=$(readlink -e "${p}regfile") || fail=1
test "$v" = "$my_pwd/$tmp/regfile" || fail=1
- v=$(readlink -e "${p}./regfile/") && fail=1
+ v=$(returns_ 1 readlink -e "${p}./regfile/") || fail=1
test -z "$v" || fail=1
v=$(readlink -e "${p}subdir") || fail=1
@@ -58,19 +58,19 @@ for p in "" "$pwd/$tmp/"; do
v=$(readlink -e "${p}./subdir/") || fail=1
test "$v" = "$my_pwd/$tmp/subdir" || fail=1
- v=$(readlink -e "${p}missing") && fail=1
+ v=$(returns_ 1 readlink -e "${p}missing") || fail=1
test -z "$v" || fail=1
- v=$(readlink -e "${p}./missing/") && fail=1
+ v=$(returns_ 1 readlink -e "${p}./missing/") || fail=1
test -z "$v" || fail=1
v=$(readlink -e "${p}link1") || fail=1
test "$v" = "$my_pwd/$tmp/regfile" || fail=1
- v=$(readlink -e "${p}./link1/") && fail=1
+ v=$(returns_ 1 readlink -e "${p}./link1/") || fail=1
test -z "$v" || fail=1
- v=$(readlink -e "${p}link1/more") && fail=1
+ v=$(returns_ 1 readlink -e "${p}link1/more") || fail=1
test -z "$v" || fail=1
v=$(readlink -e "${p}link2") || fail=1
@@ -79,25 +79,25 @@ for p in "" "$pwd/$tmp/"; do
v=$(readlink -e "${p}./link2/") || fail=1
test "$v" = "$my_pwd/$tmp/subdir" || fail=1
- v=$(readlink -e "${p}link2/more") && fail=1
+ v=$(returns_ 1 readlink -e "${p}link2/more") || fail=1
test -z "$v" || fail=1
- v=$(readlink -e "${p}link3") && fail=1
+ v=$(returns_ 1 readlink -e "${p}link3") || fail=1
test -z "$v" || fail=1
- v=$(readlink -e "${p}./link3/") && fail=1
+ v=$(returns_ 1 readlink -e "${p}./link3/") || fail=1
test -z "$v" || fail=1
- v=$(readlink -e "${p}link3/more") && fail=1
+ v=$(returns_ 1 readlink -e "${p}link3/more") || fail=1
test -z "$v" || fail=1
- v=$(readlink -e "${p}link4") && fail=1
+ v=$(returns_ 1 readlink -e "${p}link4") || fail=1
test -z "$v" || fail=1
- v=$(readlink -e "${p}./link4/") && fail=1
+ v=$(returns_ 1 readlink -e "${p}./link4/") || fail=1
test -z "$v" || fail=1
- v=$(readlink -e "${p}link4/more") && fail=1
+ v=$(returns_ 1 readlink -e "${p}link4/more") || fail=1
test -z "$v" || fail=1
done
diff --git a/tests/readlink/can-f.sh b/tests/readlink/can-f.sh
index 44697225e..4b25fc63d 100755
--- a/tests/readlink/can-f.sh
+++ b/tests/readlink/can-f.sh
@@ -39,7 +39,7 @@ cd "$pwd/$tmp/removed" || framework_failure_
# Skip this test if the system doesn't let you remove the working directory.
if rmdir ../removed 2>/dev/null; then
- v=$(readlink -e .) && fail=1
+ v=$(returns_ 1 readlink -e .) || fail=1
test -z "$v" || fail=1
fi
@@ -50,13 +50,13 @@ for p in "" "$pwd/$tmp/"; do
v=$(readlink -f "${p}regfile") || fail=1
test "$v" = "$my_pwd/$tmp/regfile" || fail=1
- v=$(readlink -f "${p}./regfile/") && fail=1
+ v=$(returns_ 1 readlink -f "${p}./regfile/") || fail=1
test -z "$v" || fail=1
- v=$(readlink -f "${p}regfile/more") && fail=1
+ v=$(returns_ 1 readlink -f "${p}regfile/more") || fail=1
test -z "$v" || fail=1
- v=$(readlink -f "${p}./regfile/more/") && fail=1
+ v=$(returns_ 1 readlink -f "${p}./regfile/more/") || fail=1
test -z "$v" || fail=1
v=$(readlink -f "${p}subdir") || fail=1
@@ -77,22 +77,22 @@ for p in "" "$pwd/$tmp/"; do
v=$(readlink -f "${p}./missing/") || fail=1
test "$v" = "$my_pwd/$tmp/missing" || fail=1
- v=$(readlink -f "${p}missing/more") && fail=1
+ v=$(returns_ 1 readlink -f "${p}missing/more") || fail=1
test -z "$v" || fail=1
- v=$(readlink -f "${p}./missing/more/") && fail=1
+ v=$(returns_ 1 readlink -f "${p}./missing/more/") || fail=1
test -z "$v" || fail=1
v=$(readlink -f "${p}link1") || fail=1
test "$v" = "$my_pwd/$tmp/regfile" || fail=1
- v=$(readlink -f "${p}./link1/") && fail=1
+ v=$(returns_ 1 readlink -f "${p}./link1/") || fail=1
test -z "$v" || fail=1
- v=$(readlink -f "${p}link1/more") && fail=1
+ v=$(returns_ 1 readlink -f "${p}link1/more") || fail=1
test -z "$v" || fail=1
- v=$(readlink -f "${p}./link1/more/") && fail=1
+ v=$(returns_ 1 readlink -f "${p}./link1/more/") || fail=1
test -z "$v" || fail=1
v=$(readlink -f "${p}link2") || fail=1
@@ -107,10 +107,10 @@ for p in "" "$pwd/$tmp/"; do
v=$(readlink -f "${p}./link2/more/") || fail=1
test "$v" = "$my_pwd/$tmp/subdir/more" || fail=1
- v=$(readlink -f "${p}link2/more/more2") && fail=1
+ v=$(returns_ 1 readlink -f "${p}link2/more/more2") || fail=1
test -z "$v" || fail=1
- v=$(readlink -f "${p}./link2/more/more2/") && fail=1
+ v=$(returns_ 1 readlink -f "${p}./link2/more/more2/") || fail=1
test -z "$v" || fail=1
v=$(readlink -f "${p}link3") || fail=1
@@ -119,10 +119,10 @@ for p in "" "$pwd/$tmp/"; do
v=$(readlink -f "${p}./link3/") || fail=1
test "$v" = "$my_pwd/$tmp/missing" || fail=1
- v=$(readlink -f "${p}link3/more") && fail=1
+ v=$(returns_ 1 readlink -f "${p}link3/more") || fail=1
test -z "$v" || fail=1
- v=$(readlink -f "${p}./link3/more/") && fail=1
+ v=$(returns_ 1 readlink -f "${p}./link3/more/") || fail=1
test -z "$v" || fail=1
v=$(readlink -f "${p}link4") || fail=1
@@ -131,22 +131,22 @@ for p in "" "$pwd/$tmp/"; do
v=$(readlink -f "${p}./link4/") || fail=1
test "$v" = "$my_pwd/$tmp/subdir/missing" || fail=1
- v=$(readlink -f "${p}link4/more") && fail=1
+ v=$(returns_ 1 readlink -f "${p}link4/more") || fail=1
test -z "$v" || fail=1
- v=$(readlink -f "${p}./link4/more") && fail=1
+ v=$(returns_ 1 readlink -f "${p}./link4/more") || fail=1
test -z "$v" || fail=1
- v=$(readlink -f "${p}link5") && fail=1
+ v=$(returns_ 1 readlink -f "${p}link5") || fail=1
test -z "$v" || fail=1
- v=$(readlink -f "${p}./link5/") && fail=1
+ v=$(returns_ 1 readlink -f "${p}./link5/") || fail=1
test -z "$v" || fail=1
- v=$(readlink -f "${p}link5/more") && fail=1
+ v=$(returns_ 1 readlink -f "${p}link5/more") || fail=1
test -z "$v" || fail=1
- v=$(readlink -f "${p}./link5/more") && fail=1
+ v=$(returns_ 1 readlink -f "${p}./link5/more") || fail=1
test -z "$v" || fail=1
done
diff --git a/tests/readlink/can-m.sh b/tests/readlink/can-m.sh
index 6d8ca8197..2eb13565a 100755
--- a/tests/readlink/can-m.sh
+++ b/tests/readlink/can-m.sh
@@ -38,7 +38,7 @@ cd "$pwd/$tmp/removed" || framework_failure_
# Skip this test if the system doesn't let you remove the working directory.
if rmdir ../removed 2>/dev/null; then
- v=$(readlink -e .) && fail=1
+ v=$(returns_ 1 readlink -e .) || fail=1
test -z "$v" || fail=1
fi
diff --git a/tests/readlink/multi.sh b/tests/readlink/multi.sh
index 17aab4059..c7c2ef711 100755
--- a/tests/readlink/multi.sh
+++ b/tests/readlink/multi.sh
@@ -23,8 +23,8 @@ touch regfile || framework_failure_
ln -s regfile link1 || framework_failure_
readlink link1 link1 || fail=1
-readlink link1 link2 && fail=1
-readlink link1 link2 link1 && fail=1
+returns_ 1 readlink link1 link2 || fail=1
+returns_ 1 readlink link1 link2 link1 || fail=1
readlink -m link1 link2 || fail=1
printf '/1\0/1\0' > exp || framework_failure_
diff --git a/tests/readlink/rl-1.sh b/tests/readlink/rl-1.sh
index a6b92c747..5b429edec 100755
--- a/tests/readlink/rl-1.sh
+++ b/tests/readlink/rl-1.sh
@@ -31,13 +31,13 @@ test "$v" = regfile || fail=1
v=$(readlink link2) || fail=1
test "$v" = missing || fail=1
-v=$(readlink subdir) && fail=1
+v=$(returns_ 1 readlink subdir) || fail=1
test -z "$v" || fail=1
-v=$(readlink regfile) && fail=1
+v=$(returns_ 1 readlink regfile) || fail=1
test -z "$v" || fail=1
-v=$(readlink missing) && fail=1
+v=$(returns_ 1 readlink missing) || fail=1
test -z "$v" || fail=1
Exit $fail
diff --git a/tests/rm/i-no-r.sh b/tests/rm/i-no-r.sh
index e7f7196aa..22819ab6f 100755
--- a/tests/rm/i-no-r.sh
+++ b/tests/rm/i-no-r.sh
@@ -26,7 +26,7 @@ echo y > y || framework_failure_
# This must fail.
-rm -i dir < y > /dev/null 2>&1 && fail=1
+returns_ 1 rm -i dir < y > /dev/null 2>&1 || fail=1
# The directory must remain.
test -d dir || fail=1
diff --git a/tests/rm/no-give-up.sh b/tests/rm/no-give-up.sh
index b7b5b0eda..a5134d760 100755
--- a/tests/rm/no-give-up.sh
+++ b/tests/rm/no-give-up.sh
@@ -30,8 +30,8 @@ chmod go=x . || framework_failure_
# This must fail, since '.' is not writable by $NON_ROOT_USERNAME.
-chroot --skip-chdir --user=$NON_ROOT_USERNAME / env PATH="$PATH" \
- rm -rf d 2>/dev/null && fail=1
+returns_ 1 chroot --skip-chdir --user=$NON_ROOT_USERNAME / env PATH="$PATH" \
+ rm -rf d 2>/dev/null || fail=1
# d must remain.
test -d d || fail=1
diff --git a/tests/rm/r-4.sh b/tests/rm/r-4.sh
index de3da0cf7..91a8b58aa 100755
--- a/tests/rm/r-4.sh
+++ b/tests/rm/r-4.sh
@@ -43,8 +43,8 @@ rmtest 'd/..' || fail=1
rmtest 'd/../' || fail=1
-# This test is too dangerous -- if there's a bug you're wiped out!
-# rm -fr / 2>/dev/null && fail=1
+# This test is handled more carefully in r-root.sh
+# returns_ 1 rm -fr / 2>/dev/null || fail=1
test -f d/a || fail=1
diff --git a/tests/rm/r-root.sh b/tests/rm/r-root.sh
index 179edf6ff..e8fe714af 100755
--- a/tests/rm/r-root.sh
+++ b/tests/rm/r-root.sh
@@ -143,8 +143,7 @@ for opts in \
'rootlink2/' \
'rootlink3/' ; do
- exercise_rm_r_root $opts \
- && fail=1
+ returns_ 1 exercise_rm_r_root $opts || fail=1
# For some of the synonyms, the error diagnostic slightly differs from that
# of the basic "/" case (see gnulib's fts_open' and ROOT_DEV_INO_WARN):
@@ -178,8 +177,7 @@ done
# by setting the following variable.
CU_TEST_SKIP_EXIT=1
-exercise_rm_r_root --preserve-root file1 '/' file2 \
- && fail=1
+returns_ 1 exercise_rm_r_root --preserve-root file1 '/' file2 || fail=1
unset CU_TEST_SKIP_EXIT
@@ -219,8 +217,7 @@ for file in \
test -d "$file" || continue # if e.g. /etc does not exist.
- exercise_rm_r_root --preserve-root "$file" \
- && fail=1
+ returns_ 1 exercise_rm_r_root --preserve-root "$file" || fail=1
grep "^rm: refusing to remove '\.' or '\.\.' directory: skipping" err \
|| fail=1
@@ -244,8 +241,7 @@ exercise_rm_r_root --interactive=never --no-preserve-root '/' \
|| fail=1
# The 'err' file should not contain the above error diagnostic.
-grep "^rm: it is dangerous to operate recursively on '/'" err \
- && fail=1
+grep "^rm: it is dangerous to operate recursively on '/'" err && fail=1
# Instead, rm(1) should have called the intercepted unlinkat() function,
# i.e. the evidence file "x" should exist.
diff --git a/tests/rm/rm4.sh b/tests/rm/rm4.sh
index 28ff20bdf..e0f141fd4 100755
--- a/tests/rm/rm4.sh
+++ b/tests/rm/rm4.sh
@@ -24,7 +24,7 @@ mkdir dir || framework_failure_
# This should fail.
-rm dir > /dev/null 2>&1 && fail=1
+returns_ 1 rm dir > /dev/null 2>&1 || fail=1
test -d dir || fail=1
diff --git a/tests/rm/sunos-1.sh b/tests/rm/sunos-1.sh
index d2468217b..db4221f03 100755
--- a/tests/rm/sunos-1.sh
+++ b/tests/rm/sunos-1.sh
@@ -24,6 +24,6 @@
. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
print_ver_ rm
-rm -r '' > /dev/null 2>&1 && fail=1
+returns_ 1 rm -r '' > /dev/null 2>&1 || fail=1
Exit $fail
diff --git a/tests/rmdir/fail-perm.sh b/tests/rmdir/fail-perm.sh
index 4026201e3..985cb23bb 100755
--- a/tests/rmdir/fail-perm.sh
+++ b/tests/rmdir/fail-perm.sh
@@ -27,6 +27,6 @@ chmod a-w d || framework_failure_
# This rmdir command outputs two diagnostics.
# Before coreutils-5.1.2, it would mistakenly exit successfully.
# As of coreutils-5.1.2, it fails, as required.
-rmdir -p d d/e/f 2> /dev/null && fail=1
+returns_ 1 rmdir -p d d/e/f 2> /dev/null || fail=1
Exit $fail
diff --git a/tests/split/additional-suffix.sh b/tests/split/additional-suffix.sh
index 9195915fa..79a3f9727 100755
--- a/tests/split/additional-suffix.sh
+++ b/tests/split/additional-suffix.sh
@@ -39,6 +39,6 @@ compare exp-2 xab.txt || fail=1
compare exp-3 xac.txt || fail=1
# Additional suffix must not contain slash
-split --lines=2 --additional-suffix=a/b in 2>/dev/null > out && fail=1
+returns_ 1 split --lines=2 --additional-suffix=a/b in 2>/dev/null >out || fail=1
Exit $fail
diff --git a/tests/split/fail.sh b/tests/split/fail.sh
index 67259956c..e8f7bc3cf 100755
--- a/tests/split/fail.sh
+++ b/tests/split/fail.sh
@@ -24,13 +24,13 @@ touch in || framework_failure_
split -a 0 in 2> /dev/null || fail=1
-split -b 0 in 2> /dev/null && fail=1
-split -C 0 in 2> /dev/null && fail=1
-split -l 0 in 2> /dev/null && fail=1
-split -n 0 in 2> /dev/null && fail=1
-split -n 1/0 in 2> /dev/null && fail=1
-split -n 0/1 in 2> /dev/null && fail=1
-split -n 2/1 in 2> /dev/null && fail=1
+returns_ 1 split -b 0 in 2> /dev/null || fail=1
+returns_ 1 split -C 0 in 2> /dev/null || fail=1
+returns_ 1 split -l 0 in 2> /dev/null || fail=1
+returns_ 1 split -n 0 in 2> /dev/null || fail=1
+returns_ 1 split -n 1/0 in 2> /dev/null || fail=1
+returns_ 1 split -n 0/1 in 2> /dev/null || fail=1
+returns_ 1 split -n 2/1 in 2> /dev/null || fail=1
# Make sure -C doesn't create empty files.
rm -f x?? || fail=1
@@ -42,21 +42,21 @@ test -f xac && fail=1
split -1 in 2> /dev/null || fail=1
# Then make sure that -0 evokes a failure.
-split -0 in 2> /dev/null && fail=1
+returns_ 1 split -0 in 2> /dev/null || fail=1
split --lines=$UINTMAX_MAX in || fail=1
split --bytes=$OFF_T_MAX in || fail=1
-split --line-bytes=$OFF_T_OFLOW 2> /dev/null in && fail=1
-split --line-bytes=$SIZE_OFLOW 2> /dev/null in && fail=1
+returns_ 1 split --line-bytes=$OFF_T_OFLOW 2> /dev/null in || fail=1
+returns_ 1 split --line-bytes=$SIZE_OFLOW 2> /dev/null in || fail=1
if truncate -s$SIZE_OFLOW large; then
# Ensure we can split chunks of a large file on 32 bit hosts
split --number=$SIZE_OFLOW/$SIZE_OFLOW large >/dev/null || fail=1
fi
split --number=r/$UINTMAX_MAX/$UINTMAX_MAX </dev/null >/dev/null || fail=1
-split --number=r/$UINTMAX_OFLOW </dev/null 2>/dev/null && fail=1
+returns_ 1 split --number=r/$UINTMAX_OFLOW </dev/null 2>/dev/null || fail=1
# Make sure that a huge obsolete option evokes the right failure.
-split -99999999999999999991 2> out && fail=1
+split -99999999999999999991 2> out
# On losing systems (x86 Solaris 5.9 c89), we get a message like this:
# split: line count option -9999999999... is too large
@@ -75,7 +75,7 @@ compare exp out || fail=1
# (the current directory in this case)
if ! cat . >/dev/null; then
# can't read() directories
- split . && fail=1
+ returns_ 1 split . || fail=1
fi
Exit $fail
diff --git a/tests/split/filter.sh b/tests/split/filter.sh
index 93a1bebbe..55610e417 100755
--- a/tests/split/filter.sh
+++ b/tests/split/filter.sh
@@ -44,7 +44,7 @@ split -e -n 10 --filter='xz > $FILE.xz' /dev/null || fail=1
stat x?? 2>/dev/null && fail=1
# Ensure this invalid combination is flagged
-split -n 1/2 --filter='true' /dev/null 2>/dev/null && fail=1
+returns_ 1 split -n 1/2 --filter='true' /dev/null 2>&1 || fail=1
# Ensure SIGPIPEs sent by the children don't propagate back
# where they would result in a non zero exit from split.
diff --git a/tests/split/guard-input.sh b/tests/split/guard-input.sh
index cc413606a..1213ab04c 100755
--- a/tests/split/guard-input.sh
+++ b/tests/split/guard-input.sh
@@ -23,10 +23,10 @@ seq 10 | tee exp-1 > xaa
ln -s xaa in2
ln xaa in3
-split -C 6 xaa && fail=1
-split -C 6 in2 && fail=1
-split -C 6 in3 && fail=1
-split -C 6 - < xaa && fail=1
+returns_ 1 split -C 6 xaa || fail=1
+returns_ 1 split -C 6 in2 || fail=1
+returns_ 1 split -C 6 in3 || fail=1
+returns_ 1 split -C 6 - < xaa || fail=1
compare exp-1 xaa || fail=1
diff --git a/tests/split/numeric.sh b/tests/split/numeric.sh
index e40430563..9c4e1c55d 100755
--- a/tests/split/numeric.sh
+++ b/tests/split/numeric.sh
@@ -56,10 +56,10 @@ compare exp-3 x03 || fail=1
# Check that split failed when suffix length is not large enough for
# the numerical suffix start value
-split -a 3 --numeric-suffixes=1000 in 2> /dev/null && fail=1
+returns_ 1 split -a 3 --numeric-suffixes=1000 in 2>/dev/null || fail=1
# check invalid --numeric-suffixes start values are flagged
-split --numeric-suffixes=-1 in 2> /dev/null && fail=1
-split --numeric-suffixes=one in 2> /dev/null && fail=1
+returns_ 1 split --numeric-suffixes=-1 in 2> /dev/null || fail=1
+returns_ 1 split --numeric-suffixes=one in 2> /dev/null || fail=1
Exit $fail
diff --git a/tests/split/suffix-auto-length.sh b/tests/split/suffix-auto-length.sh
index a50bd23b4..6ee220066 100755
--- a/tests/split/suffix-auto-length.sh
+++ b/tests/split/suffix-auto-length.sh
@@ -22,7 +22,7 @@ print_ver_ split
# ensure this feature is off when start number specified
truncate -s12 file.in
-split file.in -b1 --numeric=89 && fail=1
+returns_ 1 split file.in -b1 --numeric=89 || fail=1
test "$(ls -1 x* | wc -l)" = 11 || fail=1
rm -f x*
diff --git a/tests/split/suffix-length.sh b/tests/split/suffix-length.sh
index 48f83eb82..0be3e9bc4 100755
--- a/tests/split/suffix-length.sh
+++ b/tests/split/suffix-length.sh
@@ -70,7 +70,7 @@ split -a2 -C1000 < /dev/null || fail=1
# Ensure that -a fails early with a -n that is too large
rm -f x*
-split -a2 -n1000 < /dev/null && fail=1
+returns_ 1 split -a2 -n1000 < /dev/null || fail=1
test -f xaa && fail=1
Exit $fail
diff --git a/tests/touch/no-dereference.sh b/tests/touch/no-dereference.sh
index a4c85c2af..776c255f2 100755
--- a/tests/touch/no-dereference.sh
+++ b/tests/touch/no-dereference.sh
@@ -26,7 +26,7 @@ ln -s file link || framework_failure_
# These first tests should work on every platform.
# -h does not create files, but it warns. Use -c to silence warning.
-touch -h no-file 2> err && fail=1
+returns_ 1 touch -h no-file 2> err || fail=1
test -s err || fail=1
touch -h -c no-file 2> err || fail=1
compare /dev/null err || fail=1
@@ -75,7 +75,7 @@ touch -h - > file || fail=1
# If stdout is open, it is not a symlink.
if env test -w /dev/stdout >/dev/null &&
env test ! -w /dev/stdout >&-; then
- touch -h - >&- && fail=1
+ returns_ 1 touch -h - >&- || fail=1
touch -h -c - >&- || fail=1
fi
diff --git a/tests/touch/trailing-slash.sh b/tests/touch/trailing-slash.sh
index a6463fa60..2d57007ba 100755
--- a/tests/touch/trailing-slash.sh
+++ b/tests/touch/trailing-slash.sh
@@ -29,22 +29,22 @@ ln -s dir link2 || framework_failure_
# Trailing slash can only appear on directory or symlink-to-directory.
# Up through coreutils 8.0, Solaris 9 failed these tests.
-touch no-file/ && fail=1
-touch file/ && fail=1
-touch dangling/ && fail=1
-touch loop/ && fail=1
-touch link1/ && fail=1
+returns_ 1 touch no-file/ || fail=1
+returns_ 1 touch file/ || fail=1
+returns_ 1 touch dangling/ || fail=1
+returns_ 1 touch loop/ || fail=1
+returns_ 1 touch link1/ || fail=1
touch dir/ || fail=1
# -c silences ENOENT, but not ENOTDIR or ELOOP
touch -c no-file/ || fail=1
-touch -c file/ && fail=1
+returns_ 1 touch -c file/ || fail=1
touch -c dangling/ || fail=1
-touch -c loop/ && fail=1
-touch -c link1/ && fail=1
+returns_ 1 touch -c loop/ || fail=1
+returns_ 1 touch -c link1/ || fail=1
touch -c dir/ || fail=1
-test -f no-file && fail=1
-test -f nowhere && fail=1
+returns_ 1 test -f no-file || fail=1
+returns_ 1 test -f nowhere || fail=1
# Trailing slash dereferences a symlink, even with -h.
# mtime is sufficient to show pass (besides, lstat changes atime of