#!/usr/bin/perl
#
# submit a bunch of jobs to one js, one worker, first sleeps, kill js, get errors, resubmit all to other js
#

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

use Test::More;

use constant PORT => 9000;

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

my $s2pid = start_server(PORT+1) or die;
start_worker(PORT, 2);

my $client = Gearman::Client::Async->new;
$client->set_job_servers('127.0.0.1:9000', '127.0.0.1:9001');
$client->t_set_disable_random(1);

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

my $n_loops = 4;
for (1..$n_loops) {
    $client->add_task( Gearman::Task->new( "sleep_for" => \ "1", {
        retry_count => 1,
        on_complete => sub {
            $completed++;

            # on first success, kill the job server
            if ($completed == 1) {
                kill 9, $s1pid;
            }
            $done = 1 if $completed+$failed == $n_loops;
        },
        on_fail => sub {
            $failed++;
            $done = 1 if $completed+$failed == $n_loops;
        },
    }));
}

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

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

Danga::Socket->EventLoop();

is($completed, $n_loops, "$n_loops completed successfully");
is($failed,    0,        "none failed");







syntax highlighted by Code2HTML, v. 0.9.1