0001-Add-tests-for-the-support-of-f-option-in-dropdb-util.patch
text/x-patch
Filename: 0001-Add-tests-for-the-support-of-f-option-in-dropdb-util.patch
Type: text/x-patch
Part: 0
Message:
Re: dropdb --force
Patch
Format: format-patch
Series: patch 0001
Subject: Add tests for the support of '-f' option in dropdb utility.
| File | + | − |
|---|---|---|
| src/bin/scripts/t/060_dropdb_force.pl | 122 | 0 |
From dc8fc7432fab576845ad7f89e221c544926496f1 Mon Sep 17 00:00:00 2001
From: Pavel Stehule <pavel.stehule@gmail.com>
Date: Fri, 22 Nov 2019 14:38:23 +0530
Subject: [PATCH 1/2] Add tests for the support of '-f' option in dropdb
utility.
Add tests for the support of '-f' option in dropdb utility and drop database
SQL.
---
src/bin/scripts/t/060_dropdb_force.pl | 122 ++++++++++++++++++++++++++++++++++
1 file changed, 122 insertions(+)
create mode 100644 src/bin/scripts/t/060_dropdb_force.pl
diff --git a/src/bin/scripts/t/060_dropdb_force.pl b/src/bin/scripts/t/060_dropdb_force.pl
new file mode 100644
index 0000000..446dc09
--- /dev/null
+++ b/src/bin/scripts/t/060_dropdb_force.pl
@@ -0,0 +1,122 @@
+#
+# Tests drop database with force option.
+#
+use strict;
+use warnings;
+use PostgresNode;
+use TestLib;
+use Test::More tests => 10;
+
+# To avoid hanging while expecting some specific input from a psql
+# instance being driven by us, add a timeout high enough that it
+# should never trigger even on very slow machines, unless something
+# is really wrong.
+my $psql_timeout = IPC::Run::timer(60);
+
+my $node = get_new_node('master');
+$node->init;
+$node->start;
+
+# Create database that will be dropped.
+$node->safe_psql('postgres', 'CREATE DATABASE foobar1');
+
+# Run psql, keeping session alive, so we have an alive backend to kill.
+my ($killme_stdin, $killme_stdout, $killme_stderr) = ('', '', '');
+my $killme = IPC::Run::start(
+ [
+ 'psql', '-X', '-qAt', '-v', 'ON_ERROR_STOP=1', '-f', '-', '-d',
+ $node->connstr('foobar1')
+ ],
+ '<',
+ \$killme_stdin,
+ '>',
+ \$killme_stdout,
+ '2>',
+ \$killme_stderr,
+ $psql_timeout);
+
+# Ensure killme process is active.
+$killme_stdin .= q[
+SELECT pg_backend_pid();
+];
+ok(TestLib::pump_until($killme, $psql_timeout, \$killme_stdout,
+ qr/[[:digit:]]+[\r\n]$/m), 'acquired pid');
+my $pid = $killme_stdout;
+chomp($pid);
+$killme_stdout = '';
+$killme_stderr = '';
+
+# Check the connections on foobar1 database.
+is($node->safe_psql('postgres', qq[SELECT pid FROM pg_stat_activity WHERE datname='foobar1' AND pid = $pid;]),
+ $pid, 'database foobar1 is used');
+
+$node->safe_psql('postgres', 'DROP DATABASE foobar1 WITH (FORCE)');
+
+# Check that psql sees the killed backend as having been terminated.
+$killme_stdin .= q[
+SELECT 1;
+];
+ok( TestLib::pump_until(
+ $killme,
+ $psql_timeout,
+ \$killme_stderr,
+ qr/FATAL: terminating connection due to administrator command/m
+ ),
+ "psql query died successfully after SIGTERM");
+$killme_stderr = '';
+$killme_stdout = '';
+$killme->finish;
+
+# Check database foobar1 does not exist.
+is($node->safe_psql('postgres', qq[SELECT EXISTS(SELECT * FROM pg_database WHERE datname='foobar1');]),
+ 'f', 'database foobar1 was removed');
+
+# Create database that will be dropped.
+$node->safe_psql('postgres', 'CREATE DATABASE foobar1');
+
+# Restart psql as the previous connection will be
+# terminated by previous drop database.
+($killme_stdin, $killme_stdout, $killme_stderr) = ('', '', '');
+$killme->run();
+
+# Acquire pid of new backend.
+$killme_stdin .= q[
+SELECT pg_backend_pid();
+];
+ok(TestLib::pump_until($killme, $psql_timeout, \$killme_stdout,
+ qr/[[:digit:]]+[\r\n]$/m), "acquired pid for SIGKILL");
+$pid = $killme_stdout;
+chomp($pid);
+$killme_stdout = '';
+$killme_stderr = '';
+
+# Check the connections on foobar1 database.
+is($node->safe_psql('postgres', qq[SELECT pid FROM pg_stat_activity WHERE datname='foobar1' AND pid = $pid;]),
+ $pid, 'database foobar1 is used');
+
+# Now drop database with dropdb --force command.
+$node->issues_sql_like(
+ [ 'dropdb', '--force', 'foobar1' ],
+ qr/statement: DROP DATABASE foobar1 WITH \(FORCE\);/,
+ 'SQL DROP DATABASE (FORCE) run');
+
+# Check that psql sees the killed backend as having been terminated.
+$killme_stdin .= q[
+SELECT 1;
+];
+ok( TestLib::pump_until(
+ $killme,
+ $psql_timeout,
+ \$killme_stderr,
+ qr/FATAL: terminating connection due to administrator command/m
+ ),
+ "psql query died successfully after SIGTERM");
+$killme_stderr = '';
+$killme_stdout = '';
+$killme->finish;
+
+# Check database foobar1 does not exist.
+is($node->safe_psql('postgres', qq[SELECT EXISTS(SELECT * FROM pg_database WHERE datname='foobar1');]),
+ 'f', 'database foobar1 was removed');
+
+$node->stop();
--
1.8.3.1