Skip to content

Commit

Permalink
test_terminal: ensure redirections work reliably
Browse files Browse the repository at this point in the history
For terminal tests that capture output/stderr, the TTY prerequisite
warning does not quite work for commands like

	test_terminal foo >out 2>err

because the warning gets "swallowed" up by the redirection that's
supposed only to be done by the subcommand.

Even worse, the outcome depends on whether stdout was already a
terminal (in which case test_terminal is a noop) or not (in which case
test_terminal introduces a pseudo-tty in the middle of the pipeline).

	$ test_terminal.perl sh -c 'test -t 1 && echo >&2 YES' >out
	YES
	$ sh -c 'test -t 1 && echo >&2 YES' >out
	$

So:

 - use the test_terminal script even when running with "-v".

 - skip tests that require a terminal when the test_terminal
   script is unusable because IO::Pty is not installed.

 - write the "need to declare TTY prerequisite" message to fd 4,
   where it will be printed when running tests with -v, rather
   than being swallowed up by an unrelated redireciton.

Noticed-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jonathan Nieder authored and Junio C Hamano committed Oct 18, 2010
1 parent 996621e commit e674c17
Showing 1 changed file with 10 additions and 28 deletions.
38 changes: 10 additions & 28 deletions t/lib-terminal.sh
Original file line number Diff line number Diff line change
@@ -1,37 +1,19 @@
#!/bin/sh

test_expect_success 'set up terminal for tests' '
if test -t 1 && test -t 2
then
>have_tty
elif
if
test_have_prereq PERL &&
"$PERL_PATH" "$TEST_DIRECTORY"/test-terminal.perl \
sh -c "test -t 1 && test -t 2"
then
>test_terminal_works
test_set_prereq TTY &&
test_terminal () {
if ! test_declared_prereq TTY
then
echo >&4 "test_terminal: need to declare TTY prerequisite"
return 127
fi
"$PERL_PATH" "$TEST_DIRECTORY"/test-terminal.perl "$@"
}
fi
'

if test -e have_tty
then
test_terminal_() { "$@"; }
test_set_prereq TTY
elif test -e test_terminal_works
then
test_terminal_() {
"$PERL_PATH" "$TEST_DIRECTORY"/test-terminal.perl "$@"
}
test_set_prereq TTY
else
say "# no usable terminal, so skipping some tests"
fi

test_terminal () {
if ! test_declared_prereq TTY
then
echo >&2 'test_terminal: need to declare TTY prerequisite'
return 127
fi
test_terminal_ "$@"
}

0 comments on commit e674c17

Please sign in to comment.