summaryrefslogtreecommitdiff
path: root/src/test/perl/TestLib.pm
diff options
context:
space:
mode:
authorAndrew Dunstan <andrew@dunslane.net>2021-04-16 16:54:04 -0400
committerAndrew Dunstan <andrew@dunslane.net>2021-04-16 17:35:20 -0400
commite480c6dd33f40bf4a2ae561799b08a1cd7c3073b (patch)
treeeb0edd37c542bbff460795b20619f9ab8c99c753 /src/test/perl/TestLib.pm
parent0e8acd39ecdf9a68ebdaf9652a56b943f34c9c58 (diff)
Allow TestLib::slurp_file to skip contents, and use as needed
In order to avoid getting old logfile contents certain functions in PostgresNode were doing one of two things. On Windows it rotated the logfile and restarted the server, while elsewhere it truncated the log file. Both of these are unnecessary. We borrow from the buildfarm which does this instead: note the size of the logfile before we start, and then when fetching the logfile skip to that position before accumulating contents. This is spelled differently on Windows but the effect is the same. This is largely centralized in TestLib's slurp_file function, which has a new optional parameter, the offset to skip to before starting to reading the file. Code in the client becomes much neater. Backpatch to all live branches. Michael Paquier, slightly modified by me. Discussion: https://postgr.es/m/YHajnhcMAI3++pJL@paquier.xyz
Diffstat (limited to 'src/test/perl/TestLib.pm')
-rw-r--r--src/test/perl/TestLib.pm21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/test/perl/TestLib.pm b/src/test/perl/TestLib.pm
index a7490d2ce79..fecc6733da6 100644
--- a/src/test/perl/TestLib.pm
+++ b/src/test/perl/TestLib.pm
@@ -46,7 +46,7 @@ use warnings;
use Config;
use Cwd;
use Exporter 'import';
-use Fcntl qw(:mode);
+use Fcntl qw(:mode :seek);
use File::Basename;
use File::Find;
use File::Spec;
@@ -117,7 +117,7 @@ BEGIN
if ($windows_os)
{
require Win32API::File;
- Win32API::File->import(qw(createFile OsFHandleOpen CloseHandle));
+ Win32API::File->import(qw(createFile OsFHandleOpen CloseHandle setFilePointer));
}
# Specifies whether to use Unix sockets for test setups. On
@@ -402,21 +402,27 @@ sub slurp_dir
=pod
-=item slurp_file(filename)
+=item slurp_file(filename [, $offset])
-Return the full contents of the specified file.
+Return the full contents of the specified file, beginning from an
+offset position if specified.
=cut
sub slurp_file
{
- my ($filename) = @_;
+ my ($filename, $offset) = @_;
local $/;
my $contents;
if ($Config{osname} ne 'MSWin32')
{
open(my $in, '<', $filename)
or die "could not read \"$filename\": $!";
+ if (defined($offset))
+ {
+ seek($in, $offset, SEEK_SET)
+ or die "could not seek \"$filename\": $!";
+ }
$contents = <$in>;
close $in;
}
@@ -426,6 +432,11 @@ sub slurp_file
or die "could not open \"$filename\": $^E";
OsFHandleOpen(my $fh = IO::Handle->new(), $fHandle, 'r')
or die "could not read \"$filename\": $^E\n";
+ if (defined($offset))
+ {
+ setFilePointer($fh, $offset, qw(FILE_BEGIN))
+ or die "could not seek \"$filename\": $^E\n";
+ }
$contents = <$fh>;
CloseHandle($fHandle)
or die "could not close \"$filename\": $^E\n";