]> granicus.if.org Git - postgresql/commitdiff
Back-patch fixes to make TAP tests work on Windows.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 17 Nov 2015 19:10:24 +0000 (14:10 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 17 Nov 2015 19:10:24 +0000 (14:10 -0500)
This back-ports commit 13d856e177e69083 and assorted followon patches
into 9.4 and 9.5.  9.5 and HEAD are now substantially identical in all
the files touched by this commit, except that 010_pg_basebackup.pl has
a few more tests related to the new --slot option.  9.4 has many fewer
TAP tests, but the test infrastructure files are substantially the same,
with the exception that 9.4 lacks the single-tmp-install infrastructure
introduced in 9.5 (commit dcae5faccab64776).

The primary motivation for this patch is to ensure that TAP test case
fixes can be back-patched without hazards of the kind seen in commits
34557f544/06dd4b44f.  In principle it should also make the world safe
for running the TAP tests in the buildfarm in these branches; although
we might want to think about back-porting dcae5faccab64776 to 9.4 if
we're going to do that for real, because the TAP tests are quite disk
space hungry without it.

Michael Paquier did the back-porting work; original patches were by
him and assorted other people.

doc/src/sgml/install-windows.sgml
src/Makefile.global.in
src/bin/pg_basebackup/t/010_pg_basebackup.pl
src/bin/pg_ctl/t/001_start_stop.pl
src/bin/pg_ctl/t/002_status.pl
src/bin/pg_rewind/RewindTest.pm
src/bin/pg_rewind/t/004_pg_xlog_symlink.pl
src/test/perl/SimpleTee.pm
src/test/perl/TestLib.pm
src/tools/msvc/clean.bat
src/tools/msvc/vcregress.pl

index d154b4408c926f1fb7edbaa5ea85fdd39ec2813e..1a0fd2808beb8cd82026f4925b8855f85b3131d1 100644 (file)
@@ -439,6 +439,7 @@ $ENV{CONFIG}="Debug";
 <userinput>vcregress modulescheck</userinput>
 <userinput>vcregress ecpgcheck</userinput>
 <userinput>vcregress isolationcheck</userinput>
+<userinput>vcregress tapcheck</userinput>
 <userinput>vcregress upgradecheck</userinput>
 </screen>
 
@@ -451,6 +452,29 @@ $ENV{CONFIG}="Debug";
    For more information about the regression tests, see
    <xref linkend="regress">.
   </para>
+
+  <para>
+   Running the TAP regression tests, with "vcregress tapcheck", requires an
+   additional Perl module to be installed:
+   <variablelist>
+    <varlistentry>
+     <term><productname>IPC::Run</productname></term>
+     <listitem><para>
+      As of this writing, <literal>IPC::Run</> is not included in the
+      ActiveState Perl installation, nor in the ActiveState Perl Package
+      Manager (PPM) library. To install, download the
+      <filename>IPC-Run-&lt;version&gt;.tar.gz</> source archive from CPAN,
+      at <ulink url="http://search.cpan.org/dist/IPC-Run/"></>, and
+      uncompress. Edit the <filename>buildenv.pl</> file, and add a PERL5LIB
+      variable to point to the <filename>lib</> subdirectory from the
+      extracted archive. For example:
+<programlisting>
+$ENV{PERL5LIB}=$ENV{PERL5LIB} . ';c:\IPC-Run-0.94\lib';
+</programlisting>
+     </para></listitem>
+    </varlistentry>
+   </variablelist>
+  </para>
  </sect2>
 
  <sect2>
index 3a0f0b9a27f5c52281023fe9b007cd965f6d0052..68252fd37e4c70e1ee1079fae9508580c444bd3d 100644 (file)
@@ -352,12 +352,12 @@ ifeq ($(enable_tap_tests),yes)
 
 define prove_installcheck
 rm -rf $(CURDIR)/tmp_check/log
-cd $(srcdir) && TESTDIR='$(CURDIR)' PATH="$(bindir):$$PATH" PGPORT='6$(DEF_PGPORT)' top_builddir='$(CURDIR)/$(top_builddir)' $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) t/*.pl
+cd $(srcdir) && TESTDIR='$(CURDIR)' PATH="$(bindir):$$PATH" PGPORT='6$(DEF_PGPORT)' top_builddir='$(CURDIR)/$(top_builddir)' PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) t/*.pl
 endef
 
 define prove_check
 rm -rf $(CURDIR)/tmp_check/log
-cd $(srcdir) && TESTDIR='$(CURDIR)' $(with_temp_install) PGPORT='6$(DEF_PGPORT)' top_builddir='$(CURDIR)/$(top_builddir)' $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) t/*.pl
+cd $(srcdir) && TESTDIR='$(CURDIR)' $(with_temp_install) PGPORT='6$(DEF_PGPORT)' PG_REGRESS='$(CURDIR)/$(top_builddir)/src/test/regress/pg_regress' $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) t/*.pl
 endef
 
 else
index e47c3a0bb7cdd097217edce69d894de70176d4ac..777802fcf7df842ac795137c0f68698cd8056e29 100644 (file)
@@ -1,8 +1,9 @@
 use strict;
 use warnings;
 use Cwd;
+use Config;
 use TestLib;
-use Test::More tests => 35;
+use Test::More tests => 46;
 
 program_help_ok('pg_basebackup');
 program_version_ok('pg_basebackup');
@@ -25,11 +26,7 @@ if (open BADCHARS, ">>$tempdir/pgdata/FOO\xe0\xe0\xe0BAR")
        close BADCHARS;
 }
 
-open HBA, ">>$tempdir/pgdata/pg_hba.conf";
-print HBA "local replication all trust\n";
-print HBA "host replication all 127.0.0.1/32 trust\n";
-print HBA "host replication all ::1/128 trust\n";
-close HBA;
+configure_hba_for_replication "$tempdir/pgdata";
 system_or_bail 'pg_ctl', '-D', "$tempdir/pgdata", 'reload';
 
 command_fails(
@@ -37,6 +34,7 @@ command_fails(
        'pg_basebackup fails because of WAL configuration');
 
 open CONF, ">>$tempdir/pgdata/postgresql.conf";
+print CONF "max_replication_slots = 10\n";
 print CONF "max_wal_senders = 10\n";
 print CONF "wal_level = archive\n";
 close CONF;
@@ -46,6 +44,10 @@ command_ok([ 'pg_basebackup', '-D', "$tempdir/backup" ],
        'pg_basebackup runs');
 ok(-f "$tempdir/backup/PG_VERSION", 'backup was created');
 
+is_deeply([sort(slurp_dir("$tempdir/backup/pg_xlog/"))],
+                 [sort qw(. .. archive_status)],
+                 'no WAL files copied');
+
 command_ok(
        [   'pg_basebackup', '-D', "$tempdir/backup2", '--xlogdir',
                "$tempdir/xlog2" ],
@@ -57,61 +59,6 @@ command_ok([ 'pg_basebackup', '-D', "$tempdir/tarbackup", '-Ft' ],
        'tar format');
 ok(-f "$tempdir/tarbackup/base.tar", 'backup tar was created');
 
-my $superlongname = "superlongname_" . ("x" x 100);
-
-system_or_bail 'touch', "$tempdir/pgdata/$superlongname";
-command_fails([ 'pg_basebackup', '-D', "$tempdir/tarbackup_l1", '-Ft' ],
-       'pg_basebackup tar with long name fails');
-unlink "$tempdir/pgdata/$superlongname";
-
-# Create a temporary directory in the system location and symlink it
-# to our physical temp location.  That way we can use shorter names
-# for the tablespace directories, which hopefully won't run afoul of
-# the 99 character length limit.
-my $shorter_tempdir = tempdir_short . "/tempdir";
-symlink "$tempdir", $shorter_tempdir;
-
-mkdir "$tempdir/tblspc1";
-psql 'postgres',
-  "CREATE TABLESPACE tblspc1 LOCATION '$shorter_tempdir/tblspc1';";
-psql 'postgres', "CREATE TABLE test1 (a int) TABLESPACE tblspc1;";
-command_ok([ 'pg_basebackup', '-D', "$tempdir/tarbackup2", '-Ft' ],
-       'tar format with tablespaces');
-ok(-f "$tempdir/tarbackup2/base.tar", 'backup tar was created');
-my @tblspc_tars = glob "$tempdir/tarbackup2/[0-9]*.tar";
-is(scalar(@tblspc_tars), 1, 'one tablespace tar was created');
-
-command_fails(
-       [ 'pg_basebackup', '-D', "$tempdir/backup1", '-Fp' ],
-       'plain format with tablespaces fails without tablespace mapping');
-
-command_ok(
-       [   'pg_basebackup', '-D', "$tempdir/backup1", '-Fp',
-               "-T$shorter_tempdir/tblspc1=$tempdir/tbackup/tblspc1" ],
-       'plain format with tablespaces succeeds with tablespace mapping');
-ok(-d "$tempdir/tbackup/tblspc1", 'tablespace was relocated');
-opendir(my $dh, "$tempdir/pgdata/pg_tblspc") or die;
-ok( (   grep {
-                       -l "$tempdir/backup1/pg_tblspc/$_"
-                         and readlink "$tempdir/backup1/pg_tblspc/$_" eq
-                         "$tempdir/tbackup/tblspc1"
-                 } readdir($dh)),
-       "tablespace symlink was updated");
-closedir $dh;
-
-mkdir "$tempdir/tbl=spc2";
-psql 'postgres', "DROP TABLE test1;";
-psql 'postgres', "DROP TABLESPACE tblspc1;";
-psql 'postgres',
-  "CREATE TABLESPACE tblspc2 LOCATION '$shorter_tempdir/tbl=spc2';";
-command_ok(
-       [   'pg_basebackup', '-D', "$tempdir/backup3", '-Fp',
-               "-T$shorter_tempdir/tbl\\=spc2=$tempdir/tbackup/tbl\\=spc2" ],
-       'mapping tablespace with = sign in path');
-ok(-d "$tempdir/tbackup/tbl=spc2", 'tablespace with = sign was relocated');
-
-psql 'postgres', "DROP TABLESPACE tblspc2;";
-
 command_fails(
        [ 'pg_basebackup', '-D', "$tempdir/backup_foo", '-Fp', "-T=/foo" ],
        '-T with empty old directory fails');
@@ -132,9 +79,93 @@ command_fails(
        [ 'pg_basebackup', '-D', "$tempdir/backup_foo", '-Fp', "-Tfoo" ],
        '-T with invalid format fails');
 
-mkdir "$tempdir/$superlongname";
-psql 'postgres',
-  "CREATE TABLESPACE tblspc3 LOCATION '$tempdir/$superlongname';";
-command_ok([ 'pg_basebackup', '-D', "$tempdir/tarbackup_l3", '-Ft' ],
-       'pg_basebackup tar with long symlink target');
-psql 'postgres', "DROP TABLESPACE tblspc3;";
+# Tar format doesn't support filenames longer than 100 bytes.
+my $superlongname = "superlongname_" . ("x" x 100);
+my $superlongpath = "$tempdir/pgdata/$superlongname";
+
+open FILE, ">$superlongpath" or die "unable to create file $superlongpath";
+close FILE;
+command_fails([ 'pg_basebackup', '-D', "$tempdir/tarbackup_l1", '-Ft' ],
+       'pg_basebackup tar with long name fails');
+unlink "$tempdir/pgdata/$superlongname";
+
+# The following tests test symlinks. Windows doesn't have symlinks, so
+# skip on Windows.
+SKIP: {
+    skip "symlinks not supported on Windows", 10 if ($windows_os);
+
+       # Create a temporary directory in the system location and symlink it
+       # to our physical temp location.  That way we can use shorter names
+       # for the tablespace directories, which hopefully won't run afoul of
+       # the 99 character length limit.
+       my $shorter_tempdir = tempdir_short . "/tempdir";
+       symlink "$tempdir", $shorter_tempdir;
+
+       mkdir "$tempdir/tblspc1";
+       psql 'postgres',
+       "CREATE TABLESPACE tblspc1 LOCATION '$shorter_tempdir/tblspc1';";
+       psql 'postgres', "CREATE TABLE test1 (a int) TABLESPACE tblspc1;";
+       command_ok([ 'pg_basebackup', '-D', "$tempdir/tarbackup2", '-Ft' ],
+                          'tar format with tablespaces');
+       ok(-f "$tempdir/tarbackup2/base.tar", 'backup tar was created');
+       my @tblspc_tars = glob "$tempdir/tarbackup2/[0-9]*.tar";
+       is(scalar(@tblspc_tars), 1, 'one tablespace tar was created');
+
+       command_fails(
+               [ 'pg_basebackup', '-D', "$tempdir/backup1", '-Fp' ],
+               'plain format with tablespaces fails without tablespace mapping');
+
+       command_ok(
+               [   'pg_basebackup', '-D', "$tempdir/backup1", '-Fp',
+                       "-T$shorter_tempdir/tblspc1=$tempdir/tbackup/tblspc1" ],
+               'plain format with tablespaces succeeds with tablespace mapping');
+       ok(-d "$tempdir/tbackup/tblspc1", 'tablespace was relocated');
+       opendir(my $dh, "$tempdir/pgdata/pg_tblspc") or die;
+       ok( (   grep {
+               -l "$tempdir/backup1/pg_tblspc/$_"
+                       and readlink "$tempdir/backup1/pg_tblspc/$_" eq
+                       "$tempdir/tbackup/tblspc1"
+                       } readdir($dh)),
+               "tablespace symlink was updated");
+       closedir $dh;
+
+       mkdir "$tempdir/tbl=spc2";
+       psql 'postgres', "DROP TABLE test1;";
+       psql 'postgres', "DROP TABLESPACE tblspc1;";
+       psql 'postgres',
+       "CREATE TABLESPACE tblspc2 LOCATION '$shorter_tempdir/tbl=spc2';";
+       command_ok(
+               [   'pg_basebackup', '-D', "$tempdir/backup3", '-Fp',
+                       "-T$shorter_tempdir/tbl\\=spc2=$tempdir/tbackup/tbl\\=spc2" ],
+               'mapping tablespace with = sign in path');
+       ok(-d "$tempdir/tbackup/tbl=spc2", 'tablespace with = sign was relocated');
+       psql 'postgres', "DROP TABLESPACE tblspc2;";
+
+       mkdir "$tempdir/$superlongname";
+       psql 'postgres',
+       "CREATE TABLESPACE tblspc3 LOCATION '$tempdir/$superlongname';";
+       command_ok([ 'pg_basebackup', '-D', "$tempdir/tarbackup_l3", '-Ft' ],
+                          'pg_basebackup tar with long symlink target');
+       psql 'postgres', "DROP TABLESPACE tblspc3;";
+}
+
+command_ok([ 'pg_basebackup', '-D', "$tempdir/backupR", '-R' ],
+       'pg_basebackup -R runs');
+ok(-f "$tempdir/backupR/recovery.conf", 'recovery.conf was created');
+my $recovery_conf = slurp_file "$tempdir/backupR/recovery.conf";
+# using a character class for the final "'" here works around an apparent
+# bug in several version of the Msys DTK perl
+like($recovery_conf, qr/^standby_mode = 'on[']$/m, 'recovery.conf sets standby_mode');
+like($recovery_conf, qr/^primary_conninfo = '.*port=$ENV{PGPORT}.*'$/m, 'recovery.conf sets primary_conninfo');
+
+command_ok([ 'pg_basebackup', '-D', "$tempdir/backupxf", '-X', 'fetch' ],
+       'pg_basebackup -X fetch runs');
+ok(grep(/^[0-9A-F]{24}$/, slurp_dir("$tempdir/backupxf/pg_xlog")), 'WAL files copied');
+command_ok([ 'pg_basebackup', '-D', "$tempdir/backupxs", '-X', 'stream' ],
+       'pg_basebackup -X stream runs');
+ok(grep(/^[0-9A-F]{24}$/, slurp_dir("$tempdir/backupxf/pg_xlog")), 'WAL files copied');
+
+command_fails([ 'pg_basebackup', '-D', "$tempdir/fail", '-S', 'slot1' ],
+       'pg_basebackup with replication slot fails without -X stream');
+command_fails([ 'pg_basebackup', '-D', "$tempdir/backupxs_sl_fail", '-X', 'stream', '-S', 'slot1' ],
+       'pg_basebackup fails with nonexistent replication slot');
index e7ae62beea92a1b866b768df91e34b60da16531a..f57abcef1dc150c135c1fb187a3fb6faf030585f 100644 (file)
@@ -1,5 +1,6 @@
 use strict;
 use warnings;
+use Config;
 use TestLib;
 use Test::More tests => 17;
 
@@ -16,13 +17,20 @@ command_exit_is([ 'pg_ctl', 'start', '-D', "$tempdir/nonexistent" ],
 command_ok([ 'pg_ctl', 'initdb', '-D', "$tempdir/data", '-o', '-N' ],
        'pg_ctl initdb');
 command_ok(
-       [   "$ENV{top_builddir}/src/test/regress/pg_regress", '--config-auth',
+       [ $ENV{PG_REGRESS}, '--config-auth',
                "$tempdir/data" ],
        'configure authentication');
 open CONF, ">>$tempdir/data/postgresql.conf";
-print CONF "listen_addresses = ''\n";
-print CONF "unix_socket_directories = '$tempdir_short'\n";
 print CONF "fsync = off\n";
+if (! $windows_os)
+{
+       print CONF "listen_addresses = ''\n";
+       print CONF "unix_socket_directories = '$tempdir_short'\n";
+}
+else
+{
+       print CONF "listen_addresses = '127.0.0.1'\n";
+}
 close CONF;
 command_ok([ 'pg_ctl', 'start', '-D', "$tempdir/data", '-w' ],
        'pg_ctl start -w');
index ec0a2a786e09cff120bad15e07eaa64b6789bab8..31f7c722f1ffdb8ca0dcf62eae38b70c0249de68 100644 (file)
@@ -10,10 +10,6 @@ command_exit_is([ 'pg_ctl', 'status', '-D', "$tempdir/nonexistent" ],
        4, 'pg_ctl status with nonexistent directory');
 
 standard_initdb "$tempdir/data";
-open CONF, ">>$tempdir/data/postgresql.conf";
-print CONF "listen_addresses = ''\n";
-print CONF "unix_socket_directories = '$tempdir_short'\n";
-close CONF;
 
 command_exit_is([ 'pg_ctl', 'status', '-D', "$tempdir/data" ],
        3, 'pg_ctl status with server not running');
index a2b7a58ad1c4ad00f371a1be720976f7f3065eb9..a4c17371dcf2159963c7a5063dd6e491a238df11 100644 (file)
@@ -40,8 +40,9 @@ use warnings;
 use TestLib;
 use Test::More;
 
+use Config;
 use File::Copy;
-use File::Path qw(remove_tree);
+use File::Path qw(rmtree);
 use IPC::Run qw(run start);
 
 use Exporter 'import';
@@ -72,8 +73,6 @@ our $test_standby_datadir = "$tmp_check/data_standby";
 my $port_master  = $ENV{PGPORT};
 my $port_standby = $port_master + 1;
 
-my $tempdir_short;
-
 my $connstr_master  = "port=$port_master";
 my $connstr_standby = "port=$port_standby";
 
@@ -121,6 +120,7 @@ sub check_query
        }
        else
        {
+               $stdout =~ s/\r//g if $Config{osname} eq 'msys';
                is($stdout, $expected_stdout, "$test_name: query result matches");
        }
 }
@@ -140,6 +140,7 @@ sub poll_query_until
                my $result = run $cmd, '>', \$stdout, '2>', \$stderr;
 
                chomp($stdout);
+               $stdout =~ s/\r//g if $Config{osname} eq 'msys';
                if ($stdout eq "t")
                {
                        return 1;
@@ -167,10 +168,8 @@ sub append_to_file
 
 sub setup_cluster
 {
-       $tempdir_short = tempdir_short;
-
        # Initialize master, data checksums are mandatory
-       remove_tree($test_master_datadir);
+       rmtree($test_master_datadir);
        standard_initdb($test_master_datadir);
 
        # Custom parameters for master's postgresql.conf
@@ -188,10 +187,7 @@ max_connections = 10
 ));
 
        # Accept replication connections on master
-       append_to_file(
-               "$test_master_datadir/pg_hba.conf", qq(
-local replication all trust
-));
+       configure_hba_for_replication $test_master_datadir;
 }
 
 sub start_master
@@ -199,19 +195,17 @@ sub start_master
        system_or_bail('pg_ctl' , '-w',
                                   '-D' , $test_master_datadir,
                                   '-l',  "$log_path/master.log",
-                                  "-o", "-k $tempdir_short --listen-addresses='' -p $port_master",
-                                  'start');
+                                  "-o", "-p $port_master", 'start');
 
        #### Now run the test-specific parts to initialize the master before setting
        # up standby
-       $ENV{PGHOST} = $tempdir_short;
 }
 
 sub create_standby
 {
 
        # Set up standby with necessary parameter
-       remove_tree $test_standby_datadir;
+       rmtree $test_standby_datadir;
 
        # Base backup is taken with xlog files included
        system_or_bail('pg_basebackup', '-D', $test_standby_datadir,
@@ -226,8 +220,7 @@ recovery_target_timeline='latest'
        # Start standby
        system_or_bail('pg_ctl', '-w', '-D', $test_standby_datadir,
                                   '-l', "$log_path/standby.log",
-                                  '-o', "-k $tempdir_short --listen-addresses='' -p $port_standby",
-                                  'start');
+                                  '-o', "-p $port_standby", 'start');
 
        # The standby may have WAL to apply before it matches the primary.  That
        # is fine, because no test examines the standby before promotion.
@@ -265,7 +258,7 @@ sub run_pg_rewind
        my $test_mode = shift;
 
        # Stop the master and be ready to perform the rewind
-       system_or_bail('pg_ctl', '-D', $test_master_datadir, 'stop', '-m', 'fast');
+       system_or_bail('pg_ctl', '-D', $test_master_datadir, '-m', 'fast', 'stop');
 
        # At this point, the rewind processing is ready to run.
        # We now have a very simple scenario with a few diverged WAL record.
@@ -282,8 +275,8 @@ sub run_pg_rewind
        {
                # Do rewind using a local pgdata as source
                # Stop the master and be ready to perform the rewind
-               system_or_bail('pg_ctl', '-D', $test_standby_datadir, 'stop',
-                                          '-m', 'fast');
+               system_or_bail('pg_ctl', '-D', $test_standby_datadir,
+                                          '-m', 'fast', 'stop');
                command_ok(['pg_rewind',
                                        "--debug",
                                        "--source-pgdata=$test_standby_datadir",
@@ -294,6 +287,7 @@ sub run_pg_rewind
        {
                # Do rewind using a remote connection as source
                command_ok(['pg_rewind',
+                                       "--debug",
                                        "--source-server",
                                        "port=$port_standby dbname=postgres",
                                        "--target-pgdata=$test_master_datadir"],
@@ -321,8 +315,7 @@ recovery_target_timeline='latest'
        # Restart the master to check that rewind went correctly
        system_or_bail('pg_ctl', '-w', '-D', $test_master_datadir,
                                   '-l', "$log_path/master.log",
-                                  '-o', "-k $tempdir_short --listen-addresses='' -p $port_master",
-                                  'start');
+                                  '-o', "-p $port_master", 'start');
 
        #### Now run the test-specific parts to check the result
 }
index 634c623afab8dd3e910a61079f1c13a8584c67f4..c5f72e2e3cde4807c5f1e1d6df5974f6419a750b 100644 (file)
@@ -4,9 +4,18 @@
 use strict;
 use warnings;
 use File::Copy;
-use File::Path qw(remove_tree);
+use File::Path qw(rmtree);
 use TestLib;
-use Test::More tests => 4;
+use Test::More;
+if ($windows_os)
+{
+       plan skip_all => 'symlinks not supported on Windows';
+       exit;
+}
+else
+{
+       plan tests => 4;
+}
 
 use RewindTest;
 
@@ -16,7 +25,7 @@ sub run_test
 
        my $master_xlogdir = "$tmp_check/xlog_master";
 
-       remove_tree($master_xlogdir);
+       rmtree($master_xlogdir);
        RewindTest::setup_cluster();
 
        # turn pg_xlog into a symlink
index 8d31a4013c8786e2ce59a765c9d2d0ae2c96251b..5da82d0f85d3d2b117b03063baebc5d303605458 100644 (file)
@@ -20,6 +20,7 @@ sub PRINT {
        my $ok = 1;
        for my $fh (@$self) {
                print $fh @_ or $ok = 0;
+               $fh->flush or $ok = 0;
        }
        return $ok;
 }
index d249ebe24d52ba43ab6db9eb75766d2d9f6fbc67..02533ebde538bae0a9b7938cb7358f378f9406d3 100644 (file)
@@ -9,9 +9,12 @@ our @EXPORT = qw(
   tempdir
   tempdir_short
   standard_initdb
+  configure_hba_for_replication
   start_test_server
   restart_test_server
   psql
+  slurp_dir
+  slurp_file
   system_or_bail
   system_log
   run_log
@@ -121,34 +124,75 @@ 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";
        print CONF "fsync = off\n";
+       if ($windows_os)
+       {
+               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}         = $windows_os ? "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 (! $windows_os)
+       {
+               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',
-"-k \"$tempdir_short\" --listen-addresses='' --log-statement=all",
-                                       'start');
+         "$log_path/postmaster.log", '-o', "--log-statement=all",
+         'start');
+
        if ($ret != 0)
        {
                print "# pg_ctl failed; logfile:\n";
@@ -156,7 +200,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";
 }
@@ -180,8 +223,30 @@ END
 sub psql
 {
        my ($dbname, $sql) = @_;
+       my ($stdout, $stderr);
        print("# Running SQL command: $sql\n");
-       run [ 'psql', '-X', '-q', '-d', $dbname, '-f', '-' ], '<', \$sql or die;
+       run [ 'psql', '-X', '-A', '-t', '-q', '-d', $dbname, '-f', '-' ], '<', \$sql, '>', \$stdout, '2>', \$stderr or die;
+       chomp $stdout;
+       $stdout =~ s/\r//g if $Config{osname} eq 'msys';
+       return $stdout;
+}
+
+sub slurp_dir
+{
+       my ($dir) = @_;
+       opendir(my $dh, $dir) or die;
+       my @direntries = readdir $dh;
+       closedir $dh;
+       return @direntries;
+}
+
+sub slurp_file
+{
+       local $/;
+       local @ARGV = @_;
+       my $contents = <>;
+       $contents =~ s/\r//g if $Config{osname} eq 'msys';
+       return $contents;
 }
 
 sub system_or_bail
@@ -230,7 +295,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
@@ -283,7 +358,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");
 }
 
index fbe3cc6744abadb63d7bf4038a28c1d9aa860bfa..e3da6aa282fbf1a3ec95e23041f32e0e084faac7 100755 (executable)
@@ -88,6 +88,13 @@ if exist src\test\regress\regress.dll del /q src\test\regress\regress.dll
 if exist src\test\regress\refint.dll del /q src\test\regress\refint.dll
 if exist src\test\regress\autoinc.dll del /q src\test\regress\autoinc.dll
 
+if exist src\bin\initdb\tmp_check rd /s /q src\bin\initdb\tmp_check
+if exist src\bin\pg_basebackup\tmp_check rd /s /q src\bin\pg_basebackup\tmp_check
+if exist src\bin\pg_config\tmp_check rd /s /q src\bin\pg_config\tmp_check
+if exist src\bin\pg_ctl\tmp_check rd /s /q src\bin\pg_ctl\tmp_check
+if exist src\bin\pg_rewind\tmp_check rd /s /q src\bin\pg_rewind\tmp_check
+if exist src\bin\scripts\tmp_check rd /s /q src\bin\scripts\tmp_check
+
 REM Clean up datafiles built with contrib
 REM cd contrib
 REM for /r %%f in (*.sql) do if exist %%f.in del %%f
index 0d2f5ec8567823934bdb3fdc5326ed3b67ea88f1..d3d736bc4869eacb56331bda6a02f0890f51a334 100644 (file)
@@ -7,7 +7,9 @@ use strict;
 our $config;
 
 use Cwd;
+use File::Basename;
 use File::Copy;
+use File::Find ();
 
 use Install qw(Install);
 
@@ -32,7 +34,7 @@ if (-e "src/tools/msvc/buildenv.pl")
 
 my $what = shift || "";
 if ($what =~
-/^(check|installcheck|plcheck|contribcheck|modulescheck|ecpgcheck|isolationcheck|upgradecheck)$/i
+/^(check|installcheck|plcheck|contribcheck|modulescheck|ecpgcheck|isolationcheck|upgradecheck|tapcheck)$/i
   )
 {
        $what = uc $what;
@@ -59,7 +61,7 @@ unless ($schedule)
        $schedule = "parallel" if ($what eq 'CHECK' || $what =~ /PARALLEL/);
 }
 
-$ENV{PERL5LIB} = "$topdir/src/tools/msvc";
+$ENV{PERL5LIB} = "$topdir/src/tools/msvc;$ENV{PERL5LIB}";
 
 my $maxconn = "";
 $maxconn = "--max_connections=$ENV{MAX_CONNECTIONS}"
@@ -79,6 +81,7 @@ my %command = (
        CONTRIBCHECK   => \&contribcheck,
        MODULESCHECK   => \&modulescheck,
        ISOLATIONCHECK => \&isolationcheck,
+       TAPCHECK       => \&tapcheck,
        UPGRADECHECK   => \&upgradecheck,);
 
 my $proc = $command{$what};
@@ -165,6 +168,46 @@ sub isolationcheck
        exit $status if $status;
 }
 
+sub tapcheck
+{
+       InstallTemp();
+
+       my @args = ( "prove", "--verbose", "t/*.pl");
+       my $mstat = 0;
+
+       $ENV{PERL5LIB} = "$topdir/src/test/perl;$ENV{PERL5LIB}";
+       $ENV{PG_REGRESS} = "$topdir/$Config/pg_regress/pg_regress";
+
+       # Find out all the existing TAP tests by looking for t/ directories
+       # in the tree.
+       my $tap_dirs = [];
+       my @top_dir = ($topdir);
+       File::Find::find(
+               {   wanted => sub {
+                               /^t\z/s
+                                 && push(@$tap_dirs, $File::Find::name);
+                         }
+               },
+               @top_dir);
+
+       # Process each test
+       foreach my $test_path (@$tap_dirs)
+       {
+               # Like on Unix "make check-world", don't run the SSL test suite
+               # automatically.
+               next if ($test_path =~ /\/src\/test\/ssl\//);
+
+               my $dir = dirname($test_path);
+               chdir $dir;
+               # Reset those values, they may have been changed by another test.
+               $ENV{TESTDIR} = "$dir";
+               system(@args);
+               my $status = $? >> 8;
+               $mstat ||= $status;
+       }
+       exit $mstat if $mstat;
+}
+
 sub plcheck
 {
        chdir "../../pl";