mirror of https://github.com/postgres/postgres
Fix closing stdin in TestLib.pm
Commit 9af34f3c6b
naively assumed that all non-windows platforms would
have pseudoterminals and that perl would have IO::Pty. Such is not the
case. Instead of assumung anything, test for the presence of IO::Pty and
only use code that might depend on it if it's present. The test result is
exposed in $TestLib::have_io_pty so that it can be conveniently used in
SKIP tests.
Discussion: https://postgr.es/m/20191126044110.GB5435@paquier.xyz
This commit is contained in:
parent
553d2ec271
commit
792dba73c8
|
@ -21,6 +21,7 @@ TestLib - helper module for writing PostgreSQL's C<prove> tests.
|
|||
|
||||
# Miscellanea
|
||||
print "on Windows" if $TestLib::windows_os;
|
||||
print "IO::Pty is available" if $TestLib::have_io_pty;
|
||||
my $path = TestLib::perl2host($backup_dir);
|
||||
ok(check_mode_recursive($stream_dir, 0700, 0600),
|
||||
"check stream dir permissions");
|
||||
|
@ -83,9 +84,10 @@ our @EXPORT = qw(
|
|||
command_checks_all
|
||||
|
||||
$windows_os
|
||||
$have_io_pty
|
||||
);
|
||||
|
||||
our ($windows_os, $tmp_check, $log_path, $test_logfile);
|
||||
our ($windows_os, $tmp_check, $log_path, $test_logfile, $have_io_pty);
|
||||
|
||||
my @no_stdin;
|
||||
|
||||
|
@ -119,6 +121,9 @@ BEGIN
|
|||
require Win32API::File;
|
||||
Win32API::File->import(qw(createFile OsFHandleOpen CloseHandle));
|
||||
}
|
||||
|
||||
eval { require IO::Pty; };
|
||||
$have_io_pty = 1 unless $@;
|
||||
}
|
||||
|
||||
=pod
|
||||
|
@ -133,6 +138,12 @@ Set to true when running under Windows, except on Cygwin.
|
|||
|
||||
=back
|
||||
|
||||
=item C<$have_io_pty>
|
||||
|
||||
Set to true when IO::Pty is available.
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
INIT
|
||||
|
@ -182,19 +193,18 @@ INIT
|
|||
autoflush $testlog 1;
|
||||
|
||||
# Settings to close stdin for certain commands.
|
||||
# On non-Windows, use a pseudo-terminal, so that libraries like openssl
|
||||
# which open the tty if they think stdin isn't one for a password
|
||||
# don't block. Windows doesn't have ptys, so just provide an empty
|
||||
# string for stdin.
|
||||
if ($windows_os)
|
||||
{
|
||||
@no_stdin = ('<', \"");
|
||||
}
|
||||
else
|
||||
# If IO::Pty is present, use a pseudo-terminal, so that libraries like
|
||||
# openssl which open the tty if they think stdin isn't one for a password
|
||||
# don't block. Elsewhere just provide an empty string for stdin.
|
||||
if ($have_io_pty)
|
||||
{
|
||||
use charnames ':full';
|
||||
@no_stdin = ('<pty<', \"\N{END OF TRANSMISSION}");
|
||||
}
|
||||
else
|
||||
{
|
||||
@no_stdin = ('<', \"");
|
||||
}
|
||||
}
|
||||
|
||||
END
|
||||
|
|
Loading…
Reference in New Issue