aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/test/modules/worker_spi/.gitignore2
-rw-r--r--src/test/modules/worker_spi/Makefile8
-rw-r--r--src/test/modules/worker_spi/dynamic.conf2
-rw-r--r--src/test/modules/worker_spi/expected/worker_spi.out50
-rw-r--r--src/test/modules/worker_spi/meson.build9
-rw-r--r--src/test/modules/worker_spi/sql/worker_spi.sql35
-rw-r--r--src/test/modules/worker_spi/t/001_worker_spi.pl80
7 files changed, 84 insertions, 102 deletions
diff --git a/src/test/modules/worker_spi/.gitignore b/src/test/modules/worker_spi/.gitignore
index 5dcb3ff9723..716e17f5a2a 100644
--- a/src/test/modules/worker_spi/.gitignore
+++ b/src/test/modules/worker_spi/.gitignore
@@ -1,4 +1,2 @@
# Generated subdirectories
-/log/
-/results/
/tmp_check/
diff --git a/src/test/modules/worker_spi/Makefile b/src/test/modules/worker_spi/Makefile
index cbf9b2e37fd..024b34cdbb3 100644
--- a/src/test/modules/worker_spi/Makefile
+++ b/src/test/modules/worker_spi/Makefile
@@ -6,13 +6,7 @@ EXTENSION = worker_spi
DATA = worker_spi--1.0.sql
PGFILEDESC = "worker_spi - background worker example"
-REGRESS = worker_spi
-
-# enable our module in shared_preload_libraries for dynamic bgworkers
-REGRESS_OPTS = --temp-config $(top_srcdir)/src/test/modules/worker_spi/dynamic.conf
-
-# Disable installcheck to ensure we cover dynamic bgworkers.
-NO_INSTALLCHECK = 1
+TAP_TESTS = 1
ifdef USE_PGXS
PG_CONFIG = pg_config
diff --git a/src/test/modules/worker_spi/dynamic.conf b/src/test/modules/worker_spi/dynamic.conf
deleted file mode 100644
index bfe015f6644..00000000000
--- a/src/test/modules/worker_spi/dynamic.conf
+++ /dev/null
@@ -1,2 +0,0 @@
-shared_preload_libraries = worker_spi
-worker_spi.database = contrib_regression
diff --git a/src/test/modules/worker_spi/expected/worker_spi.out b/src/test/modules/worker_spi/expected/worker_spi.out
deleted file mode 100644
index dc0a79bf759..00000000000
--- a/src/test/modules/worker_spi/expected/worker_spi.out
+++ /dev/null
@@ -1,50 +0,0 @@
-CREATE EXTENSION worker_spi;
-SELECT worker_spi_launch(4) IS NOT NULL;
- ?column?
-----------
- t
-(1 row)
-
--- wait until the worker completes its initialization
-DO $$
-DECLARE
- visible bool;
- loops int := 0;
-BEGIN
- LOOP
- visible := table_name IS NOT NULL
- FROM information_schema.tables
- WHERE table_schema = 'schema4' AND table_name = 'counted';
- IF visible OR loops > 120 * 10 THEN EXIT; END IF;
- PERFORM pg_sleep(0.1);
- loops := loops + 1;
- END LOOP;
-END
-$$;
-INSERT INTO schema4.counted VALUES ('total', 0), ('delta', 1);
-SELECT pg_reload_conf();
- pg_reload_conf
-----------------
- t
-(1 row)
-
--- wait until the worker has processed the tuple we just inserted
-DO $$
-DECLARE
- count int;
- loops int := 0;
-BEGIN
- LOOP
- count := count(*) FROM schema4.counted WHERE type = 'delta';
- IF count = 0 OR loops > 120 * 10 THEN EXIT; END IF;
- PERFORM pg_sleep(0.1);
- loops := loops + 1;
- END LOOP;
-END
-$$;
-SELECT * FROM schema4.counted;
- type | value
--------+-------
- total | 1
-(1 row)
-
diff --git a/src/test/modules/worker_spi/meson.build b/src/test/modules/worker_spi/meson.build
index a8cdfdeb36b..68870324c9e 100644
--- a/src/test/modules/worker_spi/meson.build
+++ b/src/test/modules/worker_spi/meson.build
@@ -25,12 +25,9 @@ tests += {
'name': 'worker_spi',
'sd': meson.current_source_dir(),
'bd': meson.current_build_dir(),
- 'regress': {
- 'sql': [
- 'worker_spi',
+ 'tap': {
+ 'tests': [
+ 't/001_worker_spi.pl',
],
- 'dbname': 'contrib_regression',
- 'regress_args': ['--temp-config', files('dynamic.conf')],
- 'runningcheck': false,
},
}
diff --git a/src/test/modules/worker_spi/sql/worker_spi.sql b/src/test/modules/worker_spi/sql/worker_spi.sql
deleted file mode 100644
index 4683523b29d..00000000000
--- a/src/test/modules/worker_spi/sql/worker_spi.sql
+++ /dev/null
@@ -1,35 +0,0 @@
-CREATE EXTENSION worker_spi;
-SELECT worker_spi_launch(4) IS NOT NULL;
--- wait until the worker completes its initialization
-DO $$
-DECLARE
- visible bool;
- loops int := 0;
-BEGIN
- LOOP
- visible := table_name IS NOT NULL
- FROM information_schema.tables
- WHERE table_schema = 'schema4' AND table_name = 'counted';
- IF visible OR loops > 120 * 10 THEN EXIT; END IF;
- PERFORM pg_sleep(0.1);
- loops := loops + 1;
- END LOOP;
-END
-$$;
-INSERT INTO schema4.counted VALUES ('total', 0), ('delta', 1);
-SELECT pg_reload_conf();
--- wait until the worker has processed the tuple we just inserted
-DO $$
-DECLARE
- count int;
- loops int := 0;
-BEGIN
- LOOP
- count := count(*) FROM schema4.counted WHERE type = 'delta';
- IF count = 0 OR loops > 120 * 10 THEN EXIT; END IF;
- PERFORM pg_sleep(0.1);
- loops := loops + 1;
- END LOOP;
-END
-$$;
-SELECT * FROM schema4.counted;
diff --git a/src/test/modules/worker_spi/t/001_worker_spi.pl b/src/test/modules/worker_spi/t/001_worker_spi.pl
new file mode 100644
index 00000000000..c2938713134
--- /dev/null
+++ b/src/test/modules/worker_spi/t/001_worker_spi.pl
@@ -0,0 +1,80 @@
+# Copyright (c) 2023, PostgreSQL Global Development Group
+
+# Test worker_spi module.
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+my $node = PostgreSQL::Test::Cluster->new('mynode');
+$node->init;
+$node->start;
+
+note "testing dynamic bgworkers";
+
+$node->safe_psql('postgres', 'CREATE EXTENSION worker_spi;');
+
+# Launch one dynamic worker, then wait for its initialization to complete.
+# This consists in making sure that a table name "counted" is created
+# on a new schema whose name includes the index defined in input argument
+# of worker_spi_launch().
+# By default, dynamic bgworkers connect to the "postgres" database.
+my $result =
+ $node->safe_psql('postgres', 'SELECT worker_spi_launch(4) IS NOT NULL;');
+is($result, 't', "dynamic bgworker launched");
+$node->poll_query_until(
+ 'postgres',
+ qq[SELECT count(*) > 0 FROM information_schema.tables
+ WHERE table_schema = 'schema4' AND table_name = 'counted';]);
+$node->safe_psql('postgres',
+ "INSERT INTO schema4.counted VALUES ('total', 0), ('delta', 1);");
+# Issue a SIGHUP on the node to force the worker to loop once, accelerating
+# this test.
+$node->reload;
+# Wait until the worker has processed the tuple that has just been inserted.
+$node->poll_query_until('postgres',
+ qq[SELECT count(*) FROM schema4.counted WHERE type = 'delta';], '0');
+$result = $node->safe_psql('postgres', 'SELECT * FROM schema4.counted;');
+is($result, qq(total|1), 'dynamic bgworker correctly consumed tuple data');
+
+note "testing bgworkers loaded with shared_preload_libraries";
+
+# Create the database first so as the workers can connect to it when
+# the library is loaded.
+$node->safe_psql('postgres', q(CREATE DATABASE mydb;));
+$node->safe_psql('mydb', 'CREATE EXTENSION worker_spi;');
+
+# Now load the module as a shared library.
+$node->append_conf(
+ 'postgresql.conf', q{
+shared_preload_libraries = 'worker_spi'
+worker_spi.database = 'mydb'
+worker_spi.total_workers = 3
+});
+$node->restart;
+
+# Check that bgworkers have been registered and launched.
+ok( $node->poll_query_until(
+ 'mydb',
+ qq[SELECT datname, count(datname) FROM pg_stat_activity
+ WHERE backend_type = 'worker_spi' GROUP BY datname;],
+ 'mydb|3'),
+ 'bgworkers all launched'
+) or die "Timed out while waiting for bgworkers to be launched";
+
+# Ask worker_spi to launch dynamic bgworkers with the library loaded, then
+# check their existence.
+my $worker1_pid = $node->safe_psql('mydb', 'SELECT worker_spi_launch(1);');
+my $worker2_pid = $node->safe_psql('mydb', 'SELECT worker_spi_launch(2);');
+ok( $node->poll_query_until(
+ 'mydb',
+ qq[SELECT datname, count(datname) FROM pg_stat_activity
+ WHERE backend_type = 'worker_spi dynamic' AND
+ pid IN ($worker1_pid, $worker2_pid) GROUP BY datname;],
+ 'mydb|2'),
+ 'dynamic bgworkers all launched'
+) or die "Timed out while waiting for dynamic bgworkers to be launched";
+
+done_testing();