summaryrefslogtreecommitdiff
path: root/t/32client-encoding.t
blob: 7110ab7e4eb40a39d28e6e87452e4b7cee243b9c (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
#!/usr/bin/perl

use strict;
use warnings;
use utf8;

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

use Encode qw( encode_utf8 );

use Net::Async::IRC;

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

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

SKIP: foreach my $SSL ( 0, 1 ) {
   if( $SSL ) {
      eval { require IO::Async::SSL } or skip "No IO::Async::SSL", 1;
   }

   my $client;
   my $listener = IO::Async::Listener->new(
      on_stream => sub {
         ( undef, $client ) = @_;
      },
   );
   $loop->add( $listener );

   $listener->listen(
      addr => { family => "inet" },
      ( $SSL ?
         ( extensions => [ 'SSL' ],
           SSL_key_file  => "t/privkey.pem",
           SSL_cert_file => "t/server.pem", ) :
         () ),
   )->get;

   my $irc = Net::Async::IRC->new(
      user => "defaultuser",
      realname => "Default Real name",

      encoding => "UTF-8",

      on_message => sub { "IGNORE" },

      on_irc_error => sub {},
   );
   $loop->add( $irc );

   $irc->connect(
      addr => {
         family => "inet",
         ip     => $listener->read_handle->sockhost,
         port   => $listener->read_handle->sockport,
      },
      ( $SSL ?
         ( extensions => [ 'SSL' ],
           SSL_verify_mode => 0 ) :
         () ),
   )->get;

   wait_for { $client };
   $client->configure( on_read => sub { 0 } );  # using read futures
   $loop->add( $client );

   $irc->send_message( "PRIVMSG", undef, "target", "Ĉu vi ĉi tio vidas?" );

   my $read_f = $client->read_until( $CRLF );
   wait_for { $read_f->is_ready };

   is( scalar $read_f->get, encode_utf8( "PRIVMSG target :Ĉu vi ĉi tio vidas?$CRLF" ),
      'Stream is encoded over ' . ( $SSL ? "SSL" : "plaintext" ) );

   $loop->remove( $irc );
   $loop->remove( $client );
   $loop->remove( $listener );
}

done_testing;