use t::share;
use Inferno::RegMgr;
use Inferno::RegMgr::TCP;
use Inferno::RegMgr::Service;
use Inferno::RegMgr::Monitor;
use Inferno::RegMgr::Lookup;
use Scalar::Util qw( weaken );
@CheckPoint = (
[ 'cb_add', 'one', {} ], 'cb_add: one',
[ 'cb_add', 'two', {} ], 'cb_add: two',
[ 'cb_mod', 'two', {version=>1} ], 'cb_mod: two version 1',
[ 'cb_mod', 'two', {version=>2} ], 'cb_mod: two version 2',
[ 'cb_del', 'two', {version=>2} ], 'cb_del: two version 2',
[ 'cb_lookup', { 'one' => {} } ], 'cb_lookup: ("one")',
);
plan tests => @CheckPoint/2+1;
registry_start();
my $reg = Inferno::RegMgr::TCP->new({ host => '127.0.0.172' });
my $regmgr = Inferno::RegMgr->new( $reg );
my $srv1 = Inferno::RegMgr::Service->new({ name => 'one' });
my $srv2 = Inferno::RegMgr::Service->new({ name => 'two' });
my $monitor = Inferno::RegMgr::Monitor->new({
cb_add => \&cb_add,
cb_mod => \&cb_mod,
cb_del => \&cb_del,
});
my $lookup = Inferno::RegMgr::Lookup->new({ cb => \&cb_lookup });
$regmgr->attach( $srv1 );
$regmgr->attach( $monitor );
my $t = EV::timer 5, 0, sub { die "timeout\n" };
EV::loop;
registry_stop();
weaken( $regmgr );
is($regmgr, undef, 'Inferno::RegMgr object freed');
sub cb_add {
my ($name, $attr) = @_;
&checkpoint;
if ($name eq 'one') {
$regmgr->attach( $srv2 );
}
if ($name eq 'two') {
$srv2->update({ version => 1 });
}
}
sub cb_mod {
my ($name, $attr) = @_;
&checkpoint;
if ($name eq 'two') {
if ($attr->{version} eq '1') {
$srv2->update({ version => 2 });
}
if ($attr->{version} eq '2') {
$regmgr->detach( $srv2 );
}
}
}
sub cb_del {
my ($name, $attr) = @_;
&checkpoint;
if ($name eq 'two') {
$regmgr->attach( $lookup );
}
}
sub cb_lookup {
my ($svc) = @_;
&checkpoint;
EV::unloop;
}