test_terminal: ensure redirections work reliably
authorJonathan Nieder <jrnieder@gmail.com>
Sun, 17 Oct 2010 00:38:07 +0000 (19:38 -0500)
committerJunio C Hamano <gitster@pobox.com>
Mon, 18 Oct 2010 23:20:19 +0000 (16:20 -0700)
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>
t/lib-terminal.sh

index 5e7ee9a5c7ea33a5911006d6a19de0f3cbe121b9..c383b57ed9d995f530004923962c45ab38c7fc8b 100644 (file)
@@ -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_ "$@"
-}