1use strict; 2use warnings; 3use POE qw(Wheel::SocketFactory); 4use POE::Component::IRC; 5use POE::Component::Server::IRC; 6use Test::More tests => 3; 7 8my $ircd = POE::Component::Server::IRC->spawn( 9 Auth => 0, 10 AntiFlood => 0, 11 plugin_debug => 1, 12); 13 14my $irc = POE::Component::IRC->spawn(Flood => 1); 15 16POE::Session->create( 17 package_states => [ 18 (__PACKAGE__) => [qw( 19 _start 20 ircd_listener_add 21 ircd_listener_failure 22 irc_001 23 irc_join 24 irc_nick 25 irc_disconnected 26 _shutdown 27 )], 28 ], 29); 30 31POE::Kernel->run(); 32 33sub _start { 34 my ($kernel, $heap) = @_[KERNEL, HEAP]; 35 $ircd->yield('register', 'all'); 36 $ircd->yield('add_listener'); 37 $kernel->delay(_shutdown => 60, 'Timed out'); 38} 39 40sub ircd_listener_failure { 41 my ($kernel, $op, $reason) = @_[KERNEL, ARG1, ARG3]; 42 $kernel->yield('_shutdown', "$op: $reason"); 43} 44 45sub ircd_listener_add { 46 my ($heap, $port) = @_[HEAP, ARG0]; 47 48 $irc->yield(register => 'all'); 49 $irc->yield(connect => { 50 nick => 'foo', 51 server => '127.0.0.1', 52 port => $port, 53 }); 54} 55 56sub irc_001 { 57 my $irc = $_[SENDER]->get_heap(); 58 pass('Logged in'); 59 $irc->yield(join => '#foobar'); 60} 61 62sub irc_join { 63 my $irc = $_[SENDER]->get_heap(); 64 pass('Joined channel'); 65 $irc->yield(nick => 'newnick'); 66 $irc->yield('quit'); 67} 68 69sub irc_nick { 70 is($_[HEAP]{got_nick}, undef, 'Got irc_nick only once'); 71 $_[HEAP]->{irc_nick}++; 72} 73 74sub irc_disconnected { 75 $_[KERNEL]->yield('_shutdown'); 76} 77 78sub _shutdown { 79 $_[KERNEL]->alarm_remove_all(); 80 $ircd->yield('shutdown'); 81 $irc->yield('shutdown'); 82} 83