v0-0001-Allow-passing-extra-options-to-initdb-for-tests.patch

text/plain

Filename: v0-0001-Allow-passing-extra-options-to-initdb-for-tests.patch
Type: text/plain
Part: 0
Message: Allow passing extra options to initdb for tests

Patch

Format: format-patch
Series: patch v0-0001
Subject: Allow passing extra options to initdb for tests
File+
doc/src/sgml/regress.sgml 27 7
src/test/perl/PostgreSQL/Test/Cluster.pm 7 0
src/test/regress/pg_regress.c 6 1
From f2dad8de9af12852ac022e7b43c2996b343aeb23 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Tue, 6 Feb 2024 10:44:55 +0100
Subject: [PATCH v0] Allow passing extra options to initdb for tests

Setting the environment variable PG_TEST_INITDB_EXTRA_OPTS passes
extra options to initdb run by pg_regress or
PostgreSQL::Test::Cluster's init.
---
 doc/src/sgml/regress.sgml                | 34 +++++++++++++++++++-----
 src/test/perl/PostgreSQL/Test/Cluster.pm |  7 +++++
 src/test/regress/pg_regress.c            |  7 ++++-
 3 files changed, 40 insertions(+), 8 deletions(-)

diff --git a/doc/src/sgml/regress.sgml b/doc/src/sgml/regress.sgml
index 70d9bdefe1b..6a27aae3195 100644
--- a/doc/src/sgml/regress.sgml
+++ b/doc/src/sgml/regress.sgml
@@ -390,12 +390,37 @@ <title>Locale and Encoding</title>
    <title>Custom Server Settings</title>
 
    <para>
-    Custom server settings to use when running a regression test suite can be
+    There are several ways to use custom server settings when running a test
+    suite.  This can be useful to enable additional logging, adjust resource
+    limits, or enable extra run-time checks such as <xref
+    linkend="guc-debug-discard-caches"/>.  But note that not all tests can be
+    expected to pass cleanly with arbitrary settings.
+   </para>
+
+   <para>
+    Extra options can be passed to the various <command>initdb</command>
+    commands that are run internally during test setup using the environment
+    variable <envar>PG_TEST_INITDB_EXTRA_OPTS</envar>.  For example, to run a
+    test with checksums enabled and a custom WAL segment size and
+    <varname>work_mem</varname> setting, use:
+<screen>
+make check PG_TEST_INITDB_EXTRA_OPTS='-k --wal-segsize=4 -c work_mem=50MB'
+</screen>
+   </para>
+
+   <para>
+    For the core regression test suite and other tests driven by
+    <command>pg_regress</command>, custom run-time server settings can also be
     set in the <varname>PGOPTIONS</varname> environment variable (for settings
-    that allow this):
+    that allow this), for example:
 <screen>
 make check PGOPTIONS="-c debug_parallel_query=regress -c work_mem=50MB"
 </screen>
+    (This makes use of functionality provided by libpq; see <xref
+    linkend="libpq-connect-options"/> for details.)
+   </para>
+
+   <para>
     When running against a temporary installation, custom settings can also be
     set by supplying a pre-written <filename>postgresql.conf</filename>:
 <screen>
@@ -405,11 +430,6 @@ <title>Custom Server Settings</title>
 </screen>
    </para>
 
-   <para>
-    This can be useful to enable additional logging, adjust resource limits,
-    or enable extra run-time checks such as <xref
-    linkend="guc-debug-discard-caches"/>.
-   </para>
   </sect2>
 
   <sect2 id="regress-run-extra-tests">
diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm
index e2e70d0dbf9..07da74cf562 100644
--- a/src/test/perl/PostgreSQL/Test/Cluster.pm
+++ b/src/test/perl/PostgreSQL/Test/Cluster.pm
@@ -114,6 +114,7 @@ use Socket;
 use Test::More;
 use PostgreSQL::Test::Utils          ();
 use PostgreSQL::Test::BackgroundPsql ();
+use Text::ParseWords                 qw(shellwords);
 use Time::HiRes                      qw(usleep);
 use Scalar::Util                     qw(blessed);
 
@@ -519,6 +520,12 @@ sub init
 	$params{allows_streaming} = 0 unless defined $params{allows_streaming};
 	$params{has_archiving} = 0 unless defined $params{has_archiving};
 
+	my $initdb_extra_opts_env = $ENV{PG_TEST_INITDB_EXTRA_OPTS};
+	if (defined $initdb_extra_opts_env)
+	{
+		push @{ $params{extra} }, shellwords($initdb_extra_opts_env);
+	}
+
 	mkdir $self->backup_dir;
 	mkdir $self->archive_dir;
 
diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c
index c894005dac0..f1f6011ae0a 100644
--- a/src/test/regress/pg_regress.c
+++ b/src/test/regress/pg_regress.c
@@ -2306,6 +2306,7 @@ regression_main(int argc, char *argv[],
 		const char *keywords[4];
 		const char *values[4];
 		PGPing		rv;
+		const char *initdb_extra_opts_env;
 
 		/*
 		 * Prepare the temp instance
@@ -2327,6 +2328,8 @@ regression_main(int argc, char *argv[],
 		if (!directory_exists(buf))
 			make_directory(buf);
 
+		initdb_extra_opts_env = getenv("PG_TEST_INITDB_EXTRA_OPTS");
+
 		initStringInfo(&cmd);
 
 		/*
@@ -2339,7 +2342,7 @@ regression_main(int argc, char *argv[],
 		 * duplicate it until we require perl at build time.
 		 */
 		initdb_template_dir = getenv("INITDB_TEMPLATE");
-		if (initdb_template_dir == NULL || nolocale || debug)
+		if (initdb_template_dir == NULL || nolocale || debug || initdb_extra_opts_env)
 		{
 			note("initializing database system by running initdb");
 
@@ -2352,6 +2355,8 @@ regression_main(int argc, char *argv[],
 				appendStringInfoString(&cmd, " --debug");
 			if (nolocale)
 				appendStringInfoString(&cmd, " --no-locale");
+			if (initdb_extra_opts_env)
+				appendStringInfo(&cmd, " %s", initdb_extra_opts_env);
 			appendStringInfo(&cmd, " > \"%s/log/initdb.log\" 2>&1", outputdir);
 			fflush(NULL);
 			if (system(cmd.data))

base-commit: b83033c3cff556d520281aaec399e47b4f11edbe
-- 
2.43.0