From f2d9a4c447f4b7a1e51c672aa8269cac6de6a500 Mon Sep 17 00:00:00 2001 From: Lee Dong Wook Date: Tue, 23 Aug 2022 10:18:58 +0900 Subject: [PATCH] pg_waldump: add test for coverage --- src/bin/pg_waldump/t/001_basic.pl | 39 ++++++ src/bin/pg_waldump/t/002_wal_type.pl | 180 +++++++++++++++++++++++++++ 2 files changed, 219 insertions(+) create mode 100644 src/bin/pg_waldump/t/002_wal_type.pl diff --git a/src/bin/pg_waldump/t/001_basic.pl b/src/bin/pg_waldump/t/001_basic.pl index 883adff8fa13..72f124bfb1f0 100644 --- a/src/bin/pg_waldump/t/001_basic.pl +++ b/src/bin/pg_waldump/t/001_basic.pl @@ -3,6 +3,7 @@ use strict; use warnings; +use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -10,4 +11,42 @@ program_version_ok('pg_waldump'); program_options_handling_ok('pg_waldump'); +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; + +my $wal_dump_path = $node->data_dir . "/pg_wal/000000010000000000000001"; +my ($stdout, $stderr); + +# test pg_waldump +IPC::Run::run [ 'pg_waldump', "$wal_dump_path" ], '>', \$stdout, '2>', \$stderr; +isnt($stdout, '', ""); + +# test pg_waldump with -p (path), -s (start), -e (end) options +IPC::Run::run [ 'pg_waldump', "$wal_dump_path", '-s', '0/0132C160', '-e', '0/018C41A0' ], '>', \$stdout, '2>', \$stderr; +isnt($stdout, '', ""); + +# test pg_waldump with -p (path), -s (start), -e (end) options -z (stats) +IPC::Run::run [ 'pg_waldump', "$wal_dump_path", '-s', '0/0132C160', '-e', '0/018C41A0', '-z' ], '>', \$stdout, '2>', \$stderr; +isnt($stdout, '', ""); + +# test pg_waldump with -F (main) +IPC::Run::run [ 'pg_waldump', "$wal_dump_path", '-F', 'main' ], '>', \$stdout, '2>', \$stderr; +isnt($stdout, '', ""); + +# test pg_waldump with -F (fsm) +IPC::Run::run [ 'pg_waldump', "$wal_dump_path", '-F', 'fsm' ], '>', \$stdout, '2>', \$stderr; +is($stdout, '', ""); + +# test pg_waldump with -F (vm) +IPC::Run::run [ 'pg_waldump', "$wal_dump_path", '-F', 'vm' ], '>', \$stdout, '2>', \$stderr; +isnt($stdout, '', ""); + +# test pg_waldump with -F (init) +IPC::Run::run [ 'pg_waldump', "$wal_dump_path", '-F', 'init' ], '>', \$stdout, '2>', \$stderr; +is($stdout, '', ""); + +# test pg_waldump with -q +IPC::Run::run [ 'pg_waldump', "$wal_dump_path", '-F', 'init' ], '>', \$stdout, '2>', \$stderr; +is($stdout, '', ""); done_testing(); + diff --git a/src/bin/pg_waldump/t/002_wal_type.pl b/src/bin/pg_waldump/t/002_wal_type.pl new file mode 100644 index 000000000000..d69ddf3a39d0 --- /dev/null +++ b/src/bin/pg_waldump/t/002_wal_type.pl @@ -0,0 +1,180 @@ + +# Copyright (c) 2021-2022, PostgreSQL Global Development Group + +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->append_conf('postgresql.conf', + "track_commit_timestamp = on\n" + . "archive_mode=on\n" + . "archive_command='/bin/false'\n" + . "wal_level=logical"); + +# test pg_waldump with xlog files. +my $source_ts_path = PostgreSQL::Test::Utils::tempdir_short(); +my $pg_wal_dir = $node->data_dir . "/pg_wal/"; +my ($stdout, $stderr); + +# test pg_waldump with hash index +$node->start; +$node->safe_psql('postgres', + 'BEGIN;' + . 'CREATE TABLE hash_idx_tbl ( + id int + );' + . 'CREATE INDEX ON hash_idx_tbl USING hash (id);' + . 'COMMIT;' + . 'BEGIN;' + . 'INSERT INTO hash_idx_tbl + SELECT generate_series(1, 1000);' + . 'COMMIT;' + . 'select pg_switch_wal();' +); +$node->stop; + +# track_commit_timestamp off +$node->append_conf('postgresql.conf', + "track_commit_timestamp = off"); + +# test pg_waldump with gin index +$node->start; +$node->safe_psql('postgres', + 'BEGIN;' + . 'CREATE TABLE gin_idx_tbl ( + id bigserial PRIMARY KEY, + data jsonb + );' + . 'CREATE INDEX ON gin_idx_tbl USING gin (data);' + . 'COMMIT;' + . 'BEGIN;' + . "INSERT INTO gin_idx_tbl + WITH random_json AS ( + SELECT json_object_agg(key, trunc(random() * 10)) as json_data + FROM unnest(array['a', 'b', 'c']) as u(key)) + SELECT generate_series(1,500), json_data FROM random_json;" + . 'COMMIT;' + . 'select pg_switch_wal();' +); +$node->stop; + +# track_commit_timestamp on +$node->append_conf('postgresql.conf', + "track_commit_timestamp = on"); + +## test pg_waldump with gist index +$node->start; +$node->safe_psql('postgres', + 'BEGIN;' + . 'CREATE TABLE gist_idx_tbl ( + p point + );' + . 'CREATE INDEX ON gist_idx_tbl USING gist (p);' + . 'COMMIT;' + . 'BEGIN;' + . 'INSERT INTO gist_idx_tbl(p) values (point \'(1,1)\');' + . 'INSERT INTO gist_idx_tbl(p) values (point \'(3,2)\');' + . 'INSERT INTO gist_idx_tbl(p) values (point \'(6,3)\');' + . 'INSERT INTO gist_idx_tbl(p) values (point \'(5,5)\');' + . 'INSERT INTO gist_idx_tbl(p) values (point \'(7,8)\');' + . 'INSERT INTO gist_idx_tbl(p) values (point \'(8,6)\');' + . 'INSERT INTO gist_idx_tbl(p) values (point \'(9,19)\');' + . 'COMMIT;' + . 'select pg_switch_wal();' +); +$node->stop; + + +## test pg_waldump with spgist index +$node->start; +$node->safe_psql('postgres', + 'BEGIN;' + . 'CREATE TABLE spgist_idx_tbl ( + p point + );' + . 'CREATE INDEX ON spgist_idx_tbl USING spgist (p);' + . 'COMMIT;' + . 'BEGIN;' + . 'INSERT INTO spgist_idx_tbl(p) values (point \'(1,1)\');' + . 'INSERT INTO spgist_idx_tbl(p) values (point \'(3,2)\');' + . 'INSERT INTO spgist_idx_tbl(p) values (point \'(6,3)\');' + . 'INSERT INTO spgist_idx_tbl(p) values (point \'(5,5)\');' + . 'INSERT INTO spgist_idx_tbl(p) values (point \'(7,8)\');' + . 'INSERT INTO spgist_idx_tbl(p) values (point \'(8,6)\');' + . 'INSERT INTO spgist_idx_tbl(p) values (point \'(9,19)\');' + . 'COMMIT;' +); +$node->stop; + +# test pg_waldump with brin index +$node->start; +$node->safe_psql('postgres', + 'BEGIN;' + . 'CREATE TABLE brin_idx_tbl ( + col1 int, + col2 text, + col3 text + );' + . 'COMMIT;' + . 'BEGIN;' + . 'CREATE INDEX brin_idx ON brin_idx_tbl USING brin (col1, col2, col3) WITH (autosummarize=on);' + . 'COMMIT;' + . 'BEGIN;' + . "INSERT INTO brin_idx_tbl + SELECT generate_series(1, 10000), 'dummy', 'dummy';" + . 'COMMIT;' + . 'BEGIN;' + . "UPDATE brin_idx_tbl + SET col2 = 'updated' + WHERE col1 BETWEEN 1 AND 5000;" + . 'COMMIT;' + . "SELECT brin_summarize_range('brin_idx', 0);" + . "SELECT brin_desummarize_range('brin_idx', 0);" +); +$node->stop; + +# test pg_waldump with tablespace +$node->start; +$node->safe_psql('postgres', + "CREATE TABLESPACE tbl_space LOCATION '$source_ts_path';" + . 'CREATE TABLE table_space_tbl ( + col1 int + ) TABLESPACE tbl_space;' +); +$node->stop; + +# test pg_waldump with sequence +$node->start; +$node->safe_psql('postgres', + "CREATE SEQUENCE sequence;" +); +$node->stop; + +# test local message +$node->start; +$node->safe_psql('postgres', + 'BEGIN;' + . "SELECT pg_logical_emit_message(true, 'text', 'text');" + . 'COMMIT;' +); +$node->stop; + +# test relmap +$node->start; +$node->safe_psql('postgres', + "SELECT relfilenode FROM pg_class WHERE relname = 'pg_authid';" + . 'VACUUM FULL pg_authid;' +); +$node->stop; + +chdir $pg_wal_dir; +foreach my $file (glob '000*') { + IPC::Run::run [ 'pg_waldump', "$pg_wal_dir/$file" ], '>', \$stdout, '2>', \$stderr; + isnt($stdout, ''); +} + +done_testing();