From b40be6c497bf0410bb3103467998973dd060a494 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 11 Aug 2017 21:04:04 -0400 Subject: [PATCH 6/7] pg_archivecleanup: Add test suite --- src/bin/pg_archivecleanup/.gitignore | 2 + src/bin/pg_archivecleanup/Makefile | 7 ++ .../pg_archivecleanup/t/010_pg_archivecleanup.pl | 81 ++++++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 src/bin/pg_archivecleanup/t/010_pg_archivecleanup.pl diff --git a/src/bin/pg_archivecleanup/.gitignore b/src/bin/pg_archivecleanup/.gitignore index 804089070d..bd05d00156 100644 --- a/src/bin/pg_archivecleanup/.gitignore +++ b/src/bin/pg_archivecleanup/.gitignore @@ -1 +1,3 @@ /pg_archivecleanup + +/tmp_check/ diff --git a/src/bin/pg_archivecleanup/Makefile b/src/bin/pg_archivecleanup/Makefile index 5bda78490c..c5bf99db0f 100644 --- a/src/bin/pg_archivecleanup/Makefile +++ b/src/bin/pg_archivecleanup/Makefile @@ -25,3 +25,10 @@ uninstall: clean distclean maintainer-clean: rm -f pg_archivecleanup$(X) $(OBJS) + rm -rf tmp_check + +check: + $(prove_check) + +installcheck: + $(prove_installcheck) diff --git a/src/bin/pg_archivecleanup/t/010_pg_archivecleanup.pl b/src/bin/pg_archivecleanup/t/010_pg_archivecleanup.pl new file mode 100644 index 0000000000..c0a2e38cc9 --- /dev/null +++ b/src/bin/pg_archivecleanup/t/010_pg_archivecleanup.pl @@ -0,0 +1,81 @@ +use strict; +use warnings; +use TestLib; +use Test::More tests => 42; + +program_help_ok('pg_archivecleanup'); +program_version_ok('pg_archivecleanup'); +program_options_handling_ok('pg_archivecleanup'); + +my $tempdir = TestLib::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; + } +} + +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 restartfilename/, + 'fails if restart 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 parameters/, + 'fails with too many parameters'); + +command_fails_like(['pg_archivecleanup', $tempdir, 'foo'], + qr/invalid filename/, + '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 +{ + 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"); +} + +run_check('', 'pg_archivecleanup'); +run_check('.partial', 'pg_archivecleanup with .partial file'); +run_check('.00000020.backup', 'pg_archivecleanup with .backup file'); -- 2.14.0