use strict;
use warnings FATAL => 'all';

use PostgreSQL::Test::Cluster;
use PostgreSQL::Test::Utils;

use Test::More;


print("\n1. Creating master\n");

my $master = PostgreSQL::Test::Cluster->new('master');
$master->init(allows_streaming => 1);
$master->append_conf(
	'postgresql.conf', qq(
wal_compression = off
autovacuum = off
));
$master->start();


print("\n2. Creating replica from backup\n");

$master->backup('backup');
my $replica = PostgreSQL::Test::Cluster->new('replica');
$replica->init_from_backup($master, 'backup', has_streaming => 1);
$replica->start();


print("\n3. Fast timeline switching\n");

for my $i (1..20) {
    print("\n=== Iteration $i ===\n");
    for my $j (1..3) {
        my $bg = $master->background_psql('postgres');
        $bg->query(q{
            SELECT pg_logical_emit_message(false, 'wal', repeat('W', 8000));
        });
    }

    print("\nDemoting master\n");
    $master->stop('immediate');
    $master->set_standby_mode();

    print("\nPromoting master\n");
    $master->start();
    $master->promote();
}

print("\n4. Waiting to confirm replica entered an infinite loop...\n");
sleep(10);

ok(1, "test finished");
done_testing();