t0008: use named pipe (FIFO) to test check-ignore streaming

sleeps in the check-ignore test suite are not ideal since they can
fail when the system is under load, or when a tool like valgrind is
used which drastically alters the timing.  Therefore we replace them
with a more robust solution using a named pipe (FIFO).

Thanks to Jeff King for coming up with the redirection wizardry
required to make this work.

http://article.gmane.org/gmane.comp.version-control.git/220916

Signed-off-by: Adam Spiers <git@adamspiers.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Adam Spiers 2013-04-29 23:55:25 +01:00 committed by Junio C Hamano
parent f1ed7fea79
commit b96114edb3

View file

@ -688,27 +688,23 @@ do
'
done
test_expect_success 'setup: have stdbuf?' '
if which stdbuf >/dev/null 2>&1
then
test_set_prereq STDBUF
fi
'
test_expect_success PIPE 'streaming support for --stdin' '
mkfifo in out &&
(git check-ignore -n -v --stdin <in >out &) &&
test_expect_success STDBUF 'streaming support for --stdin' '
(
echo one
sleep 2
echo two
) | stdbuf -oL git check-ignore -v -n --stdin >out &
pid=$! &&
sleep 1 &&
grep "^\.gitignore:1:one one" out &&
test $( wc -l <out ) = 1 &&
sleep 2 &&
grep "^:: two" out &&
test $( wc -l <out ) = 2 &&
( wait $pid || kill $pid || : ) 2>/dev/null
# We cannot just "echo >in" because check-ignore would get EOF
# after echo exited; instead we open the descriptor in our
# shell, and then echo to the fd. We make sure to close it at
# the end, so that the subprocess does get EOF and dies
# properly.
exec 9>in &&
test_when_finished "exec 9>&-" &&
echo >&9 one &&
read response <out &&
echo "$response" | grep "^\.gitignore:1:one one" &&
echo >&9 two &&
read response <out &&
echo "$response" | grep "^:: two"
'
test_done