tests: simplify and fix a race in 2 tail --follow tests

* tests/tail-2/pid: Use the timeout command to determine process
longevity, rather than querying /proc/$pid/status.
The latter was racy in any case when inotify is used, as then
tail wakes up periodically even for unchanging files therefore
causing the check for "S (sleeping)" state to fail intermittently.
* tests/tail-2/wait: Likewise.
This commit is contained in:
Pádraig Brady
2009-09-03 00:39:17 +01:00
parent 1a94ac4a05
commit 84b5844d21
2 changed files with 19 additions and 111 deletions

View File

@@ -23,48 +23,21 @@ fi
. $srcdir/test-lib.sh
require_proc_pid_status_
touch here || framework_failure
fail=0
# Use tail itself to create a background process.
# Use tail itself to create a background process to monitor.
tail -f here &
bg_pid=$!
tail -s0.1 -f here --pid=$bg_pid &
pid=$!
sleep 0.5
state=$(get_process_status_ $pid)
if test -n "$state"; then
case $state in
S*) ;;
*) echo "$0: process dead? (state=$state)" 1>&2; fail=1 ;;
esac
kill $pid
fi
# Ensure that tail --pid=PID does not exit when PID is alive.
timeout 1 tail -s.1 -f here --pid=$bg_pid
test $? = 124 || fail=1
# Cleanup background process
kill $bg_pid
sleep 0.5
state=$(get_process_status_ $pid)
if test -n "$state"; then
case $state in
S*) echo $0: process still active 1>&2; fail=1 ;;
*) ;;
esac
kill $pid
fi
# Ensure that tail --pid=PID exits successfully when PID is dead.
# Use an unlikely-to-be-live PID
getlimits_

View File

@@ -24,97 +24,32 @@ fi
. $srcdir/test-lib.sh
require_proc_pid_status_
touch here || framework_failure
touch k || framework_failure
(touch unreadable && chmod a-r unreadable) || framework_failure
{ touch unreadable && chmod a-r unreadable; } || framework_failure
cat unreadable && framework_failure
fail=0
tail -s0.1 -f not_here &
pid=$!
sleep .5
state=$(get_process_status_ $pid)
timeout 1 tail -s0.1 -f not_here
test $? = 124 && fail=1
if test -n "$state"; then
case $state in
S*) echo $0: process still active 1>&2; fail=1 ;;
*) ;;
esac
kill $pid
fi
# Check if the file is really not accessible before use it.
if ! cat unreadable; then
tail -s0.1 -f unreadable &
pid=$!
sleep .5
state=$(get_process_status_ $pid)
if test -n "$state"; then
case $state in
S*) echo $0: process still active 1>&2; fail=1 ;;
*) ;;
esac
kill $pid
fi
fi
(tail -s0.1 -f here 2>tail.err) &
pid=$!
sleep .5
state=$(get_process_status_ $pid)
if test -n "$state"; then
case $state in
S*) ;;
*) echo $0: process died 1>&2; fail=1 ;;
esac
kill $pid
fi
timeout 1 tail -s0.1 -f unreadable
test $? = 124 && fail=1
timeout 1 tail -s0.1 -f here 2>tail.err
test $? = 124 || fail=1
# `tail -F' must wait in any case.
(tail -s0.1 -F here 2>>tail.err) &
pid=$!
sleep .5
state=$(get_process_status_ $pid)
timeout 1 tail -s0.1 -F here 2>>tail.err
test $? = 124 || fail=1
if test -n "$state"; then
case $state in
S*) ;;
*) echo $0: process died 1>&2; fail=1 ;;
esac
kill $pid
fi
timeout 1 tail -s0.1 -F unreadable
test $? = 124 || fail=1
tail -s0.1 -F unreadable &
pid=$!
sleep .5
state=$(get_process_status_ $pid)
if test -n "$state"; then
case $state in
S*) ;;
*) echo $0: process died 1>&2; fail=1 ;;
esac
kill $pid
fi
tail -s0.1 -F not_here &
pid=$!
sleep .5
state=$(get_process_status_ $pid)
if test -n "$state"; then
case $state in
S*) ;;
*) echo $0: process died 1>&2; fail=1 ;;
esac
kill $pid
fi
timeout 1 tail -s0.1 -F not_here
test $? = 124 || fail=1
test -s tail.err && fail=1