The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Test::More tests => 7;
use AnyEvent::Ident::Client;
use AnyEvent::Ident::Server;

our $timeout = AnyEvent->timer( 
  after => 10,
  cb    => sub { diag "TIMEOUT"; exit },
);

my $bindport = AnyEvent->condvar;

my $server = eval { AnyEvent::Ident::Server->new(
  hostname => '127.0.0.1', port => 0, on_bind => sub { $bindport->send(shift->bindport) },
) };
diag $@ if $@;
isa_ok $server, 'AnyEvent::Ident::Server';

eval {
  $server->start(sub {
    shift->reply_with_user('UNIX','grimlock');
  });
};
diag $@ if $@;

like $bindport->recv, qr/^[1-9]\d*$/, 'bind port = ' . $server->bindport;

my $w = AnyEvent->timer( after => 5, cb => sub { diag 'TIMEOUT'; exit });

my $done = AnyEvent->condvar;

my $client = AnyEvent::Ident::Client->new(
  hostname => '127.0.0.1',
  port => $server->bindport,
  response_class => 'Foo::Bar::Baz',
)->ident(1,2, sub {
  my $res = shift;

  isa_ok $res, 'Foo::Bar::Baz';  
  ok $res->is_success, 'is_success';
  is $res->username,   'grimlock', ' username = grimlock ';
  is $res->os,         'UNIX',     ' os       = UNIX ';
  is eval { $res->answer }, 42,    ' answer   = 42 ';
  diag $@ if $@;
  
  $done->send;
});

$done->recv;

package
  Foo::Bar::Baz;

BEGIN { our @ISA = qw( AnyEvent::Ident::Response ) }

sub answer { 42 }