Refactor log check logic for connect_ok/fails in PostgreSQL::Test::Cluster

This commit refactors a bit the code in charge of checking for log
patterns when connections fail or succeed, by moving the log pattern
checks into their own routine, for clarity.  This has come up as
something to improve while discussing the refactoring of find_in_log().

Backpatch down to 14 where these routines are used, to ease the
introduction of new tests that could rely on them.

Author: Vignesh C, Michael Paquier
Discussion: https://postgr.es/m/CALDaNm0YSiLpjCmajwLfidQrFOrLNKPQir7s__PeVvh9U3uoTQ@mail.gmail.com
Backpatch-through: 14
This commit is contained in:
Michael Paquier 2023-06-09 09:37:21 +09:00
parent 9a2dbc614e
commit 26eaf82e71
1 changed files with 65 additions and 56 deletions

View File

@ -2186,15 +2186,9 @@ If this regular expression is set, matches it with the output generated.
=item log_like => [ qr/required message/ ]
If given, it must be an array reference containing a list of regular
expressions that must match against the server log, using
C<Test::More::like()>.
=item log_unlike => [ qr/prohibited message/ ]
If given, it must be an array reference containing a list of regular
expressions that must NOT match against the server log. They will be
passed to C<Test::More::unlike()>.
See C<log_check(...)>.
=back
@ -2215,16 +2209,6 @@ sub connect_ok
$sql = "SELECT \$\$connected with $connstr\$\$";
}
my (@log_like, @log_unlike);
if (defined($params{log_like}))
{
@log_like = @{ $params{log_like} };
}
if (defined($params{log_unlike}))
{
@log_unlike = @{ $params{log_unlike} };
}
my $log_location = -s $self->logfile;
# Never prompt for a password, any callers of this routine should
@ -2245,20 +2229,7 @@ sub connect_ok
is($stderr, "", "$test_name: no stderr");
if (@log_like or @log_unlike)
{
my $log_contents =
PostgreSQL::Test::Utils::slurp_file($self->logfile, $log_location);
while (my $regex = shift @log_like)
{
like($log_contents, $regex, "$test_name: log matches");
}
while (my $regex = shift @log_unlike)
{
unlike($log_contents, $regex, "$test_name: log does not match");
}
}
$self->log_check($test_name, $log_location, %params);
}
=pod
@ -2278,7 +2249,7 @@ If this regular expression is set, matches it with the output generated.
=item log_unlike => [ qr/prohibited message/ ]
See C<connect_ok(...)>, above.
See C<log_check(...)>.
=back
@ -2289,16 +2260,6 @@ sub connect_fails
local $Test::Builder::Level = $Test::Builder::Level + 1;
my ($self, $connstr, $test_name, %params) = @_;
my (@log_like, @log_unlike);
if (defined($params{log_like}))
{
@log_like = @{ $params{log_like} };
}
if (defined($params{log_unlike}))
{
@log_unlike = @{ $params{log_unlike} };
}
my $log_location = -s $self->logfile;
# Never prompt for a password, any callers of this routine should
@ -2316,20 +2277,7 @@ sub connect_fails
like($stderr, $params{expected_stderr}, "$test_name: matches");
}
if (@log_like or @log_unlike)
{
my $log_contents =
PostgreSQL::Test::Utils::slurp_file($self->logfile, $log_location);
while (my $regex = shift @log_like)
{
like($log_contents, $regex, "$test_name: log matches");
}
while (my $regex = shift @log_unlike)
{
unlike($log_contents, $regex, "$test_name: log does not match");
}
}
$self->log_check($test_name, $log_location, %params);
}
=pod
@ -2535,6 +2483,67 @@ sub log_content
return PostgreSQL::Test::Utils::slurp_file($self->logfile);
}
=pod
=item $node->log_check($offset, $test_name, %parameters)
Check contents of server logs.
=over
=item $test_name
Name of test for error messages.
=item $offset
Offset of the log file.
=item log_like => [ qr/required message/ ]
If given, it must be an array reference containing a list of regular
expressions that must match against the server log, using
C<Test::More::like()>.
=item log_unlike => [ qr/prohibited message/ ]
If given, it must be an array reference containing a list of regular
expressions that must NOT match against the server log. They will be
passed to C<Test::More::unlike()>.
=back
=cut
sub log_check
{
my ($self, $test_name, $offset, %params) = @_;
my (@log_like, @log_unlike);
if (defined($params{log_like}))
{
@log_like = @{ $params{log_like} };
}
if (defined($params{log_unlike}))
{
@log_unlike = @{ $params{log_unlike} };
}
if (@log_like or @log_unlike)
{
my $log_contents =
PostgreSQL::Test::Utils::slurp_file($self->logfile, $offset);
while (my $regex = shift @log_like)
{
like($log_contents, $regex, "$test_name: log matches");
}
while (my $regex = shift @log_unlike)
{
unlike($log_contents, $regex, "$test_name: log does not match");
}
}
}
=pod