diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml index ecec0a60c7..b7651c5b33 100644 --- a/doc/src/sgml/install-windows.sgml +++ b/doc/src/sgml/install-windows.sgml @@ -452,7 +452,6 @@ $ENV{CONFIG}="Debug"; vcregress isolationcheck vcregress bincheck vcregress recoverycheck -vcregress upgradecheck To change the schedule used (default is parallel), append it to the diff --git a/src/bin/pg_upgrade/Makefile b/src/bin/pg_upgrade/Makefile index 8823288708..a78b39f3e5 100644 --- a/src/bin/pg_upgrade/Makefile +++ b/src/bin/pg_upgrade/Makefile @@ -35,9 +35,8 @@ clean distclean maintainer-clean: pg_upgrade_dump_globals.sql \ pg_upgrade_dump_*.custom pg_upgrade_*.log -check: test.sh all - MAKE=$(MAKE) bindir=$(bindir) libdir=$(libdir) EXTRA_REGRESS_OPTS="$(EXTRA_REGRESS_OPTS)" $(SHELL) $< --install +check: + $(prove_check) -# disabled because it upsets the build farm -#installcheck: test.sh -# MAKE=$(MAKE) bindir=$(bindir) libdir=$(libdir) $(SHELL) $< +installcheck: + $(prove_installcheck) diff --git a/src/bin/pg_upgrade/TESTING b/src/bin/pg_upgrade/TESTING index 4ecfc5798e..4885164d04 100644 --- a/src/bin/pg_upgrade/TESTING +++ b/src/bin/pg_upgrade/TESTING @@ -61,7 +61,7 @@ steps: 7) Diff the regression database dump file with the regression dump file loaded into the old server. -The shell script test.sh in this directory performs more or less this +The TAP test scripts in this directory perform more or less this procedure. You can invoke it by running make check @@ -69,13 +69,3 @@ procedure. You can invoke it by running or by running make installcheck - -if "make install" (or "make install-world") were done beforehand. -When invoked without arguments, it will run an upgrade from the -version in this source tree to a new instance of the same version. To -test an upgrade from a different version, invoke it like this: - - make installcheck oldbindir=...otherversion/bin oldsrc=...somewhere/postgresql - -In this case, you will have to manually eyeball the resulting dump -diff for version-specific differences, as explained above. diff --git a/src/bin/pg_upgrade/t/010_pg_upgrade.pl b/src/bin/pg_upgrade/t/010_pg_upgrade.pl new file mode 100644 index 0000000000..9a956c96b3 --- /dev/null +++ b/src/bin/pg_upgrade/t/010_pg_upgrade.pl @@ -0,0 +1,96 @@ +# Set of tests for pg_upgrade. +use strict; +use warnings; +use Cwd; +use Config; +use File::Basename; +use IPC::Run; +use PostgresNode; +use TestLib; +use Test::More tests => 10; + +program_help_ok('pg_upgrade'); +program_version_ok('pg_upgrade'); +program_options_handling_ok('pg_upgrade'); + +# Generate a database with a name made of a range of ASCII characters. +sub generate_db +{ + my ($node, $from_char, $to_char) = @_; + + my $dbname = ''; + for my $i ($from_char .. $to_char) + { + next if $i == 7 || $i == 10 || $i == 13; # skip BEL, LF, and CR + $dbname = $dbname . sprintf('%c', $i); + } + $node->run_log(['createdb', '--port', $node->port, $dbname]); +} + +my $startdir = getcwd(); + +# From now on, the test of pg_upgrade consists in setting up an instance +# on which regression tests are run. This is the source instance used +# for the upgrade. Then a new, fresh instance is created, and is used +# as the target instance for the upgrade. Before running an upgrade a +# logical dump of the old instance is taken, and a second logical dump +# of the new instance is taken after the upgrade. The upgrade test +# passes if there are no differences after running pg_upgrade. + +# Temporary location for dumps taken +my $tempdir = TestLib::tempdir; + +# Initialize node to upgrade +my $oldnode = get_new_node('old_node'); +$oldnode->init; +$oldnode->start; + +# Creating databases with names covering most ASCII bytes +generate_db($oldnode, 1, 45); +generate_db($oldnode, 46, 90); +generate_db($oldnode, 91, 127); + +# Run regression tests on the old instance +chdir dirname($ENV{PG_REGRESS}); +$oldnode->run_log(['createdb', '--port', $oldnode->port, 'regression']); +#run_log([$ENV{PG_REGRESS}, '--schedule', './serial_schedule', +# '--dlpath', '.', '--bindir=', '--use-existing', +# '--port', $oldnode->port]); + +# Take a dump before performing the upgrade as a base comparison. +run_log(['pg_dumpall', '--port', $oldnode->port, '-f', "$tempdir/dump1.sql"]); + +# Move back to current directory, all logs generated need to be located +# at the origin. +chdir $startdir; + +# Update the instance. +$oldnode->stop; + +# pg_upgrade needs the location of the old and new binaries. This test +# relying on binaries being in PATH, so is pg_config. So fetch from it +# the real binary location. +my ($bindir, $stderr); +my $result = IPC::Run::run [ 'pg_config', '--bindir' ], '>', \$bindir, '2>', \$stderr; +chomp($bindir); + +# Initialize a new node for the upgrade. +my $newnode = get_new_node('new_node'); +$newnode->init; + +# Time for the real run. +run_log(['pg_upgrade', '-d', $oldnode->data_dir, -D, $newnode->data_dir, + '-b', $bindir, '-B', $bindir, '-p', $oldnode->port, '-P', $newnode->port]); +$newnode->start; + +# Take a second dump on the upgraded instance. +run_log(['pg_dumpall', '--port', $newnode->port, '-f', "$tempdir/dump2.sql"]); + +# Cleanup the old cluster data. +my $delete_script = $TestLib::windows_os ? "$startdir/delete_old_cluster.bat" : + "$startdir/delete_old_cluster.sh"; +command_ok([$delete_script], "Deletion of old cluster data"); + +# Compare the two dumps, there should be no differences. +command_ok(['diff', '-q', "$tempdir/dump1.sql", "$tempdir/dump2.sql"], + 'Old and new dump checks after pg_upgrade'); diff --git a/src/bin/pg_upgrade/test.sh b/src/bin/pg_upgrade/test.sh deleted file mode 100644 index cbc5259550..0000000000 --- a/src/bin/pg_upgrade/test.sh +++ /dev/null @@ -1,248 +0,0 @@ -#!/bin/sh - -# src/bin/pg_upgrade/test.sh -# -# Test driver for pg_upgrade. Initializes a new database cluster, -# runs the regression tests (to put in some data), runs pg_dumpall, -# runs pg_upgrade, runs pg_dumpall again, compares the dumps. -# -# Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group -# Portions Copyright (c) 1994, Regents of the University of California - -set -e - -: ${MAKE=make} - -# Guard against parallel make issues (see comments in pg_regress.c) -unset MAKEFLAGS -unset MAKELEVEL - -# Run a given "initdb" binary and overlay the regression testing -# authentication configuration. -standard_initdb() { - "$1" -N - if [ -n "$TEMP_CONFIG" -a -r "$TEMP_CONFIG" ] - then - cat "$TEMP_CONFIG" >> "$PGDATA/postgresql.conf" - fi - ../../test/regress/pg_regress --config-auth "$PGDATA" -} - -# Establish how the server will listen for connections -testhost=`uname -s` - -case $testhost in - MINGW*) - LISTEN_ADDRESSES="localhost" - PGHOST=localhost - ;; - *) - LISTEN_ADDRESSES="" - # Select a socket directory. The algorithm is from the "configure" - # script; the outcome mimics pg_regress.c:make_temp_sockdir(). - PGHOST=$PG_REGRESS_SOCK_DIR - if [ "x$PGHOST" = x ]; then - { - dir=`(umask 077 && - mktemp -d /tmp/pg_upgrade_check-XXXXXX) 2>/dev/null` && - [ -d "$dir" ] - } || - { - dir=/tmp/pg_upgrade_check-$$-$RANDOM - (umask 077 && mkdir "$dir") - } || - { - echo "could not create socket temporary directory in \"/tmp\"" - exit 1 - } - - PGHOST=$dir - trap 'rm -rf "$PGHOST"' 0 - trap 'exit 3' 1 2 13 15 - fi - ;; -esac - -POSTMASTER_OPTS="-F -c listen_addresses=$LISTEN_ADDRESSES -k \"$PGHOST\"" -export PGHOST - -# don't rely on $PWD here, as old shells don't set it -temp_root=`pwd`/tmp_check - -if [ "$1" = '--install' ]; then - temp_install=$temp_root/install - bindir=$temp_install/$bindir - libdir=$temp_install/$libdir - - "$MAKE" -s -C ../.. install DESTDIR="$temp_install" - - # platform-specific magic to find the shared libraries; see pg_regress.c - LD_LIBRARY_PATH=$libdir:$LD_LIBRARY_PATH - export LD_LIBRARY_PATH - DYLD_LIBRARY_PATH=$libdir:$DYLD_LIBRARY_PATH - export DYLD_LIBRARY_PATH - LIBPATH=$libdir:$LIBPATH - export LIBPATH - SHLIB_PATH=$libdir:$SHLIB_PATH - export SHLIB_PATH - PATH=$libdir:$PATH - - # We need to make it use psql from our temporary installation, - # because otherwise the installcheck run below would try to - # use psql from the proper installation directory, which might - # be outdated or missing. But don't override anything else that's - # already in EXTRA_REGRESS_OPTS. - EXTRA_REGRESS_OPTS="$EXTRA_REGRESS_OPTS --bindir='$bindir'" - export EXTRA_REGRESS_OPTS -fi - -: ${oldbindir=$bindir} - -: ${oldsrc=../../..} -oldsrc=`cd "$oldsrc" && pwd` -newsrc=`cd ../../.. && pwd` - -PATH=$bindir:$PATH -export PATH - -BASE_PGDATA=$temp_root/data -PGDATA="$BASE_PGDATA.old" -export PGDATA -rm -rf "$BASE_PGDATA" "$PGDATA" - -logdir=`pwd`/log -rm -rf "$logdir" -mkdir "$logdir" - -# Clear out any environment vars that might cause libpq to connect to -# the wrong postmaster (cf pg_regress.c) -# -# Some shells, such as NetBSD's, return non-zero from unset if the variable -# is already unset. Since we are operating under 'set -e', this causes the -# script to fail. To guard against this, set them all to an empty string first. -PGDATABASE=""; unset PGDATABASE -PGUSER=""; unset PGUSER -PGSERVICE=""; unset PGSERVICE -PGSSLMODE=""; unset PGSSLMODE -PGREQUIRESSL=""; unset PGREQUIRESSL -PGCONNECT_TIMEOUT=""; unset PGCONNECT_TIMEOUT -PGHOSTADDR=""; unset PGHOSTADDR - -# Select a non-conflicting port number, similarly to pg_regress.c -PG_VERSION_NUM=`grep '#define PG_VERSION_NUM' "$newsrc"/src/include/pg_config.h | awk '{print $3}'` -PGPORT=`expr $PG_VERSION_NUM % 16384 + 49152` -export PGPORT - -i=0 -while psql -X postgres /dev/null -do - i=`expr $i + 1` - if [ $i -eq 16 ] - then - echo port $PGPORT apparently in use - exit 1 - fi - PGPORT=`expr $PGPORT + 1` - export PGPORT -done - -# buildfarm may try to override port via EXTRA_REGRESS_OPTS ... -EXTRA_REGRESS_OPTS="$EXTRA_REGRESS_OPTS --port=$PGPORT" -export EXTRA_REGRESS_OPTS - -# enable echo so the user can see what is being executed -set -x - -standard_initdb "$oldbindir"/initdb -"$oldbindir"/pg_ctl start -l "$logdir/postmaster1.log" -o "$POSTMASTER_OPTS" -w - -# Create databases with names covering the ASCII bytes other than NUL, BEL, -# LF, or CR. BEL would ring the terminal bell in the course of this test, and -# it is not otherwise a special case. PostgreSQL doesn't support the rest. -dbname1=`awk 'BEGIN { for (i= 1; i < 46; i++) - if (i != 7 && i != 10 && i != 13) printf "%c", i }' "$temp_root"/dump1.sql - fi -else - make_installcheck_status=$? -fi -"$oldbindir"/pg_ctl -m fast stop -if [ -n "$createdb_status" ]; then - exit 1 -fi -if [ -n "$make_installcheck_status" ]; then - exit 1 -fi -if [ -n "$psql_fix_sql_status" ]; then - exit 1 -fi -if [ -n "$pg_dumpall1_status" ]; then - echo "pg_dumpall of pre-upgrade database cluster failed" - exit 1 -fi - -PGDATA=$BASE_PGDATA - -standard_initdb 'initdb' - -pg_upgrade $PG_UPGRADE_OPTS -d "${PGDATA}.old" -D "${PGDATA}" -b "$oldbindir" -B "$bindir" -p "$PGPORT" -P "$PGPORT" - -pg_ctl start -l "$logdir/postmaster2.log" -o "$POSTMASTER_OPTS" -w - -case $testhost in - MINGW*) cmd /c analyze_new_cluster.bat ;; - *) sh ./analyze_new_cluster.sh ;; -esac - -pg_dumpall -f "$temp_root"/dump2.sql || pg_dumpall2_status=$? -pg_ctl -m fast stop - -# no need to echo commands anymore -set +x -echo - -if [ -n "$pg_dumpall2_status" ]; then - echo "pg_dumpall of post-upgrade database cluster failed" - exit 1 -fi - -case $testhost in - MINGW*) cmd /c delete_old_cluster.bat ;; - *) sh ./delete_old_cluster.sh ;; -esac - -if diff "$temp_root"/dump1.sql "$temp_root"/dump2.sql >/dev/null; then - echo PASSED - exit 0 -else - echo "Files $temp_root/dump1.sql and $temp_root/dump2.sql differ" - echo "dumps were not identical" - exit 1 -fi diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl index 8933920d9b..7d6fb6200a 100644 --- a/src/tools/msvc/vcregress.pl +++ b/src/tools/msvc/vcregress.pl @@ -34,7 +34,7 @@ if (-e "src/tools/msvc/buildenv.pl") my $what = shift || ""; if ($what =~ -/^(check|installcheck|plcheck|contribcheck|modulescheck|ecpgcheck|isolationcheck|upgradecheck|bincheck|recoverycheck)$/i +/^(check|installcheck|plcheck|contribcheck|modulescheck|ecpgcheck|isolationcheck|bincheck|recoverycheck)$/i ) { $what = uc $what; @@ -89,8 +89,7 @@ my %command = ( MODULESCHECK => \&modulescheck, ISOLATIONCHECK => \&isolationcheck, BINCHECK => \&bincheck, - RECOVERYCHECK => \&recoverycheck, - UPGRADECHECK => \&upgradecheck,); + RECOVERYCHECK => \&recoverycheck,); my $proc = $command{$what}; @@ -382,126 +381,6 @@ sub standard_initdb $ENV{PGDATA}) == 0); } -# This is similar to appendShellString(). Perl system(@args) bypasses -# cmd.exe, so omit the caret escape layer. -sub quote_system_arg -{ - my $arg = shift; - - # Change N >= 0 backslashes before a double quote to 2N+1 backslashes. - $arg =~ s/(\\*)"/${\($1 . $1)}\\"/gs; - - # Change N >= 1 backslashes at end of argument to 2N backslashes. - $arg =~ s/(\\+)$/${\($1 . $1)}/gs; - - # Wrap the whole thing in unescaped double quotes. - return "\"$arg\""; -} - -# Generate a database with a name made of a range of ASCII characters, useful -# for testing pg_upgrade. -sub generate_db -{ - my ($prefix, $from_char, $to_char, $suffix) = @_; - - my $dbname = $prefix; - for my $i ($from_char .. $to_char) - { - next if $i == 7 || $i == 10 || $i == 13; # skip BEL, LF, and CR - $dbname = $dbname . sprintf('%c', $i); - } - $dbname .= $suffix; - - system('createdb', quote_system_arg($dbname)); - my $status = $? >> 8; - exit $status if $status; -} - -sub upgradecheck -{ - my $status; - my $cwd = getcwd(); - - # Much of this comes from the pg_upgrade test.sh script, - # but it only covers the --install case, and not the case - # where the old and new source or bin dirs are different. - # i.e. only this version to this version check. That's - # what pg_upgrade's "make check" does. - - $ENV{PGHOST} = 'localhost'; - $ENV{PGPORT} ||= 50432; - my $tmp_root = "$topdir/src/bin/pg_upgrade/tmp_check"; - (mkdir $tmp_root || die $!) unless -d $tmp_root; - my $upg_tmp_install = "$tmp_root/install"; # unshared temp install - print "Setting up temp install\n\n"; - Install($upg_tmp_install, "all", $config); - - # Install does a chdir, so change back after that - chdir $cwd; - my ($bindir, $libdir, $oldsrc, $newsrc) = - ("$upg_tmp_install/bin", "$upg_tmp_install/lib", $topdir, $topdir); - $ENV{PATH} = "$bindir;$ENV{PATH}"; - my $data = "$tmp_root/data"; - $ENV{PGDATA} = "$data.old"; - my $logdir = "$topdir/src/bin/pg_upgrade/log"; - (mkdir $logdir || die $!) unless -d $logdir; - print "\nRunning initdb on old cluster\n\n"; - standard_initdb() or exit 1; - print "\nStarting old cluster\n\n"; - my @args = ('pg_ctl', 'start', '-l', "$logdir/postmaster1.log"); - system(@args) == 0 or exit 1; - - print "\nCreating databases with names covering most ASCII bytes\n\n"; - generate_db("\\\"\\", 1, 45, "\\\\\"\\\\\\"); - generate_db('', 46, 90, ''); - generate_db('', 91, 127, ''); - - print "\nSetting up data for upgrading\n\n"; - installcheck(); - - # now we can chdir into the source dir - chdir "$topdir/src/bin/pg_upgrade"; - print "\nDumping old cluster\n\n"; - @args = ('pg_dumpall', '-f', "$tmp_root/dump1.sql"); - system(@args) == 0 or exit 1; - print "\nStopping old cluster\n\n"; - system("pg_ctl stop") == 0 or exit 1; - $ENV{PGDATA} = "$data"; - print "\nSetting up new cluster\n\n"; - standard_initdb() or exit 1; - print "\nRunning pg_upgrade\n\n"; - @args = ( - 'pg_upgrade', '-d', "$data.old", '-D', $data, '-b', - $bindir, '-B', $bindir); - system(@args) == 0 or exit 1; - print "\nStarting new cluster\n\n"; - @args = ('pg_ctl', '-l', "$logdir/postmaster2.log", 'start'); - system(@args) == 0 or exit 1; - print "\nSetting up stats on new cluster\n\n"; - system(".\\analyze_new_cluster.bat") == 0 or exit 1; - print "\nDumping new cluster\n\n"; - @args = ('pg_dumpall', '-f', "$tmp_root/dump2.sql"); - system(@args) == 0 or exit 1; - print "\nStopping new cluster\n\n"; - system("pg_ctl stop") == 0 or exit 1; - print "\nDeleting old cluster\n\n"; - system(".\\delete_old_cluster.bat") == 0 or exit 1; - print "\nComparing old and new cluster dumps\n\n"; - - @args = ('diff', '-q', "$tmp_root/dump1.sql", "$tmp_root/dump2.sql"); - system(@args); - $status = $?; - if (!$status) - { - print "PASSED\n"; - } - else - { - print "dumps not identical!\n"; - exit(1); - } -} - sub fetchRegressOpts { my $handle; @@ -607,7 +486,6 @@ sub usage " modulescheck run tests of modules in src/test/modules/\n", " plcheck run tests of PL languages\n", " recoverycheck run recovery test suite\n", - " upgradecheck run tests of pg_upgrade\n", "\nOptions for :\n", " serial serial mode\n", " parallel parallel mode\n";