This patch allow to use custom postgres launcher for tests (tap&regress)
by setting  environment variable PGLAUNCHER.

Other known methods (like: https://wiki.postgresql.org/wiki/Valgrind)
requires
to perform installation, build system modifications, executable replacement
etc...

And proposed way is simpler and more flexible.


** Use-case: run checks under Valgrind


- prepare launcher

    echo 'exec valgrind postgres "$@"' > /tmp/pgvalgrind
    chmod +x /tmp/pgvalgrind

- execute regress tests under Valgrind

    PGLAUNCHER=/tmp/pgvalgrind TESTS=gin make check-tests

- execute concrete tap-test under Valgrind

    PGLAUNCHER=/tmp/pgvalgrind PROVE_TESTS=t/001_stream_rep.pl make \
        check -C src/test/recovery


** Use-case: execute tests with different postgres versions


- prepare multi-launcher

    cat <<EOF > /tmp/launcher
    cp -f `pwd`/src/backend/postgres.v*  \`pg_config --bindir\`
    exec postgres.v\$V "\$@"
    EOF
    chmod +x /tmp/launcher

- make some versions of postgres binary

    ./configure "CFLAGS=..." && make
    mv src/backend/postgres src/backend/postgres.v1

    ./configure "CFLAGS=..." && make
    mv src/backend/postgres src/backend/postgres.v2

- run checks with different postgres binaries

    PGLAUNCHER=/tmp/launcher V=1  make check -C contrib/bloom
    PGLAUNCHER=/tmp/launcher V=2  make check -C contrib/bloom
diff --git a/src/test/perl/PostgresNode.pm b/src/test/perl/PostgresNode.pm
index 9575268bd7..6c183be3a2 100644
--- a/src/test/perl/PostgresNode.pm
+++ b/src/test/perl/PostgresNode.pm
@@ -751,6 +751,7 @@ sub start
 	my $port   = $self->port;
 	my $pgdata = $self->data_dir;
 	my $name   = $self->name;
+	my @launcher = defined $ENV{PGLAUNCHER} ? ('-p', $ENV{PGLAUNCHER}) : ();
 	my $ret;
 
 	BAIL_OUT("node \"$name\" is already running") if defined $self->{_pid};
@@ -767,7 +768,7 @@ sub start
 		# Note: We set the cluster_name here, not in postgresql.conf (in
 		# sub init) so that it does not get copied to standbys.
 		$ret = TestLib::system_log('pg_ctl', '-D', $self->data_dir, '-l',
-			$self->logfile, '-o', "--cluster-name=$name", 'start');
+			$self->logfile, '-o', "--cluster-name=$name", @launcher, 'start');
 	}
 
 	if ($ret != 0)
@@ -867,6 +868,7 @@ sub restart
 	my $pgdata  = $self->data_dir;
 	my $logfile = $self->logfile;
 	my $name    = $self->name;
+	my @launcher = defined $ENV{PGLAUNCHER} ? ('-p', $ENV{PGLAUNCHER}) : ();
 
 	print "### Restarting node \"$name\"\n";
 
@@ -875,7 +877,7 @@ sub restart
 		delete $ENV{PGAPPNAME};
 
 		TestLib::system_or_bail('pg_ctl', '-D', $pgdata, '-l', $logfile,
-			'restart');
+			@launcher, 'restart');
 	}
 
 	$self->_update_pid(1);
diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c
index 92bd28dc5a..8104db30f0 100644
--- a/src/test/regress/pg_regress.c
+++ b/src/test/regress/pg_regress.c
@@ -2290,6 +2290,7 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
 		FILE	   *pg_conf;
 		const char *env_wait;
 		int			wait_seconds;
+		const char *env_launcher;
 
 		/*
 		 * Prepare the temp instance
@@ -2423,15 +2424,26 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
 		 * Start the temp postmaster
 		 */
 		header(_("starting postmaster"));
-		snprintf(buf, sizeof(buf),
-				 "\"%s%spostgres\" -D \"%s/data\" -F%s "
-				 "-c \"listen_addresses=%s\" -k \"%s\" "
-				 "> \"%s/log/postmaster.log\" 2>&1",
-				 bindir ? bindir : "",
-				 bindir ? "/" : "",
-				 temp_instance, debug ? " -d 5" : "",
-				 hostname ? hostname : "", sockdir ? sockdir : "",
-				 outputdir);
+		env_launcher = getenv("PGLAUNCHER");
+		if (env_launcher != NULL)
+			snprintf(buf, sizeof(buf),
+					"\"%s\" -D \"%s/data\" -F%s "
+					"-c \"listen_addresses=%s\" -k \"%s\" "
+					"> \"%s/log/postmaster.log\" 2>&1",
+					env_launcher,
+					temp_instance, debug ? " -d 5" : "",
+					hostname ? hostname : "", sockdir ? sockdir : "",
+					outputdir);
+		else
+			snprintf(buf, sizeof(buf),
+					"\"%s%spostgres\" -D \"%s/data\" -F%s "
+					"-c \"listen_addresses=%s\" -k \"%s\" "
+					"> \"%s/log/postmaster.log\" 2>&1",
+					bindir ? bindir : "",
+					bindir ? "/" : "",
+					temp_instance, debug ? " -d 5" : "",
+					hostname ? hostname : "", sockdir ? sockdir : "",
+					outputdir);
 		postmaster_pid = spawn_process(buf);
 		if (postmaster_pid == INVALID_PID)
 		{

Reply via email to