The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# -*-perl-*-
use strict;
use warnings;
use Test::More;
use FindBin qw($Bin);
use MogileFS::Server;
use MogileFS::Test;

my @jm_jobs = qw(fsck delete replicate);
my $jobs;

my $sto = eval { temp_store(); };
if (!$sto) {
    plan skip_all => "Can't create temporary test database: $@";
    exit 0;
}

my $tmptrack = create_temp_tracker($sto, ["--no-job_master"]);
my $admin = IO::Socket::INET->new(PeerAddr => '127.0.0.1:7001');
$admin or die "failed to create admin socket: $!";

sub jobs {
    my ($admin) = @_;
    my %ret;

    syswrite($admin, "!jobs\r\n");
    MogileFS::Util::wait_for_readability(fileno($admin), 10);
    while (1) {
        my $line = <$admin>;
        $line =~ s/\r\n//;
        last if $line eq ".";
        $line =~ /^(\w+ \w+)\s*(.*)$/ or die "Failed to parse $line\n";
        $ret{$1} = $2;
    }
    return \%ret;
}

ok(try_for(30, sub { jobs($admin)->{"queryworker count"} }), "wait for queryworker");

$jobs = jobs($admin);
foreach my $job (@jm_jobs) {
    ok(!$jobs->{"$job count"}, "no $job workers");
}

# enable job master
want($admin, 1, "job_master");

ok(try_for(30, sub { jobs($admin)->{"queryworker count"} }), "wait for queryworker");

foreach my $job (@jm_jobs) {
    ok(try_for(30, sub { jobs($admin)->{"$job count"} }), "wait for $job");
}

# disable job_master again
want($admin, 0, "job_master");

foreach my $job (@jm_jobs) {
    ok(try_for(30, sub { !jobs($admin)->{"$job count"} }), "wait for $job to die");
}

done_testing();