The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use warnings;
use strict;
use Test::More;
use Test::Fatal;
use Test::Deep;
use Redis::Fast;
use Redis::Fast::Sentinel;
use lib 't/tlib';
use Test::SpawnRedisServer;

my @ret = redis();
my $redis_port = pop @ret;
my ($c, $redis_addr) = @ret;
END { diag 'shutting down redis'; $c->() if $c }

diag "redis address : $redis_addr\n";

my @ret2 = sentinel( redis_port => $redis_port );
my $sentinel_port = pop @ret2;
my ($c2, $sentinel_addr) = @ret2;
END { diag 'shutting down sentinel'; $c2->() if $c2 }

my @ret3 = sentinel( redis_port => $redis_port );
my $sentinel2_port = pop @ret3;
my ($c3, $sentinel2_addr) = @ret3;
END { diag 'shutting down sentinel2'; $c3->() if $c3 }

diag "sentinel address: $sentinel_addr\n";
diag "sentinel2 address: $sentinel2_addr\n";

diag("wait 3 sec for the sentinels and the master to gossip");
sleep 3;

{
    # check basic sentinel command
    my $sentinel = Redis::Fast::Sentinel->new(server => $sentinel_addr);

    use Data::Dumper;
    my ($major, $minor, $revision) = split /\./, $sentinel->info->{redis_version};
    if($major < 2 || ($major == 2 && $minor < 8)) {
        plan skip_all => 'this test reqires Redis 2.8 or above';
    }

    my $got = ($sentinel->get_masters())[0];

    cmp_deeply($got, superhashof({ name => 'mymaster',
                      ip => '127.0.0.1',
                      port => $redis_port,
                      flags => 'master',
                      'role-reported' => 'master',
                      'config-epoch' => 0,
                      'num-slaves' => 0,
                      'num-other-sentinels' => 1,
                      quorum => 2,
                    }),
              "sentinel has proper config of its master"
             );
}

{
    my $sentinel = Redis::Fast::Sentinel->new(server => $sentinel_addr);
    my $address = $sentinel->get_service_address('mymaster');
    is $address, "127.0.0.1:$redis_port", "found service mymaster";
}

{
    my $sentinel = Redis::Fast::Sentinel->new(server => $sentinel_addr);
    my $address = $sentinel->get_service_address('mywrongmaster');
    is $address, undef, "didn't found service mywrongmaster";
}

{
   # connect to the master via the sentinel
   my $redis = Redis::Fast->new(sentinels => [ $sentinel_addr ], service => 'mymaster');
   is_deeply({ map { $_ => 1} @{$redis->__get_data->{sentinels} || []} },
             { $sentinel_addr => 1, $sentinel2_addr => 1},
             "Redis client has connected and updated its sentinels");

}

done_testing();