mirror of
https://git.savannah.gnu.org/git/coreutils.git
synced 2025-09-10 07:59:52 +02:00
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:
@@ -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_
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user