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
|
#!/usr/bin/perl
use strict;
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;
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 => $listener->read_handle->sockhost,
port => $listener->read_handle->sockport,
},
)->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,
"USER defaultuser 0 * :Default Real name$CRLF" .
"NICK MyNick$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;
|