diff options
Diffstat (limited to 'src/test/perl/TestLib.pm')
-rw-r--r-- | src/test/perl/TestLib.pm | 76 |
1 files changed, 66 insertions, 10 deletions
diff --git a/src/test/perl/TestLib.pm b/src/test/perl/TestLib.pm index 1f69931fe1a..6677a57990c 100644 --- a/src/test/perl/TestLib.pm +++ b/src/test/perl/TestLib.pm @@ -3,11 +3,13 @@ package TestLib; use strict; use warnings; +use Config; use Exporter 'import'; our @EXPORT = qw( tempdir tempdir_short standard_initdb + configure_hba_for_replication start_test_server restart_test_server psql @@ -119,29 +121,74 @@ sub tempdir_short return File::Temp::tempdir(CLEANUP => 1); } +# Initialize a new cluster for testing. +# +# The PGHOST environment variable is set to connect to the new cluster. +# +# Authentication is set up so that only the current OS user can access the +# cluster. On Unix, we use Unix domain socket connections, with the socket in +# a directory that's only accessible to the current user to ensure that. +# On Windows, we use SSPI authentication to ensure the same (by pg_regress +# --config-auth). sub standard_initdb { my $pgdata = shift; system_or_bail('initdb', '-D', "$pgdata", '-A' , 'trust', '-N'); - system_or_bail("$ENV{top_builddir}/src/test/regress/pg_regress", - '--config-auth', $pgdata); + system_or_bail($ENV{PG_REGRESS}, '--config-auth', $pgdata); + + my $tempdir_short = tempdir_short; + + open CONF, ">>$pgdata/postgresql.conf"; + print CONF "\n# Added by TestLib.pm)\n"; + if ($Config{osname} eq "MSWin32") + { + print CONF "listen_addresses = '127.0.0.1'\n"; + } + else + { + print CONF "unix_socket_directories = '$tempdir_short'\n"; + print CONF "listen_addresses = ''\n"; + } + close CONF; + + $ENV{PGHOST} = ($Config{osname} eq "MSWin32") ? "127.0.0.1" : $tempdir_short; +} + +# Set up the cluster to allow replication connections, in the same way that +# standard_initdb does for normal connections. +sub configure_hba_for_replication +{ + my $pgdata = shift; + + open HBA, ">>$pgdata/pg_hba.conf"; + print HBA "\n# Allow replication (set up by TestLib.pm)\n"; + if ($Config{osname} ne "MSWin32") + { + print HBA "local replication all trust\n"; + } + else + { + print HBA "host replication all 127.0.0.1/32 sspi include_realm=1 map=regress\n"; + } + close HBA; } my ($test_server_datadir, $test_server_logfile); + +# Initialize a new cluster for testing in given directory, and start it. sub start_test_server { my ($tempdir) = @_; my $ret; - my $tempdir_short = tempdir_short; - print("### Starting test server in $tempdir\n"); standard_initdb "$tempdir/pgdata"; + $ret = system_log('pg_ctl', '-D', "$tempdir/pgdata", '-w', '-l', - "$log_path/postmaster.log", '-o', -"--fsync=off -k \"$tempdir_short\" --listen-addresses='' --log-statement=all", - 'start'); + "$log_path/postmaster.log", '-o', "--fsync=off --log-statement=all", + 'start'); + if ($ret != 0) { print "# pg_ctl failed; logfile:\n"; @@ -149,7 +196,6 @@ sub start_test_server BAIL_OUT("pg_ctl failed"); } - $ENV{PGHOST} = $tempdir_short; $test_server_datadir = "$tempdir/pgdata"; $test_server_logfile = "$log_path/postmaster.log"; } @@ -242,7 +288,17 @@ sub command_exit_is print("# Running: " . join(" ", @{$cmd}) ."\n"); my $h = start $cmd; $h->finish(); - is($h->result(0), $expected, $test_name); + + # On Windows, the exit status of the process is returned directly as the + # process's exit code, while on Unix, it's returned in the high bits + # of the exit code (see WEXITSTATUS macro in the standard <sys/wait.h> + # header file). IPC::Run's result function always returns exit code >> 8, + # assuming the Unix convention, which will always return 0 on Windows as + # long as the process was not terminated by an exception. To work around + # that, use $h->full_result on Windows instead. + my $result = ($Config{osname} eq "MSWin32") ? + ($h->full_results)[0] : $h->result(0); + is($result, $expected, $test_name); } sub program_help_ok @@ -295,7 +351,7 @@ sub issues_sql_like truncate $test_server_logfile, 0; my $result = run_log($cmd); ok($result, "@$cmd exit code 0"); - my $log = `cat '$test_server_logfile'`; + my $log = slurp_file($test_server_logfile); like($log, $expected_sql, "$test_name: SQL found in server log"); } |