From 33774978c78175095da9e6c276e8bcdb177725f8 Mon Sep 17 00:00:00 2001 From: Daniel Gustafsson Date: Fri, 22 Sep 2023 13:35:37 +0200 Subject: [PATCH] Avoid using internal test methods in SSL tests The SSL tests for pg_ctl restart with an incorrect key passphrase used the internal _update_pid method to set the pidfile after running pg_ctl manually instead of using the supplied ->restart method. This refactors the ->restart method to accept a fail_ok parameter like how ->start and ->stop does, and changes the SSL tests to use this instead. This removes the need to call internal test module functions. Reviewed-by: Melih Mutlu Reviewed-by: Heikki Linnakangas Discussion: https://postgr.es/m/F81643C4-D7B8-4C6B-AF18-B73839966279@yesql.se --- src/test/perl/PostgreSQL/Test/Cluster.pm | 31 ++++++++++++++++++------ src/test/ssl/t/001_ssltests.pl | 23 +++++++----------- 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm index 2a478ba6ed..c3d46c7c70 100644 --- a/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -1035,17 +1035,18 @@ sub reload =item $node->restart() -Wrapper for pg_ctl restart +Wrapper for pg_ctl restart. + +With optional extra param fail_ok => 1, returns 0 for failure +instead of bailing out. =cut sub restart { - my ($self) = @_; - my $port = $self->port; - my $pgdata = $self->data_dir; - my $logfile = $self->logfile; + my ($self, %params) = @_; my $name = $self->name; + my $ret; local %ENV = $self->_get_env(PGAPPNAME => undef); @@ -1053,11 +1054,25 @@ sub restart # -w is now the default but having it here does no harm and helps # compatibility with older versions. - PostgreSQL::Test::Utils::system_or_bail('pg_ctl', '-w', '-D', $pgdata, - '-l', $logfile, 'restart'); + $ret = PostgreSQL::Test::Utils::system_log( + 'pg_ctl', '-w', '-D', $self->data_dir, + '-l', $self->logfile, 'restart'); + + if ($ret != 0) + { + print "# pg_ctl restart failed; logfile:\n"; + print PostgreSQL::Test::Utils::slurp_file($self->logfile); + + # pg_ctl could have timed out, so check to see if there's a pid file; + # otherwise our END block will fail to shut down the new postmaster. + $self->_update_pid(-1); + + BAIL_OUT("pg_ctl restart failed") unless $params{fail_ok}; + return 0; + } $self->_update_pid(1); - return; + return 1; } =pod diff --git a/src/test/ssl/t/001_ssltests.pl b/src/test/ssl/t/001_ssltests.pl index 23248d71b0..a049fd2ff0 100644 --- a/src/test/ssl/t/001_ssltests.pl +++ b/src/test/ssl/t/001_ssltests.pl @@ -85,10 +85,8 @@ switch_server_cert( passphrase_cmd => 'echo wrongpassword', restart => 'no'); -command_fails( - [ 'pg_ctl', '-D', $node->data_dir, '-l', $node->logfile, 'restart' ], - 'restart fails with password-protected key file with wrong password'); -$node->_update_pid(0); +$result = $node->restart(fail_ok => 1); +is($result, 0, 'restart fails with password-protected key file with wrong password'); switch_server_cert( $node, @@ -98,10 +96,8 @@ switch_server_cert( passphrase_cmd => 'echo secret1', restart => 'no'); -command_ok( - [ 'pg_ctl', '-D', $node->data_dir, '-l', $node->logfile, 'restart' ], - 'restart succeeds with password-protected key file'); -$node->_update_pid(1); +$result = $node->restart(fail_ok => 1); +is($result, 1, 'restart succeeds with password-protected key file'); # Test compatibility of SSL protocols. # TLSv1.1 is lower than TLSv1.2, so it won't work. @@ -109,17 +105,16 @@ $node->append_conf( 'postgresql.conf', qq{ssl_min_protocol_version='TLSv1.2' ssl_max_protocol_version='TLSv1.1'}); -command_fails( - [ 'pg_ctl', '-D', $node->data_dir, '-l', $node->logfile, 'restart' ], - 'restart fails with incorrect SSL protocol bounds'); +$result = $node->restart(fail_ok => 1); +is($result, 0, 'restart fails with incorrect SSL protocol bounds'); + # Go back to the defaults, this works. $node->append_conf( 'postgresql.conf', qq{ssl_min_protocol_version='TLSv1.2' ssl_max_protocol_version=''}); -command_ok( - [ 'pg_ctl', '-D', $node->data_dir, '-l', $node->logfile, 'restart' ], - 'restart succeeds with correct SSL protocol bounds'); +$result = $node->restart(fail_ok => 1); +is($result, 1, 'restart succeeds with correct SSL protocol bounds'); ### Run client-side tests. ###