The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More;
use Test::Exception;
use POSIX qw/setlocale/;

use IO::Select;
use Hiredis::Async;
use t::Redis;

setlocale( &POSIX::LC_ALL, 'C' );

{ # Connection failure test

    # Connection problems are often not discovered until the first command is
    # executed. Here we test that they are noticed and reported properly.

    my $redis = Hiredis::Async->new(host => '127.0.0.1', port => 12345);

    cmp_ok my $fd = $redis->GetFd, '>', 0, 'got fd';

    my ($ping_res, $ping_err);
    $redis->Command(['PING'], sub { ($ping_res, $ping_err) = @_ } );

    my $select = IO::Select->new($fd);
    $select->can_write;

    $redis->HandleWrite;

    is $ping_res, undef, 'no PONG from PING';
    like $ping_err, qr/Connection refused/, 'connection error';

    $select->can_read;
    throws_ok { $redis->HandleRead } qr/does not have a struct/, 
        'read after connection failure is invalid';
};

done_testing;