summaryrefslogtreecommitdiff
path: root/tests/tail-2/inotify-race.sh
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2015-07-04 17:13:50 +0300
committerIgor Pashev <pashev.igor@gmail.com>2015-07-04 17:13:50 +0300
commit71cd8e3a743046573744123777061b64881bf372 (patch)
tree82522befe647f4fff186a5630cad0cad33f8ef53 /tests/tail-2/inotify-race.sh
parentc18578632fd3c9e513e613a86ba2b7c4ebee6c45 (diff)
downloadcoreutils-upstream.tar.gz
Imported Upstream version 8.24upstream/8.24upstream
Diffstat (limited to 'tests/tail-2/inotify-race.sh')
-rwxr-xr-xtests/tail-2/inotify-race.sh55
1 files changed, 40 insertions, 15 deletions
diff --git a/tests/tail-2/inotify-race.sh b/tests/tail-2/inotify-race.sh
index c25f354a..4ce05083 100755
--- a/tests/tail-2/inotify-race.sh
+++ b/tests/tail-2/inotify-race.sh
@@ -5,7 +5,7 @@
# indefinitely if no *other* data is appended, but it would be printed as
# soon as any additional appended data is detected.
-# Copyright (C) 2009-2014 Free Software Foundation, Inc.
+# Copyright (C) 2009-2015 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -23,10 +23,11 @@
. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
print_ver_ tail
-# Don't run this test by default because sometimes it's skipped as noted below.
-# Also gdb has a bug in Debian's gdb-6.8-3 at least that causes it to not
-# cleanup and exit correctly when it receives a SIGTERM, thus hanging the test.
-very_expensive_
+# Terminate any background gdb/tail process
+cleanup_() {
+ kill $pid 2>/dev/null && wait $pid
+ kill $sleep 2>/dev/null && wait $sleep
+}
touch file || framework_failure_
touch tail.out || framework_failure_
@@ -37,37 +38,61 @@ case $(cat gdb.out) in
*) skip_ "can't run gdb";;
esac
-break_src="$abs_top_builddir/src/tail.c"
+# Break on a line rather than a symbol, to cater for inline functions
+break_src="$abs_top_srcdir/src/tail.c"
break_line=$(grep -n ^tail_forever_inotify "$break_src") || framework_failure_
break_line=$(echo "$break_line" | cut -d: -f1) || framework_failure_
+
+# Note we get tail to monitor a background sleep process
+# rather than using timeout(1), as timeout sends SIGCONT
+# signals to its monitored process, and gdb (7.9 at least)
+# has _intermittent_ issues with this.
+# Sending SIGCONT resulted in either delayed child termination,
+# or no child termination resulting in a hung test.
+# See https://sourceware.org/bugzilla/show_bug.cgi?id=18364
+
+env sleep 10 & sleep=$!
+
# See if gdb works and
# tail_forever_inotify is compiled and run
-timeout 10s gdb -nx --batch-silent \
+gdb -nx --batch-silent \
--eval-command="break $break_line" \
- --eval-command='run -f file' \
+ --eval-command="run --pid=$sleep -f file" \
--eval-command='quit' \
- tail < /dev/null > gdb.out 2>&1 || skip_ 'breakpoint not hit'
+ tail < /dev/null > gdb.out 2>&1
+
+kill $sleep || skip_ 'breakpoint not hit'
+wait $sleep
# FIXME: The above is seen to _intermittently_ fail with:
# warning: .dynamic section for "/lib/libc.so.6" is not at the expected address
# warning: difference appears to be caused by prelink, adjusting expectations
compare /dev/null gdb.out || skip_ "can't set breakpoints in tail"
+env sleep 10 & sleep=$!
+
# Run "tail -f file", stopping to append a line just before
# inotify initialization, and then continue. Before the fix,
# that just-appended line would never be output.
-timeout 10s gdb -nx --batch-silent \
+gdb -nx --batch-silent \
--eval-command="break $break_line" \
- --eval-command='run -f file >> tail.out' \
+ --eval-command="run --pid=$sleep -f file >> tail.out" \
--eval-command='shell echo never-seen-with-tail-7.5 >> file' \
--eval-command='continue' \
--eval-command='quit' \
- tail < /dev/null > /dev/null 2>&1 &
-pid=$!
+ tail < /dev/null > /dev/null 2>&1 & pid=$!
+
+tail --pid=$pid -f tail.out | (read REPLY; kill $pid)
+
+# gdb has a bug in Debian's gdb-6.8-3 at least that causes it to not
+# cleanup and exit correctly when it receives a SIGTERM, but
+# killing sleep, should cause the tail process and thus gdb to exit.
+kill $sleep
+wait $sleep
-tail --pid=$pid -f tail.out | (read; kill $pid)
+wait $pid
-test -s tail.out || fail=1
+compare /dev/null tail.out && fail=1
Exit $fail