1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
#!/usr/bin/perl
use v5.14;
use warnings;
use Test::More;
use IO::Async::Test;
use IO::Async::Loop;
use IO::Async::Listener;
use Net::Async::IRC;
my $CRLF = "\x0d\x0a"; # because \r\n isn't portable
my $loop = IO::Async::Loop->new();
testing_loop( $loop );
my $client;
my $listener = IO::Async::Listener->new(
on_stream => sub {
( undef, $client ) = @_;
},
);
$loop->add( $listener );
$listener->listen(
addr => { family => "inet" },
)->get;
# Some OSes don't like connect()ing to 0.0.0.0
( my $listenhost = $listener->read_handle->sockhost ) =~ s/^0\.0\.0\.0$/127.0.0.1/;
my $listenport = $listener->read_handle->sockport;
my @errors;
my $irc = Net::Async::IRC->new(
user => "defaultuser",
realname => "Default Real name",
on_message => sub { "IGNORE" },
on_irc_error => sub {
my $self = shift;
my ( $err ) = @_;
push @errors, $err;
},
);
$loop->add( $irc );
ok( !$irc->is_connected, 'not $irc->is_connected' );
$irc->connect(
addr => {
family => "inet",
ip => $listenhost,
port => $listenport,
},
)->get;
ok( $irc->is_connected, '$irc->is_connected' );
ok( !$irc->is_loggedin, 'not $irc->is_loggedin' );
wait_for { $client };
$client->configure( on_read => sub { 0 } ); # using read futures
$loop->add( $client );
# Now see if we can send a message
$irc->send_message( "HELLO", undef, "world" );
my $read_f;
$read_f = $client->read_until( $CRLF );
wait_for { $read_f->is_ready };
is( scalar $read_f->get, "HELLO world$CRLF", 'Server stream after initial client message' );
my $logged_in = 0;
my $login_f = $irc->login(
nick => "MyNick",
on_login => sub { $logged_in = 1 },
);
$read_f = $client->read_until( qr/$CRLF.*$CRLF/ );
wait_for { $read_f->is_ready };
is( scalar $read_f->get,
"NICK MyNick$CRLF" .
"USER defaultuser 0 * :Default Real name$CRLF",
'Server stream after login' );
$client->write( ":irc.example.com 001 MyNick :Welcome to IRC MyNick!defaultuser\@your.host.here$CRLF" );
wait_for { $login_f->is_ready };
ok( !$login_f->failure, 'Client logs in without failure' );
ok( $logged_in, 'Client receives logged in event' );
ok( $irc->is_connected, '$irc->is_connected' );
ok( $irc->is_loggedin, '$irc->is_loggedin' );
$client->write( ":something invalid-here$CRLF" );
wait_for { scalar @errors };
ok( defined shift @errors, 'on_error invoked' );
done_testing;
|