On Thu, Jun 25, 2015 at 1:40 PM, Michael Paquier <michael.paqu...@gmail.com> wrote: > On Tue, May 26, 2015 at 3:39 PM, Michael Paquier wrote: >> Here is v6, a rebased version on HEAD (79f2b5d). There were some >> conflicts with the indentation and some other patches related to >> pg_rewind and initdb's tests. > > Attached is v7, rebased on 0b157a0.
Attached is v8, rebased on 1ea0620, meaning that it includes all the fancy improvements in log capture for TAP tests. -- Michael
From e8db0a990ec02ddb5bdf2fd95d42b297360ecd55 Mon Sep 17 00:00:00 2001 From: Michael Paquier <mich...@otacoo.com> Date: Thu, 9 Jul 2015 06:46:13 -0700 Subject: [PATCH] Add support for TAP tests on Windows Nodes initialized by the TAP tests use SSPI to securely perform the tests, and test scripts are patched in a couple of places to support Windows grammar. In the case of MSVC, tests can be run with this command: vcregress tapcheck --- doc/src/sgml/install-windows.sgml | 1 + src/Makefile.global.in | 2 +- src/bin/pg_basebackup/t/010_pg_basebackup.pl | 67 +++++++++++++++++----------- src/bin/pg_ctl/t/001_start_stop.pl | 14 ++++-- src/bin/pg_ctl/t/002_status.pl | 12 ++++- src/bin/pg_rewind/RewindTest.pm | 56 ++++++++++++++++------- src/bin/scripts/t/020_createdb.pl | 3 ++ src/test/perl/TestLib.pm | 19 +++++--- src/tools/msvc/Solution.pm | 1 + src/tools/msvc/clean.bat | 8 ++++ src/tools/msvc/config_default.pl | 1 + src/tools/msvc/vcregress.pl | 48 +++++++++++++++++++- 12 files changed, 176 insertions(+), 56 deletions(-) diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml index d154b44..2047790 100644 --- a/doc/src/sgml/install-windows.sgml +++ b/doc/src/sgml/install-windows.sgml @@ -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> diff --git a/src/Makefile.global.in b/src/Makefile.global.in index 8d1250d..4b9c529 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -338,7 +338,7 @@ endef define prove_check rm -rf $(srcdir)/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)' TESTREGRESS='$(top_builddir)/src/test/regress/pg_regress' $(with_temp_install) PGPORT='6$(DEF_PGPORT)' $(PROVE) $(PG_PROVE_FLAGS) $(PROVE_FLAGS) t/*.pl endef else diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl index e47c3a0..59e8cb4 100644 --- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl +++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl @@ -1,8 +1,9 @@ use strict; use warnings; use Cwd; +use Config; use TestLib; -use Test::More tests => 35; +use Test::More tests => ($Config{osname} eq "MSWin32") ? 25 : 35; program_help_ok('pg_basebackup'); program_version_ok('pg_basebackup'); @@ -25,10 +26,20 @@ if (open BADCHARS, ">>$tempdir/pgdata/FOO\xe0\xe0\xe0BAR") close BADCHARS; } +# Use SSPI on Windows, node has been initialized already accordingly +# by pg_regress --config-auth. 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"; +if ($Config{osname} ne "MSWin32") +{ + 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"; +} +else +{ + print HBA "host replication all 127.0.0.1/32 sspi include_realm=1 map=regress\n"; + print HBA "host replication all ::1/128 sspi include_realm=1 map=regress\n"; +} close HBA; system_or_bail 'pg_ctl', '-D', "$tempdir/pgdata", 'reload'; @@ -64,6 +75,33 @@ command_fails([ 'pg_basebackup', '-D', "$tempdir/tarbackup_l1", '-Ft' ], 'pg_basebackup tar with long name fails'); unlink "$tempdir/pgdata/$superlongname"; +command_fails( + [ 'pg_basebackup', '-D', "$tempdir/backup_foo", '-Fp', "-T=/foo" ], + '-T with empty old directory fails'); +command_fails( + [ 'pg_basebackup', '-D', "$tempdir/backup_foo", '-Fp', "-T/foo=" ], + '-T with empty new directory fails'); +command_fails( + [ 'pg_basebackup', '-D', "$tempdir/backup_foo", '-Fp', + "-T/foo=/bar=/baz" ], + '-T with multiple = fails'); +command_fails( + [ 'pg_basebackup', '-D', "$tempdir/backup_foo", '-Fp', "-Tfoo=/bar" ], + '-T with old directory not absolute fails'); +command_fails( + [ 'pg_basebackup', '-D', "$tempdir/backup_foo", '-Fp', "-T/foo=bar" ], + '-T with new directory not absolute fails'); +command_fails( + [ 'pg_basebackup', '-D', "$tempdir/backup_foo", '-Fp', "-Tfoo" ], + '-T with invalid format fails'); + +# Windows does not support symlink, which is what the rest of the tests +# need, so simply leave. +if ($Config{osname} eq "MSWin32") +{ + exit 0; +} + # 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 @@ -109,29 +147,8 @@ command_ok( "-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'); -command_fails( - [ 'pg_basebackup', '-D', "$tempdir/backup_foo", '-Fp', "-T/foo=" ], - '-T with empty new directory fails'); -command_fails( - [ 'pg_basebackup', '-D', "$tempdir/backup_foo", '-Fp', - "-T/foo=/bar=/baz" ], - '-T with multiple = fails'); -command_fails( - [ 'pg_basebackup', '-D', "$tempdir/backup_foo", '-Fp', "-Tfoo=/bar" ], - '-T with old directory not absolute fails'); -command_fails( - [ 'pg_basebackup', '-D', "$tempdir/backup_foo", '-Fp', "-T/foo=bar" ], - '-T with new directory not absolute fails'); -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';"; diff --git a/src/bin/pg_ctl/t/001_start_stop.pl b/src/bin/pg_ctl/t/001_start_stop.pl index bcceb57..bebcd6e 100644 --- a/src/bin/pg_ctl/t/001_start_stop.pl +++ b/src/bin/pg_ctl/t/001_start_stop.pl @@ -1,5 +1,6 @@ use strict; use warnings; +use Config; use TestLib; use Test::More tests => 17; @@ -15,12 +16,19 @@ command_exit_is([ 'pg_ctl', 'start', '-D', "$tempdir/nonexistent" ], command_ok([ 'pg_ctl', 'initdb', '-D', "$tempdir/data" ], 'pg_ctl initdb'); command_ok( - [ "$ENV{top_builddir}/src/test/regress/pg_regress", '--config-auth', + [ $ENV{TESTREGRESS}, '--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"; +if ($Config{osname} eq "MSWin32") +{ + print CONF "listen_addresses = '127.0.0.1'\n"; +} +else +{ + print CONF "listen_addresses = ''\n"; + print CONF "unix_socket_directories = '$tempdir_short'\n"; +} close CONF; command_ok([ 'pg_ctl', 'start', '-D', "$tempdir/data", '-w' ], 'pg_ctl start -w'); diff --git a/src/bin/pg_ctl/t/002_status.pl b/src/bin/pg_ctl/t/002_status.pl index ec0a2a7..f68cd62 100644 --- a/src/bin/pg_ctl/t/002_status.pl +++ b/src/bin/pg_ctl/t/002_status.pl @@ -1,5 +1,6 @@ use strict; use warnings; +use Config; use TestLib; use Test::More tests => 3; @@ -11,8 +12,15 @@ command_exit_is([ 'pg_ctl', 'status', '-D', "$tempdir/nonexistent" ], standard_initdb "$tempdir/data"; open CONF, ">>$tempdir/data/postgresql.conf"; -print CONF "listen_addresses = ''\n"; -print CONF "unix_socket_directories = '$tempdir_short'\n"; +if ($Config{osname} eq "MSWin32") +{ + print CONF "listen_addresses = '127.0.0.1'\n"; +} +else +{ + print CONF "listen_addresses = ''\n"; + print CONF "unix_socket_directories = '$tempdir_short'\n"; +} close CONF; command_exit_is([ 'pg_ctl', 'status', '-D', "$tempdir/data" ], diff --git a/src/bin/pg_rewind/RewindTest.pm b/src/bin/pg_rewind/RewindTest.pm index e57b417..8923d9b 100644 --- a/src/bin/pg_rewind/RewindTest.pm +++ b/src/bin/pg_rewind/RewindTest.pm @@ -38,6 +38,7 @@ use warnings; use TestLib; use Test::More; +use Config; use File::Copy; use File::Path qw(remove_tree); use IPC::Run qw(run start); @@ -195,19 +196,32 @@ max_connections = 10 )); # Accept replication connections on master - append_to_file( - "$test_master_datadir/pg_hba.conf", qq( + if ($Config{osname} eq "MSWin32") + { + append_to_file("$test_master_datadir/pg_hba.conf", qq( +host replication all 127.0.0.1/32 sspi include_realm=1 map=regress +host replication all ::1/128 sspi include_realm=1 map=regress +)); + } + else + { + append_to_file("$test_master_datadir/pg_hba.conf", qq( local replication all trust )); + } + + my $ctl_options = ($Config{osname} eq "MSWin32") ? + "--listen-addresses=127.0.0.1 -p $port_master" : + "-k $tempdir_short --listen-addresses='' -p $port_master"; - system_or_bail('pg_ctl' , '-w', - '-D' , $test_master_datadir, - "-o", "-k $tempdir_short --listen-addresses='' -p $port_master", - 'start'); + system_or_bail('pg_ctl', '-w', + '-D', $test_master_datadir, + '-o', $ctl_options, 'start'); #### Now run the test-specific parts to initialize the master before setting # up standby - $ENV{PGHOST} = $tempdir_short; + $ENV{PGHOST} = ($Config{osname} eq "MSWin32") ? + "127.0.0.1" : $tempdir_short; } sub create_standby @@ -226,10 +240,13 @@ standby_mode=on recovery_target_timeline='latest' )); + my $ctl_options = ($Config{osname} eq "MSWin32") ? + "--listen-addresses=127.0.0.1 -p $port_standby" : + "-k $tempdir_short --listen-addresses='' -p $port_standby"; + # Start standby system_or_bail('pg_ctl', '-w', '-D', $test_standby_datadir, - '-o', "-k $tempdir_short --listen-addresses='' -p $port_standby", - 'start'); + '-o', $ctl_options, 'start'); # Wait until the standby has caught up with the primary, by polling # pg_stat_replication. @@ -265,7 +282,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. @@ -283,8 +300,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", @@ -295,6 +312,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"], @@ -302,7 +320,6 @@ sub run_pg_rewind } else { - # Cannot come here normally die("Incorrect test mode specified"); } @@ -320,10 +337,13 @@ standby_mode=on recovery_target_timeline='latest' )); + my $ctl_options = ($Config{osname} eq "MSWin32") ? + "--listen-addresses=127.0.0.1 -p $port_master" : + "-k $tempdir_short --listen-addresses='' -p $port_master"; + # Restart the master to check that rewind went correctly system_or_bail('pg_ctl', '-w', '-D', $test_master_datadir, - '-o', "-k $tempdir_short --listen-addresses='' -p $port_master", - 'start'); + '-o', $ctl_options, 'start'); #### Now run the test-specific parts to check the result } @@ -334,12 +354,14 @@ sub clean_rewind_test if ($test_master_datadir) { system - 'pg_ctl', '-D', $test_master_datadir, '-m', 'immediate', 'stop'; + 'pg_ctl', '-D', $test_master_datadir, '-m', + 'immediate', 'stop'; } if ($test_standby_datadir) { system - 'pg_ctl', '-D', $test_standby_datadir, '-m', 'immediate', 'stop'; + 'pg_ctl', '-D', $test_standby_datadir, '-m', + 'immediate', 'stop'; } } diff --git a/src/bin/scripts/t/020_createdb.pl b/src/bin/scripts/t/020_createdb.pl index a44283c..7e769e4 100644 --- a/src/bin/scripts/t/020_createdb.pl +++ b/src/bin/scripts/t/020_createdb.pl @@ -1,5 +1,6 @@ use strict; use warnings; +use Config; use TestLib; use Test::More tests => 13; @@ -14,6 +15,8 @@ issues_sql_like( [ 'createdb', 'foobar1' ], qr/statement: CREATE DATABASE foobar1/, 'SQL CREATE DATABASE run'); + +my $encoding = ($Config{osname} eq "MSWin32") ? "win1252" : "LATIN1" ; issues_sql_like( [ 'createdb', '-l', 'C', '-E', 'LATIN1', '-T', 'template0', 'foobar2' ], qr/statement: CREATE DATABASE foobar2 ENCODING 'LATIN1'/, diff --git a/src/test/perl/TestLib.pm b/src/test/perl/TestLib.pm index 0193d57..02f29f7 100644 --- a/src/test/perl/TestLib.pm +++ b/src/test/perl/TestLib.pm @@ -3,6 +3,7 @@ package TestLib; use strict; use warnings; +use Config; use Exporter 'import'; our @EXPORT = qw( tempdir @@ -90,7 +91,6 @@ if (!$ENV{PGPORT}) $ENV{PGPORT} = int($ENV{PGPORT}) % 65536; - # # Helper functions # @@ -116,8 +116,8 @@ 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{TESTREGRESS}, + '--config-auth', $pgdata); } my ($test_server_datadir, $test_server_logfile); @@ -129,12 +129,15 @@ sub start_test_server my $tempdir_short = tempdir_short; + my $listen_addresses = ($Config{osname} eq "MSWin32") ? "127.0.0.1" : "''"; + print("### Starting test server in $tempdir\n"); standard_initdb "$tempdir/pgdata"; $ret = system_log('pg_ctl', '-D', "$tempdir/pgdata", '-w', '-l', "$tempdir/logfile", '-o', -"--fsync=off -k \"$tempdir_short\" --listen-addresses='' --log-statement=all", - 'start'); + "--fsync=off --listen-addresses=$listen_addresses --log-statement=all", + 'start'); + if ($ret != 0) { print "# pg_ctl failed; logfile:\n"; @@ -142,7 +145,7 @@ sub start_test_server BAIL_OUT("pg_ctl failed"); } - $ENV{PGHOST} = $tempdir_short; + $ENV{PGHOST} = ($Config{osname} eq "MSWin32") ? "127.0.0.1" : $tempdir_short; $test_server_datadir = "$tempdir/pgdata"; $test_server_logfile = "$tempdir/logfile"; } @@ -216,7 +219,9 @@ sub command_exit_is print("# Running: " . join(" ", @{$cmd}) ."\n"); my $h = start $cmd; $h->finish(); - is($h->result(0), $expected, $test_name); + my $result = ($Config{osname} eq "MSWin32") ? + ($h->full_results)[0] : $h->result(0); + is($result, $expected, $test_name); } sub program_help_ok diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm index 6b16e69..8abc81d 100644 --- a/src/tools/msvc/Solution.pm +++ b/src/tools/msvc/Solution.pm @@ -619,6 +619,7 @@ sub GetFakeConfigure $cfg .= ' --enable-integer-datetimes' if ($self->{options}->{integer_datetimes}); $cfg .= ' --enable-nls' if ($self->{options}->{nls}); + $cfg .= ' --enable-tap-tests' if ($self->{options}->{taptest}); $cfg .= ' --with-ldap' if ($self->{options}->{ldap}); $cfg .= ' --without-zlib' unless ($self->{options}->{zlib}); $cfg .= ' --with-extra-version' if ($self->{options}->{extraver}); diff --git a/src/tools/msvc/clean.bat b/src/tools/msvc/clean.bat index fbe3cc6..50c361e 100755 --- a/src/tools/msvc/clean.bat +++ b/src/tools/msvc/clean.bat @@ -88,6 +88,14 @@ 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\test\ssl\tmp_check rd /s /q src\test\ssl\tmp_check +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 diff --git a/src/tools/msvc/config_default.pl b/src/tools/msvc/config_default.pl index b9f2ff4..5b8c8cd 100644 --- a/src/tools/msvc/config_default.pl +++ b/src/tools/msvc/config_default.pl @@ -14,6 +14,7 @@ our $config = { # wal_blocksize => 8, # --with-wal-blocksize, 8kB by default # wal_segsize => 16, # --with-wal-segsize, 16MB by default ldap => 1, # --with-ldap + taptest => undef, # --enable-tap-tests extraver => undef, # --with-extra-version=<string> nls => undef, # --enable-nls=<path> tcl => undef, # --with-tls=<path> diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl index 6196383..4dcc155 100644 --- a/src/tools/msvc/vcregress.pl +++ b/src/tools/msvc/vcregress.pl @@ -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; @@ -79,6 +81,7 @@ my %command = ( CONTRIBCHECK => \&contribcheck, MODULESCHECK => \&modulescheck, ISOLATIONCHECK => \&isolationcheck, + TAPCHECK => \&tapcheck, UPGRADECHECK => \&upgradecheck,); my $proc = $command{$what}; @@ -172,6 +175,49 @@ sub isolationcheck exit $status if $status; } +sub tapcheck +{ + if (!defined($config->{taptest})) + { + print "TAP tests not enabled\n"; + exit 0; + } + + InstallTemp(); + + my @args = ( "prove", "--verbose", "t/*.pl"); + + $ENV{PATH} = "$tmp_installdir/bin;$ENV{PATH}"; + $ENV{PERL5LIB} = "$topdir/src/test/perl;$ENV{PERL5LIB}"; + $ENV{TESTREGRESS} = "$topdir/$Config/pg_regress/pg_regress"; + + # Find out all the existing TAP tests by simply looking for t/ + # 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) + { + next if ($test_path =~ /\/ssl\// && !defined($config->{openssl})); + + 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; + exit $status if $status; + } +} + sub plcheck { chdir $startdir; -- 2.4.5
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers