Check availability of module injection_points in TAP tests
authorMichael Paquier <michael@paquier.xyz>
Thu, 5 Sep 2024 04:29:43 +0000 (13:29 +0900)
committerMichael Paquier <michael@paquier.xyz>
Thu, 5 Sep 2024 04:29:43 +0000 (13:29 +0900)
This fixes defects with installcheck for TAP tests that expect the
module injection_points to exist in an installation, but the contents of
src/test/modules are not installed by default with installcheck.  This
would cause, for example, failures under installcheck-world for a build
with injection points enabled, when the contents of src/test/modules/
are not installed.

The availability of the module can be done with a scan of
pg_available_extension.  This has been introduced in 2cdcae9da696, and
it is refactored here as a new routine in Cluster.pm.

Tests are changed in different ways depending on what they need:
- The libpq TAP test sets up a node even without injection points, so it
is enough to check that CREATE EXTENSION can be used.  There is no need
for the variable enable_injection_points.
- In test_misc, 006_signal_autovacuum requires a runtime check.
- 041_checkpoint_at_promote in recovery tests and 005_timeouts in
test_misc are updated to use the routine introduced in Cluster.pm.
- test_slru's 001_multixact, injection_points's 001_stats and
modules/gin/ do not require a check as these modules disable
installcheck entirely.

Discussion: https://postgr.es/m/ZtesYQ-WupeAK7xK@paquier.xyz

src/interfaces/libpq/Makefile
src/interfaces/libpq/meson.build
src/interfaces/libpq/t/005_negotiate_encryption.pl
src/test/modules/test_misc/t/005_timeouts.pl
src/test/modules/test_misc/t/006_signal_autovacuum.pl
src/test/perl/PostgreSQL/Test/Cluster.pm
src/test/recovery/t/041_checkpoint_at_promote.pl

index 27f8499d8a7ef445802ba12014efdb0204761db4..c1bf33dbdc7a9f87cd7301b54641350d036b55fe 100644 (file)
@@ -15,7 +15,7 @@ subdir = src/interfaces/libpq
 top_builddir = ../../..
 include $(top_builddir)/src/Makefile.global
 
-export with_ssl with_gssapi with_krb_srvnam enable_injection_points
+export with_ssl with_gssapi with_krb_srvnam
 
 PGFILEDESC = "PostgreSQL Access Library"
 
index 7623aeadab740baeb0df43735bdecb674c551f3d..ed2a4048d18e21d9b9d8bc30ea76788d6c59d1cf 100644 (file)
@@ -121,7 +121,6 @@ tests += {
       't/005_negotiate_encryption.pl',
     ],
     'env': {
-      'enable_injection_points': get_option('injection_points') ? 'yes' : 'no',
       'with_ssl': ssl_library,
       'with_gssapi': gssapi.found() ? 'yes' : 'no',
       'with_krb_srvnam': 'postgres',
index 73f0056f10c58cb682e930e1420764f98cd1eab8..06d67de2db194d2297b9b0159977ad0049b624eb 100644 (file)
@@ -90,8 +90,6 @@ my $kerberos_enabled =
   $ENV{PG_TEST_EXTRA} && $ENV{PG_TEST_EXTRA} =~ /\bkerberos\b/;
 my $ssl_supported = $ENV{with_ssl} eq 'openssl';
 
-my $injection_points_supported = $ENV{enable_injection_points} eq 'yes';
-
 ###
 ### Prepare test server for GSSAPI and SSL authentication, with a few
 ### different test users and helper functions. We don't actually
@@ -151,6 +149,11 @@ if ($ssl_supported != 0)
 
 $node->start;
 
+# Check if the extension injection_points is available, as it may be
+# possible that this script is run with installcheck, where the module
+# would not be installed by default.
+my $injection_points_supported = $node->check_extension('injection_points');
+
 $node->safe_psql('postgres', 'CREATE USER localuser;');
 $node->safe_psql('postgres', 'CREATE USER testuser;');
 $node->safe_psql('postgres', 'CREATE USER ssluser;');
index 53e44016e3ae879d16dd99209c23ce2a898e063d..d9b72191216e73ae778c3b1b9e00e4d15e140c3e 100644 (file)
@@ -28,10 +28,7 @@ $node->start;
 # Check if the extension injection_points is available, as it may be
 # possible that this script is run with installcheck, where the module
 # would not be installed by default.
-my $result = $node->safe_psql('postgres',
-   "SELECT count(*) > 0 FROM pg_available_extensions WHERE name = 'injection_points';"
-);
-if ($result eq 'f')
+if (!$node->check_extension('injection_points'))
 {
    plan skip_all => 'Extension injection_points not installed';
 }
index 929253f7542a631573bef013126c2cb13118cead..aaea569c10199e9f057bf570656ba7e37d819f77 100644 (file)
@@ -25,6 +25,15 @@ $node->init;
 # This ensures a quick worker spawn.
 $node->append_conf('postgresql.conf', 'autovacuum_naptime = 1');
 $node->start;
+
+# Check if the extension injection_points is available, as it may be
+# possible that this script is run with installcheck, where the module
+# would not be installed by default.
+if (!$node->check_extension('injection_points'))
+{
+   plan skip_all => 'Extension injection_points not installed';
+}
+
 $node->safe_psql('postgres', 'CREATE EXTENSION injection_points;');
 
 $node->safe_psql(
index fe6ebf10f76cfe002859f8eebe14377c89dfcd72..143dc8c10153d70885c024d5a6de51c82f46d99a 100644 (file)
@@ -2837,6 +2837,28 @@ sub lsn
 
 =pod
 
+=item $node->check_extension(extension_name)
+
+Scan pg_available_extensions to check that an extension is available in an
+installation.
+
+Returns 1 if the extension is available, 0 otherwise.
+
+=cut
+
+sub check_extension
+{
+   my ($self, $extension_name) = @_;
+
+   my $result = $self->safe_psql('postgres',
+       "SELECT count(*) > 0 FROM pg_available_extensions WHERE name = '$extension_name';"
+   );
+
+   return $result eq 't' ? 1 : 0;
+}
+
+=pod
+
 =item $node->wait_for_event(wait_event_name, backend_type)
 
 Poll pg_stat_activity until backend_type reaches wait_event_name.
index 905662353da966ab269dd61577cc41ebd1caf2af..3c21d18e3aff01881bc421c3fd6a19e6fd96b2e5 100644 (file)
@@ -38,10 +38,7 @@ $node_primary->start;
 # Check if the extension injection_points is available, as it may be
 # possible that this script is run with installcheck, where the module
 # would not be installed by default.
-my $result = $node_primary->safe_psql('postgres',
-   "SELECT count(*) > 0 FROM pg_available_extensions WHERE name = 'injection_points';"
-);
-if ($result eq 'f')
+if (!$node_primary->check_extension('injection_points'))
 {
    plan skip_all => 'Extension injection_points not installed';
 }