tests: fail rather than infloop in tail's inotify-rotate test
authorJim Meyering <meyering@redhat.com>
Wed, 30 Jun 2010 15:10:07 +0000 (17:10 +0200)
committerJim Meyering <meyering@redhat.com>
Wed, 30 Jun 2010 16:12:12 +0000 (18:12 +0200)
* tests/tail-2/inotify-rotate: Switch to new init.sh-based framework.
(grep_timeout): New function.
Use it in place of open-coded loops that might infloop.
This was prompted by my encountering an inexplicable, and so far
unreproducible, infloop in the code that was waiting for "b" to
appear in "out".

tests/tail-2/inotify-rotate

index 51cd81b..9a3933e 100755 (executable)
@@ -21,9 +21,21 @@ if test "$VERBOSE" = yes; then
   tail --version
 fi
 
-. $srcdir/test-lib.sh
+. "${srcdir=.}/init.sh"; path_prepend_ ../src
 expensive_
 
+# Wait up to 10 seconds for grep REGEXP FILE to succeed.
+# Usage: grep_timeout REGEXP FILE
+grep_timeout()
+{
+    local j
+    for j in $(seq 100); do
+        grep $1 $2 > /dev/null && return 0
+        sleep 0.1
+    done
+    return 1
+}
+
 # For details, see
 # http://lists.gnu.org/archive/html/bug-coreutils/2009-11/msg00213.html
 
@@ -37,17 +49,15 @@ for i in $(seq 50); do
     sleep .1
     echo b > k;
     # wait for b to appear in out
+    grep_timeout b out || fail_ failed to find b in out
     while :; do grep b out > /dev/null && break; done
     mv x k
     # wait for tail to detect the rename
-    while :; do grep tail: out > /dev/null && break; done
+    grep_timeout tail: out || fail_ failed to detect rename
     echo ok >> k
     found=0
     # wait up to 10 seconds for "ok" to appear in out
-    for j in $(seq 100); do
-        grep ok out > /dev/null && { found=1; break; }
-        sleep 0.1
-    done
+    grep_timeout ok out && found=1
     kill $pid
     test $found = 0 && { fail=1; cat out; break; }
 done