
# Copyright (c) 2021-2022, 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();
