]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
tests: avoid the :> construct which can hide errors
authorPádraig Brady <P@draigBrady.com>
Wed, 5 Mar 2014 18:41:16 +0000 (18:41 +0000)
committerPádraig Brady <P@draigBrady.com>
Wed, 5 Mar 2014 19:02:20 +0000 (19:02 +0000)
On most shells `:>file || framework_failure_` will not evaluate
the framework_failure_ even if there was an error writing the file.
shells which do evaluate the failure are ksh 93u+ and bash 4.2,
while shells wich don't include bash 4.3, solaris, freebsd, dash.

Furthermore this construct is problematic on Solaris 10 sh,
which will try to optimize away a `:' command in a loop
after the first iteration, even if it is redirected.

* tests/cp/link-deref.sh: Remove the leading colon on redirections.
* tests/cp/reflink-perm.sh: Likewise.
* tests/id/zero.sh: Likewise.
* tests/install/install-C.sh: Likewise.
* tests/misc/env.sh: Likewise.
* tests/misc/md5sum-bsd.sh: Likewise.
* tests/misc/runcon-no-reorder.sh: Likewise.
* tests/mv/partition-perm.sh: Likewise.
* tests/rm/r-root.sh: Likewise.
* tests/split/l-chunk.sh: Likewise.
* tests/split/line-bytes.sh: Likewise.
* tests/tail-2/inotify-rotate.sh: Likewise.
* tests/tail-2/retry.sh: Likewise.
* tests/tail-2/symlink.sh: Likewise.
* tests/tail-2/wait.sh: Likewise.
* tests/touch/read-only.sh: Likewise.
+ cfg.mk (sc_prohibit_colon_redirection): A new syntax check
to avoid further instances of this creeping in.

17 files changed:
cfg.mk
tests/cp/link-deref.sh
tests/cp/reflink-perm.sh
tests/id/zero.sh
tests/install/install-C.sh
tests/misc/env.sh
tests/misc/md5sum-bsd.sh
tests/misc/runcon-no-reorder.sh
tests/mv/partition-perm.sh
tests/rm/r-root.sh
tests/split/l-chunk.sh
tests/split/line-bytes.sh
tests/tail-2/inotify-rotate.sh
tests/tail-2/retry.sh
tests/tail-2/symlink.sh
tests/tail-2/wait.sh
tests/touch/read-only.sh

diff --git a/cfg.mk b/cfg.mk
index 7f74afa84fd4799c3369c0eeddcf3037807593f3..cc6f4b8170fdeb6c6d9e66331ae6dca5f6716c58 100644 (file)
--- a/cfg.mk
+++ b/cfg.mk
@@ -123,6 +123,13 @@ sc_tests_executable:
          | sed -e "s/^/$(ME): Please make test executable: /" | grep . \
            && exit 1; :
 
+# Avoid :>file which doesn't propagate errors
+sc_prohibit_colon_redirection:
+       @cd $(srcdir)/tests && GIT_PAGER= git grep -n ': *>.*||' \
+         && { echo '$(ME): '"The leading colon in :> will hide errors" 1>&2; \
+              exit 1; }  \
+         || :
+
 # Create a list of regular expressions matching the names
 # of files included from system.h.  Exclude a couple.
 .re-list:
index 73c86a8899e093696dfa982f0258403a4bfb0e76..1b66658985f6844d1936a9f6e37e09c47f2fc265 100755 (executable)
@@ -31,7 +31,7 @@ if grep '^#define HAVE_LINKAT 1' "$CONFIG_HEADER" > /dev/null \
 fi
 
 mkdir dir              || framework_failure_
-: > file               || framework_failure_
+> file                 || framework_failure_
 ln -s dir     dirlink  || framework_failure_
 ln -s file    filelink || framework_failure_
 ln -s nowhere danglink || framework_failure_
index 06500657b7475ef70b3456effaf2d529b7e5d6d7..52f83fce132e8af05e5611cbaecdef273c536dc0 100755 (executable)
@@ -20,8 +20,8 @@
 print_ver_ cp
 
 
-> time_check
-> file
+> time_check
+> file
 ts='2009-08-28 19:00'
 touch -d "$ts" file || framework_failure_
 test time_check -nt file || skip_ "The system clock is wrong"
index 939b162c8d0e7d1a83a8fa7dc8b2e63c8cb90a72..c826ff43d90a0042d600c3a9337e23a92a9f0173 100755 (executable)
@@ -42,7 +42,7 @@ printf '%s\n' $users '' >> users || framework_failure_
 
 # Exercise "id -z" with various options.
 printf '\n' > exp || framework_failure_
-:> out || framework_failure_
+> out || framework_failure_
 
 while read u ; do
   for o in g gr G Gr u ur ; do
index 6ce4977a9b804a19314ed7aa01841b3a6e71c804..9ee1685a856f071228a846cc8e4dca7b7a515384 100755 (executable)
@@ -54,7 +54,7 @@ echo test > a || framework_failure_
 echo "'a' -> 'b'" > out_installed_first || framework_failure_
 echo "removed 'b'
 'a' -> 'b'" > out_installed_second || framework_failure_
-> out_empty || framework_failure_
+> out_empty || framework_failure_
 
 # destination file does not exist
 ginstall -Cv -m$mode1 a b > out || fail=1
index 0987f7fea548f094332cf78d4f4ffa01e33bbeb3..877a5e35e71e61812077d786a945b06cafe08415 100755 (executable)
@@ -62,7 +62,7 @@ fi
 
 ENV_TEST1=a
 export ENV_TEST1
->out || framework_failure_
+>out || framework_failure_
 env ENV_TEST2= > all || fail=1
 grep '^ENV_TEST' all | LC_ALL=C sort >> out || framework_failure_
 env -u ENV_TEST1 ENV_TEST3=c > all || fail=1
index 77f0a59cbd60df678b6d03007a5bbe254a4ed26d..f73e06225f9688fbf3dcc8f4eec74641207de6c4 100755 (executable)
@@ -70,7 +70,7 @@ nl='
 tab='  '
 rm check.md5
 for i in 'a\b' 'a\' "a${nl}b" "a${tab}b"; do
-  :> "$i"
+  > "$i"
   md5sum --tag "$i" >> check.md5
 done
 md5sum --strict -c check.md5 || fail=1
index 7338ad5fb52f9a96669ad8e2060d6454074b6a6a..ca8ad5b35c772a69f63b6b4ac9868fc7152fafae 100755 (executable)
@@ -27,7 +27,7 @@ echo "$diag" > exp || framework_failure_
 # On such a system it fails with the above diagnostic, which is fine.
 # Before the no-reorder change, it would have failed with a diagnostic
 # about -j being an invalid option.
-runcon $(id -Z) true -j 2> out && > exp
+runcon $(id -Z) true -j 2> out && > exp
 
 # When run on a system with no /selinux/context (i.e., in a chroot),
 # it chcon fails with this: "runcon: invalid context: \
index 2a25e524607d44457b79d9aa6211aed5a7a06d00..713988f7012574b973bb379a685d514feae8e631 100755 (executable)
@@ -21,11 +21,11 @@ print_ver_ mv
 cleanup_() { rm -rf "$other_partition_tmpdir"; }
 . "$abs_srcdir/tests/other-fs-tmpdir"
 
-: > file
-chmod a=rwx file
+> file || framework_failure_
+chmod a=rwx file || framework_failure_
 
 umask 077
-mv file "$other_partition_tmpdir"
+mv file "$other_partition_tmpdir" || framework_failure_
 
 test -f file && fail=1
 test -f "$other_partition_tmpdir/file" || fail=1
index 04a88eb27c5af59b5d9685c14bddb60b0fa29a10..e17b85bd1ddbd73d23a185068746f2b5270ad5a8 100755 (executable)
@@ -104,7 +104,7 @@ test -d dir && framework_failure_
 # rm(1) must succeed as before, but this time both the evidence file "x"
 # and the test file / directory must still exist afterward.
 mkdir dir || framework_failure_
-: > file  || framework_failure_
+> file    || framework_failure_
 
 skip=
 for file in dir file ; do
@@ -168,8 +168,8 @@ done
 # Exercise "rm -r file1 / file2".
 # Expect a non-Zero exit status representing failure to remove "/",
 # yet 'file1' and 'file2' should be removed.
-> file1 || framework_failure_
-> file2 || framework_failure_
+> file1 || framework_failure_
+> file2 || framework_failure_
 
 # Now that we know that 'rm' won't call the unlinkat() system function for "/",
 # we could probably execute it without the LD_PRELOAD'ed safety net.
index 066fb01f85ebb7854ef96d9ec54808ee46272ba9..792c556915d7172cd97a3ad1a9b21785b6fbda58 100755 (executable)
@@ -71,7 +71,7 @@ DEBUGGING=
 test "$DEBUGGING" && test "$VERBOSE" && set +x
 for ELIDE_EMPTY in '' '-e'; do
   for IO_BLKSIZE in 1 2 5 10 80 100; do
-    > out
+    > out
     test "$DEBUGGING" && printf "\n---io-blk-size=$IO_BLKSIZE $ELIDE_EMPTY\n"
     for N in 6 8 12 15 22; do
       rm -f x*
@@ -119,15 +119,15 @@ test "$DEBUGGING" && test "$VERBOSE" && set -x
 
 
 # Check extraction of particular chunks
-> out
+> out
 printf '1\n12345\n' > exp
 split -n l/13/15 in > out
 compare exp out || fail=1
-> out
+> out
 printf '' > exp
 split -n l/14/15 in > out
 compare exp out || fail=1
-> out
+> out
 printf '1\n12345\n1\n' > exp
 split -n l/15/15 in > out
 compare exp out || fail=1
index 9dc06a6fc242797a96e0dfcfac669eaf964662bd..5f6f505ba6219765f573c63996be16542c8d0553 100755 (executable)
@@ -63,8 +63,8 @@ cat <<\EOF > no_eol_splits_exp
 EOF
 
 for b in $(seq 10); do
-  > splits
-  > no_eol_splits
+  > splits
+  > no_eol_splits
   for s in $(seq 11); do
     rm x??
     split ---io=$b -C$s in || fail=1
index a95f4eccba094df6285833c1ebe9d5c850ca5cea..1c942cc3d19cbe75f6ad4999d55803f0ad17e9ed 100755 (executable)
@@ -47,7 +47,7 @@ for i in $(seq 50); do
     # Normally less than a second is required here, but with heavy load
     # and a lot of disk activity, even 20 seconds is insufficient, which
     # leads to this timeout killing tail before the "ok" is written below.
-    :>k && :>x || framework_failure_ failed to initialize files
+    >k && >x || framework_failure_ failed to initialize files
     timeout 40 tail -F k > out 2>&1 &
     pid=$!
     sleep .1
index 5b74b7402f381e7cc3c6708e941b09aea43f166a..dbe66a4e1a9dabef0c89f8060df9291ca93f7653 100755 (executable)
@@ -45,7 +45,7 @@ grep -F 'tail: warning: --retry ignored' out || fail=1
 # === Test:
 # Ensure that "tail --retry --follow=name" waits for the file to appear.
 # Clear 'out' so that we can check its contents without races
-:>out                           || framework_failure_
+>out                            || framework_failure_
 timeout 10 tail -s.1 --follow=name --retry missing >out 2>&1 & pid=$!
 retry_delay_ wait4lines_ .1 6 1 || fail=1  # Wait for "cannot open" error.
 echo "X" > missing              || fail=1
index 362cb635394c6297f317c033f5a6e86304447be4..b21f9e15c1d8a5cfb97a3b3c4d96af64e1fea4f5 100755 (executable)
@@ -32,7 +32,7 @@ wait4lines_ ()
 # Ensure changing targets of cli specified symlinks are handled.
 # Prior to v8.22, inotify would fail to recognize changes in the targets.
 # Clear 'out' so that we can check its contents without races.
-:>out                           || framework_failure_
+>out                            || framework_failure_
 ln -nsf target symlink          || framework_failure_
 timeout 10 tail -s.1 -F symlink >out 2>&1 & pid=$!
 retry_delay_ wait4lines_ .1 6 1 || fail=1  # Wait for "cannot open..."
@@ -50,7 +50,7 @@ rm -f target out           || framework_failure_
 # Ensure we correctly handle the source symlink itself changing.
 # I.E. that we don't operate solely on the targets.
 # Clear 'out' so that we can check its contents without races.
-:>out                           || framework_failure_
+>out                            || framework_failure_
 echo "X1" > target1             || framework_failure_
 ln -nsf target1 symlink         || framework_failure_
 timeout 10 tail -s.1 -F symlink >out 2>&1 & pid=$!
index 42a93bfe60466d8cf799b9ecf2bbf4ce0512258d..13898acf11eca62f498a656df42a5e80002902ad 100755 (executable)
@@ -52,7 +52,7 @@ for inotify in ---disable-inotify ''; do
   grep -Ev 'inotify (resources exhausted|cannot be used)' tail.err > x
   mv x tail.err
   test -s tail.err && fail=1
-  :>tail.err
+  >tail.err
 
   tail_F()
   {
index 95cd4f78e1564a349965b9e973dca085bf1444ba..d23973850d133731db4396c87aa299047923db34 100755 (executable)
@@ -20,7 +20,7 @@
 print_ver_ touch
 skip_if_root_
 
-> read-only || framework_failure_
+> read-only || framework_failure_
 chmod 444 read-only || framework_failure_