The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
#
# connect to one js, it times out, try another, no retry count, it succeeds
#

use strict;
use FindBin qw($Bin);
require "$Bin/lib/testlib.pl";

use Test::More;

use constant PORT => 9000;

if (start_server(PORT)) {
    plan tests => 3;
} else {
    plan skip_all => "Can't find server to test with";
    exit 0;
}

start_worker(PORT, 1);

my $client = Gearman::Client::Async->new;
$client->set_job_servers('127.0.0.1:9001', '127.0.0.1:9000');
$client->t_set_offline_host('127.0.0.1:9001'); # treat it as off the net, unplugged.
$client->t_set_disable_random(1);

my $completed = 0;
my $failed = 0;
my $done   = 0;
my $did_timeout = 0;

{
    no warnings;
    $Gearman::Client::Async::Connection::T_ON_TIMEOUT = sub {
        $did_timeout++;
    };
}

my $n_loops = 3;
for (1..$n_loops) {
    $client->add_task( Gearman::Task->new( "sleep_for" => \ "0.5", {
        on_complete => sub {
            $completed++;
            $done = 1 if $completed == $n_loops;
        },
        on_fail => sub {
            $failed = 1;
        },
    }));
}

Danga::Socket->AddTimer(3.0, sub { $done = 1; });

Danga::Socket->SetPostLoopCallback(sub {
    return !$done;
});

Danga::Socket->EventLoop();

ok(!$failed, "insertion didn't fail");
is($did_timeout, 1, "and connect did timeout, once");
is($completed, $n_loops, "completed $n_loops times");