From a3bcf5f8613d54462174c70c8c442847b83d1ad2 Mon Sep 17 00:00:00 2001
From: Suraj Kharage <suraj.kharage@enterprisedb.com>
Date: Thu, 12 Dec 2019 16:51:08 +0530
Subject: [PATCH v2 3/3] Tap test case patch to verify the backup using
 --verify-backup option

Patch by Rajkumar Raghuwanshi
---
 src/bin/pg_basebackup/t/010_pg_basebackup.pl | 124 ++++++++++++++++++++++++++-
 1 file changed, 123 insertions(+), 1 deletion(-)

diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl
index b7d36b6..e1de0f5 100644
--- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl
+++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl
@@ -6,7 +6,7 @@ use File::Basename qw(basename dirname);
 use File::Path qw(rmtree);
 use PostgresNode;
 use TestLib;
-use Test::More tests => 106;
+use Test::More tests => 135;
 
 program_help_ok('pg_basebackup');
 program_version_ok('pg_basebackup');
@@ -329,6 +329,128 @@ SKIP:
 		'pg_replslot symlink copied as directory');
 	rmtree("$tempdir/backup1");
 
+	# verify backup cluster using --verify-backup options.
+	# take backup with default "NONE" manifest checksum option
+	$node->command_ok(
+		[
+			'pg_basebackup', '-D', "$tempdir/backup1",
+			"-T$shorter_tempdir/tblspc1=$tempdir/tbackup/tblspc_verify"
+		],
+		'plain backup with default manifest checksum with tablespaces succeeds');
+	ok(-f "$tempdir/backup1/PG_VERSION", 'backup1 created');
+	ok(-f "$tempdir/backup1/backup_manifest", 'backup_manifest file is present');
+	# verify plain backup with default NONE manifest-checksum.
+	$node->command_ok(
+		[
+			'pg_basebackup', '-D', "$tempdir/backup1", '--verify-backup'
+		],
+	        'plain backup with default manifest checksum is verified');
+
+	# --verify-backup without checksums should detect removed file, new file or changed size of a file
+	# delete a file from mapped tablespace
+	rmtree("$tempdir/tbackup/tblspc_verify/${tblspc1UnloggedBackupPath}_init");
+	# create a new file in backup cluster
+	open my $new_file_none, '>', "$tempdir/backup1/postgresql.new" or die "unable to create file postgresql.new";
+	close $new_file_none;
+	# append text to file to change file size
+	open my $modify_file_none, '>>', "$tempdir/backup1/postgresql.conf" or die "unable to open file postgresql.conf";
+	print $modify_file_none "port = 5555\n";
+	close $modify_file_none;
+	$node->command_checks_all(
+	        [ 'pg_basebackup', '-D', "$tempdir/backup1", '--verify-backup' ],
+	        0,
+	        [qr{^$}],
+	        [
+			qr/\Qpg_basebackup: missing file: $tblspc1UnloggedPath\E_init/,
+			qr/\Qpg_basebackup: extra file found: postgresql.new/,
+			qr/\Qpg_basebackup: size changed for file: postgresql.conf\E/
+		],
+	        'backup verification without checksum detected removed file, new file and changed size of a file');
+	rmtree("$tempdir/backup1");
+	rmtree("$tempdir/tbackup/tblspc_verify");
+
+	# take backup with SHA256 manifest checksum
+	$node->command_ok(
+		[
+			'pg_basebackup', '-D', "$tempdir/backup1", '--manifest-checksums', 'SHA256',
+			"-T$shorter_tempdir/tblspc1=$tempdir/tbackup/tblspc_verify"
+		],
+		'plain backup with SHA256 manifest checksum with tablespaces succeeds');
+	ok(-f "$tempdir/backup1/PG_VERSION", 'backup1 created');
+	ok(-f "$tempdir/backup1/backup_manifest", 'backup_manifest file is present');
+	# verify plain backup with SHA256 manifest-checksum.
+	$node->command_ok([ 'pg_basebackup', '-D', "$tempdir/backup1", '--verify-backup'],
+	        'plain backup with SHA256 manifest-checksum is verified');
+
+	# --verify-backup with SHA256 checksums should detect removed file, new file or modified file with and without size change
+	# delete a file from mapped tablespace
+	rmtree("$tempdir/tbackup/tblspc_verify/${tblspc1UnloggedBackupPath}_init");
+	# create a new file in backup cluster
+	open my $new_file_sha256, '>', "$tempdir/backup1/postgresql.new" or die "unable to create file postgresql.new";
+	close $new_file_sha256;
+	# append text to a file to change file size
+	open my $modify_file_sha256, '>>', "$tempdir/backup1/postgresql.conf" or die "unable to open file postgresql.conf";
+	print $modify_file_sha256 "port = 5555\n";
+	close $modify_file_sha256;
+	# replace text with same size from a file
+	open my $same_size_file_sha256, '>', "$tempdir/backup1/PG_VERSION" or die "unable to open file PG_VERSION";
+	print $same_size_file_sha256 "00";
+	close $same_size_file_sha256;
+	$node->command_checks_all(
+	        [ 'pg_basebackup', '-D', "$tempdir/backup1", '--verify-backup' ],
+	        0,
+	        [qr{^$}],
+	        [
+			qr/\Qpg_basebackup: missing file: $tblspc1UnloggedPath\E_init/,
+			qr/\Qpg_basebackup: extra file found: postgresql.new/,
+			qr/\Qpg_basebackup: checksum difference for file: PG_VERSION/,
+			qr/\Qpg_basebackup: size changed for file: postgresql.conf\E/
+		],
+	        'backup verification with SHA256 checksum detected removed file, new file and modified file with and without size change');
+	rmtree("$tempdir/backup1");
+	rmtree("$tempdir/tbackup/tblspc_verify");
+
+	# take backup with --manifest-checksums=CRC32C
+	$node->command_ok(
+		[
+			'pg_basebackup', '-D', "$tempdir/backup1", '--manifest-checksums', 'CRC32C',
+			"-T$shorter_tempdir/tblspc1=$tempdir/tbackup/tblspc_verify"
+		],
+		'plain backup with manifest-checksums=CRC32C with tablespaces succeeds');
+	ok(-f "$tempdir/backup1/PG_VERSION", 'backup1 created');
+	ok(-f "$tempdir/backup1/backup_manifest",'backup_manifest file is present');
+	# verify plain backup with CRC32C manifest-checksum.
+	$node->command_ok([ 'pg_basebackup', '-D', "$tempdir/backup1", '--verify-backup'],
+	        'plain backup with CRC32C manifest-checksum is verified');
+
+	# --verify-backup with CRC32C checksums should detect removed file, new file or modified file with and without size change
+	# delete a file from mapped tablespace
+	rmtree("$tempdir/tbackup/tblspc_verify/${tblspc1UnloggedBackupPath}_init");
+	# create a new file in backup cluster
+	open my $new_file_crc32c, '>', "$tempdir/backup1/postgresql.new" or die "unable to create file postgresql.new";
+	close $new_file_crc32c;
+	# append text to a file to change file size
+	open my $modify_file_crc32c, '>>', "$tempdir/backup1/postgresql.conf" or die "unable to open file postgresql.conf";
+	print $modify_file_crc32c "port = 5555\n";
+	close $modify_file_crc32c;
+	# replace text with same size from a file
+	open my $same_size_file_crc32c, '>', "$tempdir/backup1/PG_VERSION" or die "unable to open file PG_VERSION";
+	print $same_size_file_crc32c "00";
+	close $same_size_file_crc32c;
+	$node->command_checks_all(
+	        [ 'pg_basebackup', '-D', "$tempdir/backup1", '--verify-backup' ],
+	        0,
+	        [qr{^$}],
+	        [
+			qr/\Qpg_basebackup: missing file: $tblspc1UnloggedPath\E_init/,
+			qr/\Qpg_basebackup: extra file found: postgresql.new/,
+			qr/\Qpg_basebackup: checksum difference for file: PG_VERSION/,
+			qr/\Qpg_basebackup: size changed for file: postgresql.conf\E/
+		],
+	        'backup verification with CRC32C checksum detected removed file, new file and modified file with and without size change');
+	rmtree("$tempdir/backup1");
+	rmtree("$tempdir/tbackup/tblspc_verify");
+
 	mkdir "$tempdir/tbl=spc2";
 	$node->safe_psql('postgres', "DROP TABLE test1;");
 	$node->safe_psql('postgres', "DROP TABLE tblspc1_unlogged;");
-- 
1.8.3.1

