#!/usr/bin/perl
use strict;
use warnings;
use Test::More;
BEGIN {
plan skip_all => "POE::Component::ResourcePool not installed" unless eval { require POE::Component::ResourcePool };
plan 'no_plan';
}
use POE::Component::ResourcePool::Resource::Semaphore;
use Test::Deep;
use Test::MockObject;
use List::MoreUtils qw/uniq/;
use Verby::Config::Data;
use Set::Object;
use POE;
use Verby::Dispatcher;
my @items = map { Test::MockObject->new } 1 .. 20;
foreach my $meth (qw/is_satisfied provides_cxt/){
$_->set_false($meth) for @items;
}
$_->set_list( resources => ( steps => 1 ) ) for @items;
$_->set_list( depends => () ) for @items;
my @finished;
my $running = Set::Object->new;
my $max_size = 0;
foreach my $item ( @items ) {
$item->mock( 'do' => sub {
my $step = shift;
POE::Session->create(
inline_states => {
_start => sub { $running->insert($step); $max_size = $running->size if $running->size > $max_size },
_stop => sub { push @finished, $step; $running->remove($step) },
}
);
});
}
my $d = Verby::Dispatcher->new(
resource_pool => POE::Component::ResourcePool->new(
resources => {
steps => POE::Component::ResourcePool::Resource::Semaphore->new( initial_value => 3 ),
},
),
);
my $cfg = Verby::Config::Data->new;
$cfg->data->{logger} = Test::MockObject->new;
$d->config_hub($cfg);
$cfg->logger->set_true($_) for qw/info debug/;
#$cfg->logger->mock($_ => sub { warn "@_\n" }) for qw/info debug/;
can_ok($d, "add_steps");
$d->add_steps(@items);
can_ok($d, "do_all");
my $t1 = times;
$d->do_all;
my $t2 = times;
cmp_ok( $max_size, "<=", 3, "never exceeded 3 concurrent jobs" );