summaryrefslogtreecommitdiff
path: root/t/31client-cap.t
blob: f2035ad65e5865fe958f9921fe9d813829c115ad (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
#!/usr/bin/perl

use strict;
use warnings;

use Test::More;
use IO::Async::Test;
use IO::Async::Loop;
use IO::Async::Stream;

use Net::Async::IRC;

my $CRLF = "\x0d\x0a"; # because \r\n isn't portable

my $loop = IO::Async::Loop->new();
testing_loop( $loop );

my ( $S1, $S2 ) = IO::Async::OS->socketpair() or die "Cannot create socket pair - $!";

# Normal CAP login
{
   my $irc = Net::Async::IRC->new(
      handle => $S1,
      use_caps => [qw( multi-prefix )],
   );
   $loop->add( $irc );

   my $login_f = $irc->login(
      nick => "MyNick",
      user => "me",
      realname => "My real name",
   );

   my $serverstream = "";
   wait_for_stream { $serverstream =~ m/(?:.*$CRLF){3}/ } $S2 => $serverstream;

   is( $serverstream, "CAP LS$CRLF" .
                      "USER me 0 * :My real name$CRLF" .
                      "NICK MyNick$CRLF", 'Server stream negotiates CAP' );
   $serverstream = "";

   $S2->syswrite( ':irc.example.com CAP * LS :multi-prefix sasl' . $CRLF );

   wait_for_stream { $serverstream =~ m/.*$CRLF/ } $S2 => $serverstream;

   is( $serverstream, "CAP REQ multi-prefix$CRLF", 'Client requests caps' );
   $serverstream = "";

   is_deeply( $irc->caps_supported,
              { 'multi-prefix' => 1,
                'sasl'         => 1 },
              '$irc->caps_supported' );
   ok( $irc->cap_supported( "multi-prefix" ), '$irc->cap_supported' );

   $S2->syswrite( ':irc.example.com CAP * ACK :multi-prefix' . $CRLF );

   wait_for_stream { $serverstream =~ m/.*$CRLF/ } $S2 => $serverstream;

   is( $serverstream, "CAP END$CRLF", 'Client finishes CAP' );

   is_deeply( $irc->caps_enabled,
              { 'multi-prefix' => 1 },
              '$irc->caps_enabled' );
   ok( $irc->cap_enabled( "multi-prefix" ), '$irc->cap_enabled' );

   $S2->syswrite( ':irc.example.com 001 MyNick :Welcome to IRC MyNick!me@your.host' . $CRLF );

   wait_for { $login_f->is_ready };
   $login_f->get;

   $loop->remove( $irc );
}

# CAP ignored by server
{
   my $irc = Net::Async::IRC->new(
      handle => $S1,
      use_caps => [qw( multi-prefix )],
   );
   $loop->add( $irc );

   my $login_f = $irc->login(
      nick => "MyNick",
      user => "me",
      realname => "My real name",
   );

   my $serverstream = "";
   wait_for_stream { $serverstream =~ m/(?:.*$CRLF){3}/ } $S2 => $serverstream;

   $S2->syswrite( ':irc.example.com 001 MyNick :Welcome to IRC MyNick!me@your.host' . $CRLF );

   wait_for { $login_f->is_ready };
   $login_f->get;

   is( $irc->caps_supported, undef, '$irc->caps_supported undef for CAPless server' );
   is( $irc->caps_enabled,   undef, '$irc->caps_enabled undef for CAPless server' );
}

done_testing;