The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests => 3;
use Test::Exception;
use Test::MockObject;
use Test::MockModule;
use Riak::Light;
use Test::TCP;

use Socket qw(TCP_NODELAY IPPROTO_TCP);

subtest "should not die if can connect" => sub {
    plan tests => 3;

    my $server = Test::TCP->new(
        code => sub {
            my $port   = shift;
            my $socket = IO::Socket::INET->new(
                Listen    => 5,
                Timeout   => 1,
                Reuse     => 1,
                LocalPort => $port
            ) or die "ops $!";

            while (1) {
                $socket->accept()->close();
            }
        },
    );

    my $client;
    lives_ok {
        $client = Riak::Light->new(
            host             => '127.0.0.1',
            port             => $server->port,
            timeout_provider => undef,
        );
    };

    is $client->tcp_nodelay, 1, 'default, should be enable';
    ok $client->driver->connector->socket->getsockopt( IPPROTO_TCP,
        TCP_NODELAY ), "should set TCP_NODELAY to 1";
};

subtest "should not die if can connect wihout TCP_NODELAY" => sub {
    plan tests => 2;

    my $server = Test::TCP->new(
        code => sub {
            my $port   = shift;
            my $socket = IO::Socket::INET->new(
                Listen    => 5,
                Timeout   => 1,
                Reuse     => 1,
                LocalPort => $port
            ) or die "ops $!";

            while (1) {
                $socket->accept()->close();
            }
        },
    );

    my $client;
    lives_ok {
        $client = Riak::Light->new(
            host             => '127.0.0.1',
            port             => $server->port,
            timeout_provider => undef,
            tcp_nodelay      => 0,
        );
    };

    is $client->driver->connector->socket->getsockopt( IPPROTO_TCP,
        TCP_NODELAY ), 0, "should NOT set TCP_NODELAY to 1";
};

subtest "should die if cant connect" => sub {
    plan tests => 1;

    my $mockmodule = Test::MockModule->new('IO::Socket::INET');
    $mockmodule->mock( new => sub {undef} );

    throws_ok {
        Riak::Light->new(
            host => 'do.not.exist',
            port => 9999
        );
    }
    qr/Error \(.*\), can't connect to do.not.exist:9999/;
};