From f2dad8de9af12852ac022e7b43c2996b343aeb23 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut 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 @@ Locale and Encoding Custom Server Settings - 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 . But note that not all tests can be + expected to pass cleanly with arbitrary settings. + + + + Extra options can be passed to the various initdb + commands that are run internally during test setup using the environment + variable PG_TEST_INITDB_EXTRA_OPTS. For example, to run a + test with checksums enabled and a custom WAL segment size and + work_mem setting, use: + +make check PG_TEST_INITDB_EXTRA_OPTS='-k --wal-segsize=4 -c work_mem=50MB' + + + + + For the core regression test suite and other tests driven by + pg_regress, custom run-time server settings can also be set in the PGOPTIONS environment variable (for settings - that allow this): + that allow this), for example: make check PGOPTIONS="-c debug_parallel_query=regress -c work_mem=50MB" + (This makes use of functionality provided by libpq; see for details.) + + + When running against a temporary installation, custom settings can also be set by supplying a pre-written postgresql.conf: @@ -405,11 +430,6 @@ Custom Server Settings - - This can be useful to enable additional logging, adjust resource limits, - or enable extra run-time checks such as . - 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