From 44d971f8d4187fa34dc7426b629eafeeb0af53c2 Mon Sep 17 00:00:00 2001
From: Michael Paquier <michael@paquier.xyz>
Date: Tue, 13 Jul 2021 10:51:20 +0900
Subject: [PATCH v5] Add some tests for pg_receivewal --compress

---
 src/bin/pg_basebackup/Makefile               |  6 ++-
 src/bin/pg_basebackup/t/020_pg_receivewal.pl | 46 +++++++++++++++++++-
 2 files changed, 50 insertions(+), 2 deletions(-)

diff --git a/src/bin/pg_basebackup/Makefile b/src/bin/pg_basebackup/Makefile
index 66e0070f1a..459d514183 100644
--- a/src/bin/pg_basebackup/Makefile
+++ b/src/bin/pg_basebackup/Makefile
@@ -18,8 +18,12 @@ subdir = src/bin/pg_basebackup
 top_builddir = ../../..
 include $(top_builddir)/src/Makefile.global
 
-# make this available to TAP test scripts
+# make these available to TAP test scripts
 export TAR
+# Note that GZIP cannot be used directly as this environment variable is
+# used by the command "gzip" to pass down options, so stick with a different
+# name.
+export GZIP_PROGRAM=$(GZIP)
 
 override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS)
 LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
diff --git a/src/bin/pg_basebackup/t/020_pg_receivewal.pl b/src/bin/pg_basebackup/t/020_pg_receivewal.pl
index a547c97ef1..9fa1a3378b 100644
--- a/src/bin/pg_basebackup/t/020_pg_receivewal.pl
+++ b/src/bin/pg_basebackup/t/020_pg_receivewal.pl
@@ -5,7 +5,7 @@ use strict;
 use warnings;
 use TestLib;
 use PostgresNode;
-use Test::More tests => 19;
+use Test::More tests => 23;
 
 program_help_ok('pg_receivewal');
 program_version_ok('pg_receivewal');
@@ -66,6 +66,50 @@ $primary->command_ok(
 	],
 	'streaming some WAL with --synchronous');
 
+# Check ZLIB compression if available.
+SKIP:
+{
+	skip "postgres was not build with ZLIB support", 4
+	  if (!check_pg_config("#define HAVE_LIBZ 1"));
+
+	# Generate more WAL.
+	$primary->psql('postgres', 'SELECT pg_switch_wal();');
+	$nextlsn =
+	  $primary->safe_psql('postgres', 'SELECT pg_current_wal_insert_lsn();');
+	chomp($nextlsn);
+	$primary->psql('postgres',
+		'INSERT INTO test_table VALUES (generate_series(100,200));');
+	$primary->psql('postgres', 'SELECT pg_switch_wal();');
+
+	$primary->command_ok(
+		[
+			'pg_receivewal', '-D',     $stream_dir,  '--verbose',
+			'--endpos',      $nextlsn, '--compress', '1'
+		],
+		"streaming some WAL using ZLIB compression");
+
+	# Verify that the stored files are generated with the expected names.
+	my @zlib_wals = glob "$stream_dir/*.gz";
+	is(scalar(@zlib_wals), 1,
+		"one WAL segment compressed with ZLIB was created");
+	my @zlib_partial_wals = glob "$stream_dir/*.gz.partial";
+	is(scalar(@zlib_partial_wals),
+		1, "one partial WAL segment compressed with ZLIB was created");
+
+	# There are two files compressed with ZLIB, check the integrity of
+	# all of them.
+	my $gzip = $ENV{GZIP_PROGRAM};
+	skip "program gzip is not found in your system", 1
+	  if ( !defined $gzip
+		|| $gzip eq ''
+		|| system_log($gzip, '--version') != 0);
+
+	push(@zlib_wals, @zlib_partial_wals);
+	my $gzip_is_valid = system_log($gzip, '--test', @zlib_wals);
+	is($gzip_is_valid, 0,
+		"gzip verified the integrity of compressed WAL segments");
+}
+
 # Permissions on WAL files should be default
 SKIP:
 {
-- 
2.32.0

