summaryrefslogtreecommitdiff
path: root/t/30client-connect.t
diff options
context:
space:
mode:
Diffstat (limited to 't/30client-connect.t')
-rw-r--r--t/30client-connect.t107
1 files changed, 107 insertions, 0 deletions
diff --git a/t/30client-connect.t b/t/30client-connect.t
new file mode 100644
index 0000000..bee0327
--- /dev/null
+++ b/t/30client-connect.t
@@ -0,0 +1,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;