summaryrefslogtreecommitdiff
path: root/t/30client-connect.t
blob: bee03274cb383f2857ba1c6197bec5979719ae89 (plain)
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;