Avoid using internal test methods in SSL tests
authorDaniel Gustafsson <dgustafsson@postgresql.org>
Fri, 22 Sep 2023 11:35:37 +0000 (13:35 +0200)
committerDaniel Gustafsson <dgustafsson@postgresql.org>
Fri, 22 Sep 2023 11:35:37 +0000 (13:35 +0200)
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 <m.melihmutlu@gmail.com>
Reviewed-by: Heikki Linnakangas <hlinnaka@iki.fi>
Discussion: https://postgr.es/m/F81643C4-D7B8-4C6B-AF18-B73839966279@yesql.se

src/test/perl/PostgreSQL/Test/Cluster.pm
src/test/ssl/t/001_ssltests.pl

index 2a478ba6ed7ec0f0138f481d6f7c5c861e6700d4..c3d46c7c7044b7a4d13b5fdb3668fa37644e6bf3 100644 (file)
@@ -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
index 23248d71b066a27a1f624810c39212b47f1f059a..a049fd2ff03a142fab23569601684f87ddb9af1a 100644 (file)
@@ -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.
 ###