From c7f1bd57c13a4e0df9818b8ab65a59dbbc2a9e9e Mon Sep 17 00:00:00 2001 From: Andreas Karlsson Date: Sat, 13 Jun 2026 12:39:22 +0200 Subject: [PATCH] Wrap pg_regress in a TAP test to setup cluster automatically This makes the pg_regress tests much easier to run given that they then can run in a clean cluster and nobody has to start and stop a cluster manually. For some reason our Meson support did not run any TAP tests which means the tests are no longer runnable from Meson. This should likely be fixed as a separate pull request. --- .github/scripts/test.sh | 13 +---- .gitignore | 6 +-- Makefile | 25 --------- meson.build | 38 -------------- pg_stat_monitor.conf | 1 - regression/expected/database.out | 18 +++---- regression/expected/pgsm_query_id.out | 34 ++++++------- regression/expected/pgsm_query_id_1.out | 30 +++++------ regression/expected/pgsm_query_id_2.out | 28 +++++------ regression/expected/rollback.out | 34 ++++++------- regression/sql/database.sql | 6 +-- regression/sql/pgsm_query_id.sql | 6 +-- t/000_regress.pl | 67 +++++++++++++++++++++++++ 13 files changed, 150 insertions(+), 156 deletions(-) delete mode 100644 pg_stat_monitor.conf create mode 100644 t/000_regress.pl diff --git a/.github/scripts/test.sh b/.github/scripts/test.sh index 056e0826..82da2dcd 100755 --- a/.github/scripts/test.sh +++ b/.github/scripts/test.sh @@ -3,22 +3,13 @@ set -e SCRIPT_DIR="$(cd -- "$(dirname "$0")" >/dev/null 2>&1; pwd -P)" -PG_BIN_DIR=$(pg_config --bindir) cd "$SCRIPT_DIR/../../" PG_VERSION=$(pg_config --version | sed -n 's/PostgreSQL \([0-9]*\).*/\1/p') -OPTS='-c shared_preload_libraries=pg_stat_monitor' - if [ "$1" = sanitize ]; then - OPTS+=' -c max_stack_depth=8MB' + export PG_TEST_INITDB_EXTRA_OPTS='--set max_stack_depth=8MB' fi -$PG_BIN_DIR/pg_ctl -D regression_install -l regression_install.log init - -$PG_BIN_DIR/pg_ctl -D regression_install -l regression_install.log start -o "$OPTS" - -make installcheck - -$PG_BIN_DIR/pg_ctl -D regression_install stop +make installcheck PROVE_FLAGS=-f diff --git a/.gitignore b/.gitignore index 8ae048db..e5886248 100644 --- a/.gitignore +++ b/.gitignore @@ -68,8 +68,8 @@ dkms.conf typedefs*.list # test files -/regression.diffs -/regression.out -/results/ +/regression/regression.diffs +/regression/regression.out +/regression/results/ /t/results/ /tmp_check/ diff --git a/Makefile b/Makefile index 1f0c08b6..b3175c78 100644 --- a/Makefile +++ b/Makefile @@ -12,31 +12,6 @@ PGFILEDESC = "pg_stat_monitor - Query Performance Monitoring Tool for PostgreSQL LDFLAGS_SL += $(filter -lm, $(LIBS)) TAP_TESTS = 1 -REGRESS_OPTS = --temp-config $(top_srcdir)/contrib/pg_stat_monitor/pg_stat_monitor.conf --inputdir=regression -REGRESS = basic \ - version \ - guc \ - pgsm_query_id \ - functions \ - counters \ - relations \ - database \ - error_insert \ - application_name \ - application_name_unique \ - top_query \ - different_parent_queries \ - cmd_type \ - error \ - rows \ - squashing \ - tags \ - user \ - rollback \ - level_tracking \ - decode_error_level \ - parallel \ - histogram PG_CONFIG ?= pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) diff --git a/meson.build b/meson.build index 1ebac95d..e6a9428d 100644 --- a/meson.build +++ b/meson.build @@ -24,41 +24,3 @@ install_data( 'pg_stat_monitor--2.3--next.sql', kwargs: contrib_data_args, ) - -tests += { - 'name': 'pg_stat_monitor', - 'sd': meson.current_source_dir(), - 'bd': meson.current_build_dir(), - 'regress': { - 'sql': [ - 'application_name', - 'application_name_unique', - 'basic', - 'cmd_type', - 'counters', - 'database', - 'different_parent_queries', - 'error_insert', - 'error', - 'functions', - 'guc', - 'histogram', - 'level_tracking', - 'parallel', - 'pgsqm_query_id', - 'relations', - 'rows', - 'squashing', - 'state', - 'tags', - 'top_query', - 'user', - 'version' - ], - 'regress_args': ['--temp-config', files('pg_stat_monitor.conf')], - # Disabled because these tests require - # "shared_preload_libraries=pg_stat_monitor", which typical - # runningcheck users do not have (e.g. buildfarm clients). - 'runningcheck': false, - }, -} diff --git a/pg_stat_monitor.conf b/pg_stat_monitor.conf deleted file mode 100644 index 03796179..00000000 --- a/pg_stat_monitor.conf +++ /dev/null @@ -1 +0,0 @@ -shared_preload_libraries = 'pg_stat_monitor' diff --git a/regression/expected/database.out b/regression/expected/database.out index bd377f6a..e1a7fdb0 100644 --- a/regression/expected/database.out +++ b/regression/expected/database.out @@ -7,7 +7,7 @@ CREATE TABLE t2 (b int); \c db2 CREATE TABLE t3 (c int); CREATE TABLE t4 (d int); -\c contrib_regression +\c pgsm_regression SELECT pg_stat_monitor_reset(); pg_stat_monitor_reset ----------------------- @@ -26,15 +26,15 @@ SELECT * FROM t3,t4 WHERE t3.c = t4.d; ---+--- (0 rows) -\c contrib_regression +\c pgsm_regression DROP DATABASE db2; SELECT datname, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - datname | query ---------------------+--------------------------------------- - contrib_regression | DROP DATABASE db2 - db1 | SELECT * FROM t1,t2 WHERE t1.a = t2.b - db2 | SELECT * FROM t3,t4 WHERE t3.c = t4.d - contrib_regression | SELECT pg_stat_monitor_reset() + datname | query +-----------------+--------------------------------------- + pgsm_regression | DROP DATABASE db2 + db1 | SELECT * FROM t1,t2 WHERE t1.a = t2.b + db2 | SELECT * FROM t3,t4 WHERE t3.c = t4.d + pgsm_regression | SELECT pg_stat_monitor_reset() (4 rows) SELECT pg_stat_monitor_reset(); @@ -46,6 +46,6 @@ SELECT pg_stat_monitor_reset(); \c db1 DROP TABLE t1; DROP TABLE t2; -\c contrib_regression +\c pgsm_regression DROP DATABASE db1; DROP EXTENSION pg_stat_monitor; diff --git a/regression/expected/pgsm_query_id.out b/regression/expected/pgsm_query_id.out index 9dc29382..6533c68e 100644 --- a/regression/expected/pgsm_query_id.out +++ b/regression/expected/pgsm_query_id.out @@ -17,7 +17,7 @@ CREATE FUNCTION add(integer, integer) RETURNS integer LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT; -\c contrib_regression +\c pgsm_regression SELECT pg_stat_monitor_reset(); pg_stat_monitor_reset ----------------------- @@ -79,22 +79,22 @@ SELECT * FROM t3 where c = 20; --- (0 rows) -\c contrib_regression +\c pgsm_regression SELECT datname, pgsm_query_id, query, calls FROM pg_stat_monitor ORDER BY pgsm_query_id, query, datname; - datname | pgsm_query_id | query | calls ---------------------+---------------------+-----------------------------------------------------+------- - contrib_regression | 689150021118383254 | SELECT pg_stat_monitor_reset() | 1 - db1 | 1897482803466821995 | SELECT * FROM t2 | 3 - db1 | 1988437669671417938 | SELECT * FROM t1 | 1 - db2 | 1988437669671417938 | SELECT * FROM t1 | 1 - db1 | 2864453209316739369 | select $1 + $2 | 1 - db2 | 2864453209316739369 | select $1 + $2 | 1 - db2 | 6220142855706866455 | set pg_stat_monitor.pgsm_enable_pgsm_query_id = on | 1 - db2 | 6633979598391393345 | SELECT * FROM t3 where c = 20 | 1 - db1 | 8140395000078788481 | SELECT *, ADD(1, 2) FROM t1 | 1 - db2 | 8140395000078788481 | SELECT *, ADD(1, 2) FROM t1 | 1 - db2 | | SELECT * FROM t3 | 1 - db2 | | set pg_stat_monitor.pgsm_enable_pgsm_query_id = off | 1 + datname | pgsm_query_id | query | calls +-----------------+---------------------+-----------------------------------------------------+------- + pgsm_regression | 689150021118383254 | SELECT pg_stat_monitor_reset() | 1 + db1 | 1897482803466821995 | SELECT * FROM t2 | 3 + db1 | 1988437669671417938 | SELECT * FROM t1 | 1 + db2 | 1988437669671417938 | SELECT * FROM t1 | 1 + db1 | 2864453209316739369 | select $1 + $2 | 1 + db2 | 2864453209316739369 | select $1 + $2 | 1 + db2 | 6220142855706866455 | set pg_stat_monitor.pgsm_enable_pgsm_query_id = on | 1 + db2 | 6633979598391393345 | SELECT * FROM t3 where c = 20 | 1 + db1 | 8140395000078788481 | SELECT *, ADD(1, 2) FROM t1 | 1 + db2 | 8140395000078788481 | SELECT *, ADD(1, 2) FROM t1 | 1 + db2 | | SELECT * FROM t3 | 1 + db2 | | set pg_stat_monitor.pgsm_enable_pgsm_query_id = off | 1 (12 rows) SELECT pg_stat_monitor_reset(); @@ -111,7 +111,7 @@ DROP FUNCTION ADD; DROP TABLE t1; DROP TABLE t3; DROP FUNCTION ADD; -\c contrib_regression +\c pgsm_regression DROP DATABASE db1; DROP DATABASE db2; DROP EXTENSION pg_stat_monitor; diff --git a/regression/expected/pgsm_query_id_1.out b/regression/expected/pgsm_query_id_1.out index ecd519b5..085aa2d5 100644 --- a/regression/expected/pgsm_query_id_1.out +++ b/regression/expected/pgsm_query_id_1.out @@ -17,7 +17,7 @@ CREATE FUNCTION add(integer, integer) RETURNS integer LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT; -\c contrib_regression +\c pgsm_regression SELECT pg_stat_monitor_reset(); pg_stat_monitor_reset ----------------------- @@ -79,20 +79,20 @@ SELECT * FROM t3 where c = 20; --- (0 rows) -\c contrib_regression +\c pgsm_regression SELECT datname, pgsm_query_id, query, calls FROM pg_stat_monitor ORDER BY pgsm_query_id, query, datname; - datname | pgsm_query_id | query | calls ---------------------+---------------------+-----------------------------------------------------+------- - contrib_regression | 689150021118383254 | SELECT pg_stat_monitor_reset() | 1 - db1 | 1897482803466821995 | SELECT * FROM t2 | 3 - db1 | 1988437669671417938 | SELECT * FROM t1 | 1 - db2 | 1988437669671417938 | SELECT * FROM t1 | 1 - db2 | 6220142855706866455 | set pg_stat_monitor.pgsm_enable_pgsm_query_id = on | 1 - db2 | 6633979598391393345 | SELECT * FROM t3 where c = 20 | 1 - db1 | 8140395000078788481 | SELECT *, ADD(1, 2) FROM t1 | 1 - db2 | 8140395000078788481 | SELECT *, ADD(1, 2) FROM t1 | 1 - db2 | | SELECT * FROM t3 | 1 - db2 | | set pg_stat_monitor.pgsm_enable_pgsm_query_id = off | 1 + datname | pgsm_query_id | query | calls +-----------------+---------------------+-----------------------------------------------------+------- + pgsm_regression | 689150021118383254 | SELECT pg_stat_monitor_reset() | 1 + db1 | 1897482803466821995 | SELECT * FROM t2 | 3 + db1 | 1988437669671417938 | SELECT * FROM t1 | 1 + db2 | 1988437669671417938 | SELECT * FROM t1 | 1 + db2 | 6220142855706866455 | set pg_stat_monitor.pgsm_enable_pgsm_query_id = on | 1 + db2 | 6633979598391393345 | SELECT * FROM t3 where c = 20 | 1 + db1 | 8140395000078788481 | SELECT *, ADD(1, 2) FROM t1 | 1 + db2 | 8140395000078788481 | SELECT *, ADD(1, 2) FROM t1 | 1 + db2 | | SELECT * FROM t3 | 1 + db2 | | set pg_stat_monitor.pgsm_enable_pgsm_query_id = off | 1 (10 rows) SELECT pg_stat_monitor_reset(); @@ -109,7 +109,7 @@ DROP FUNCTION ADD; DROP TABLE t1; DROP TABLE t3; DROP FUNCTION ADD; -\c contrib_regression +\c pgsm_regression DROP DATABASE db1; DROP DATABASE db2; DROP EXTENSION pg_stat_monitor; diff --git a/regression/expected/pgsm_query_id_2.out b/regression/expected/pgsm_query_id_2.out index 2cac8c00..88ff43a1 100644 --- a/regression/expected/pgsm_query_id_2.out +++ b/regression/expected/pgsm_query_id_2.out @@ -17,7 +17,7 @@ CREATE FUNCTION add(integer, integer) RETURNS integer LANGUAGE SQL IMMUTABLE RETURNS NULL ON NULL INPUT; -\c contrib_regression +\c pgsm_regression SELECT pg_stat_monitor_reset(); pg_stat_monitor_reset ----------------------- @@ -79,19 +79,19 @@ SELECT * FROM t3 where c = 20; --- (0 rows) -\c contrib_regression +\c pgsm_regression SELECT datname, pgsm_query_id, query, calls FROM pg_stat_monitor ORDER BY pgsm_query_id, query, datname; - datname | pgsm_query_id | query | calls ---------------------+---------------------+-----------------------------------------------------+------- - contrib_regression | 689150021118383254 | SELECT pg_stat_monitor_reset() | 1 - db1 | 1897482803466821995 | SELECT * FROM t2 | 3 - db1 | 1988437669671417938 | SELECT * FROM t1 | 1 - db2 | 1988437669671417938 | SELECT * FROM t1 | 1 - db2 | 6633979598391393345 | SELECT * FROM t3 where c = 20 | 1 - db1 | 8140395000078788481 | SELECT *, ADD(1, 2) FROM t1 | 1 - db2 | 8140395000078788481 | SELECT *, ADD(1, 2) FROM t1 | 1 - db2 | | SELECT * FROM t3 | 1 - db2 | | set pg_stat_monitor.pgsm_enable_pgsm_query_id = off | 2 + datname | pgsm_query_id | query | calls +-----------------+---------------------+-----------------------------------------------------+------- + pgsm_regression | 689150021118383254 | SELECT pg_stat_monitor_reset() | 1 + db1 | 1897482803466821995 | SELECT * FROM t2 | 3 + db1 | 1988437669671417938 | SELECT * FROM t1 | 1 + db2 | 1988437669671417938 | SELECT * FROM t1 | 1 + db2 | 6633979598391393345 | SELECT * FROM t3 where c = 20 | 1 + db1 | 8140395000078788481 | SELECT *, ADD(1, 2) FROM t1 | 1 + db2 | 8140395000078788481 | SELECT *, ADD(1, 2) FROM t1 | 1 + db2 | | SELECT * FROM t3 | 1 + db2 | | set pg_stat_monitor.pgsm_enable_pgsm_query_id = off | 2 (9 rows) SELECT pg_stat_monitor_reset(); @@ -108,7 +108,7 @@ DROP FUNCTION ADD; DROP TABLE t1; DROP TABLE t3; DROP FUNCTION ADD; -\c contrib_regression +\c pgsm_regression DROP DATABASE db1; DROP DATABASE db2; DROP EXTENSION pg_stat_monitor; diff --git a/regression/expected/rollback.out b/regression/expected/rollback.out index 9505591c..7fe149db 100644 --- a/regression/expected/rollback.out +++ b/regression/expected/rollback.out @@ -12,12 +12,12 @@ BEGIN; INSERT INTO t VALUES (1); COMMIT; SELECT query, username, datname FROM pg_stat_monitor ORDER BY query COLLATE "C"; - query | username | datname ---------------------------------+----------+-------------------- - BEGIN | u | contrib_regression - COMMIT | u | contrib_regression - INSERT INTO t VALUES (1) | u | contrib_regression - SELECT pg_stat_monitor_reset() | u | contrib_regression + query | username | datname +--------------------------------+----------+----------------- + BEGIN | u | pgsm_regression + COMMIT | u | pgsm_regression + INSERT INTO t VALUES (1) | u | pgsm_regression + SELECT pg_stat_monitor_reset() | u | pgsm_regression (4 rows) SELECT pg_stat_monitor_reset(); @@ -31,12 +31,12 @@ BEGIN; INSERT INTO t VALUES (2); ROLLBACK; SELECT query, username, datname FROM pg_stat_monitor ORDER BY query COLLATE "C"; - query | username | datname ---------------------------------+----------+-------------------- - BEGIN | u | contrib_regression - INSERT INTO t VALUES (2) | u | contrib_regression - ROLLBACK | u | contrib_regression - SELECT pg_stat_monitor_reset() | u | contrib_regression + query | username | datname +--------------------------------+----------+----------------- + BEGIN | u | pgsm_regression + INSERT INTO t VALUES (2) | u | pgsm_regression + ROLLBACK | u | pgsm_regression + SELECT pg_stat_monitor_reset() | u | pgsm_regression (4 rows) SELECT pg_stat_monitor_reset(); @@ -52,12 +52,12 @@ ERROR: duplicate key value violates unique constraint "t_pkey" DETAIL: Key (a)=(1) already exists. ROLLBACK; SELECT query, username, datname FROM pg_stat_monitor ORDER BY query COLLATE "C"; - query | username | datname ---------------------------------+----------+-------------------- - BEGIN | u | contrib_regression - INSERT INTO t VALUES (1); | u | contrib_regression + query | username | datname +--------------------------------+----------+----------------- + BEGIN | u | pgsm_regression + INSERT INTO t VALUES (1); | u | pgsm_regression ROLLBACK | | - SELECT pg_stat_monitor_reset() | u | contrib_regression + SELECT pg_stat_monitor_reset() | u | pgsm_regression (4 rows) SELECT pg_stat_monitor_reset(); diff --git a/regression/sql/database.sql b/regression/sql/database.sql index 0e38754b..fe37da20 100644 --- a/regression/sql/database.sql +++ b/regression/sql/database.sql @@ -11,7 +11,7 @@ CREATE TABLE t2 (b int); CREATE TABLE t3 (c int); CREATE TABLE t4 (d int); -\c contrib_regression +\c pgsm_regression SELECT pg_stat_monitor_reset(); \c db1 SELECT * FROM t1,t2 WHERE t1.a = t2.b; @@ -19,7 +19,7 @@ SELECT * FROM t1,t2 WHERE t1.a = t2.b; \c db2 SELECT * FROM t3,t4 WHERE t3.c = t4.d; -\c contrib_regression +\c pgsm_regression DROP DATABASE db2; SELECT datname, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; @@ -29,6 +29,6 @@ SELECT pg_stat_monitor_reset(); DROP TABLE t1; DROP TABLE t2; -\c contrib_regression +\c pgsm_regression DROP DATABASE db1; DROP EXTENSION pg_stat_monitor; diff --git a/regression/sql/pgsm_query_id.sql b/regression/sql/pgsm_query_id.sql index f0d47c24..12e474f0 100644 --- a/regression/sql/pgsm_query_id.sql +++ b/regression/sql/pgsm_query_id.sql @@ -23,7 +23,7 @@ CREATE FUNCTION add(integer, integer) RETURNS integer IMMUTABLE RETURNS NULL ON NULL INPUT; -\c contrib_regression +\c pgsm_regression SELECT pg_stat_monitor_reset(); \c db1 SELECT * FROM t1; @@ -48,7 +48,7 @@ set pg_stat_monitor.pgsm_enable_pgsm_query_id = on; SELECT * FROM t3 where c = 20; -\c contrib_regression +\c pgsm_regression SELECT datname, pgsm_query_id, query, calls FROM pg_stat_monitor ORDER BY pgsm_query_id, query, datname; SELECT pg_stat_monitor_reset(); @@ -62,7 +62,7 @@ DROP TABLE t1; DROP TABLE t3; DROP FUNCTION ADD; -\c contrib_regression +\c pgsm_regression DROP DATABASE db1; DROP DATABASE db2; DROP EXTENSION pg_stat_monitor; diff --git a/t/000_regress.pl b/t/000_regress.pl new file mode 100644 index 00000000..b8bc38b7 --- /dev/null +++ b/t/000_regress.pl @@ -0,0 +1,67 @@ +#!/usr/bin/perl + +use strict; +use warnings FATAL => 'all'; +use IPC::Run; +use PostgreSQL::Test::Cluster; +use lib 't'; +use pgsm; + +my $orig_stdout; +my $orig_stderr; + +BEGIN +{ + # PostgreSQL's test suite redirects stdout/sterr to a log file so we need + # to save them before the redirection happens. + open($orig_stdout, '>&', \*STDOUT) or die $!; + open($orig_stderr, '>&', \*STDERR) or die $!; +} + +my @tests = qw( + basic + version + guc + pgsm_query_id + functions + counters + relations + database + error_insert + application_name + application_name_unique + top_query + different_parent_queries + cmd_type + error + rows + squashing + tags + user + rollback + level_tracking + decode_error_level + parallel + histogram +); + +my $node = PGSM->pgsm_init_pg; +$node->append_conf('postgresql.conf', + "shared_preload_libraries = 'pg_stat_monitor'"); +$node->start; + +IPC::Run::run [ + $ENV{PG_REGRESS}, + '--host' => $node->host, + '--port' => $node->port, + '--dbname' => 'pgsm_regression', + '--inputdir' => ($ENV{'top_builddir'} || '.') . '/regression', + '--outputdir' => ($ENV{'top_builddir'} || '.') . '/regression', + %{ $PGSM::PG_MAJOR_VERSION >= 16 ? { '--expecteddir' => ($ENV{'top_builddir'} || '.') . '/regression' } : {} }, + @tests, +], +'1>' => $orig_stdout, +'2>' => $orig_stderr +or exit $?; + +$node->stop;