108 lines
2.6 KiB
Perl
108 lines
2.6 KiB
Perl
|
|
# Copyright (c) 2021-2023, PostgreSQL Global Development Group
|
|
|
|
use strict;
|
|
use warnings;
|
|
use PostgreSQL::Test::Utils;
|
|
use Test::More;
|
|
|
|
program_help_ok('pg_archivecleanup');
|
|
program_version_ok('pg_archivecleanup');
|
|
program_options_handling_ok('pg_archivecleanup');
|
|
|
|
my $tempdir = PostgreSQL::Test::Utils::tempdir;
|
|
|
|
my @walfiles = (
|
|
'00000001000000370000000C.gz', '00000001000000370000000D',
|
|
'00000001000000370000000E', '00000001000000370000000F.partial',);
|
|
|
|
sub create_files
|
|
{
|
|
foreach my $fn (@walfiles, 'unrelated_file')
|
|
{
|
|
open my $file, '>', "$tempdir/$fn";
|
|
print $file 'CONTENT';
|
|
close $file;
|
|
}
|
|
return;
|
|
}
|
|
|
|
create_files();
|
|
|
|
command_fails_like(
|
|
['pg_archivecleanup'],
|
|
qr/must specify archive location/,
|
|
'fails if archive location is not specified');
|
|
|
|
command_fails_like(
|
|
[ 'pg_archivecleanup', $tempdir ],
|
|
qr/must specify oldest kept WAL file/,
|
|
'fails if oldest kept WAL file name is not specified');
|
|
|
|
command_fails_like(
|
|
[ 'pg_archivecleanup', 'notexist', 'foo' ],
|
|
qr/archive location .* does not exist/,
|
|
'fails if archive location does not exist');
|
|
|
|
command_fails_like(
|
|
[ 'pg_archivecleanup', $tempdir, 'foo', 'bar' ],
|
|
qr/too many command-line arguments/,
|
|
'fails with too many command-line arguments');
|
|
|
|
command_fails_like(
|
|
[ 'pg_archivecleanup', $tempdir, 'foo' ],
|
|
qr/invalid file name argument/,
|
|
'fails with invalid restart file name');
|
|
|
|
{
|
|
# like command_like but checking stderr
|
|
my $stderr;
|
|
my $result =
|
|
IPC::Run::run [ 'pg_archivecleanup', '-d', '-n', $tempdir,
|
|
$walfiles[2] ],
|
|
'2>', \$stderr;
|
|
ok($result, "pg_archivecleanup dry run: exit code 0");
|
|
like(
|
|
$stderr,
|
|
qr/$walfiles[1].*would be removed/,
|
|
"pg_archivecleanup dry run: matches");
|
|
foreach my $fn (@walfiles)
|
|
{
|
|
ok(-f "$tempdir/$fn", "$fn not removed");
|
|
}
|
|
}
|
|
|
|
sub run_check
|
|
{
|
|
local $Test::Builder::Level = $Test::Builder::Level + 1;
|
|
|
|
my ($suffix, $test_name) = @_;
|
|
|
|
create_files();
|
|
|
|
command_ok(
|
|
[
|
|
'pg_archivecleanup', '-x', '.gz', $tempdir,
|
|
$walfiles[2] . $suffix
|
|
],
|
|
"$test_name: runs");
|
|
|
|
ok(!-f "$tempdir/$walfiles[0]",
|
|
"$test_name: first older WAL file was cleaned up");
|
|
ok(!-f "$tempdir/$walfiles[1]",
|
|
"$test_name: second older WAL file was cleaned up");
|
|
ok(-f "$tempdir/$walfiles[2]",
|
|
"$test_name: restartfile was not cleaned up");
|
|
ok(-f "$tempdir/$walfiles[3]",
|
|
"$test_name: newer WAL file was not cleaned up");
|
|
ok(-f "$tempdir/unrelated_file",
|
|
"$test_name: unrelated file was not cleaned up");
|
|
return;
|
|
}
|
|
|
|
run_check('', 'pg_archivecleanup');
|
|
run_check('.partial', 'pg_archivecleanup with .partial file');
|
|
run_check('.00000020.backup', 'pg_archivecleanup with .backup file');
|
|
|
|
done_testing();
|