1use strict; 2use warnings; 3use Test::More tests => 20; 4use POE::Component::Server::IRC; 5use POE::Component::IRC; 6use POE; 7 8my $pocosi = POE::Component::Server::IRC->spawn( 9 auth => 0, 10 antiflood => 0, 11 plugin_debug => 1, 12); 13my $pocoirc = POE::Component::IRC->spawn(flood => 1); 14 15POE::Session->create( 16 package_states => [ 17 'main' => [qw( 18 _start 19 _shutdown 20 _default 21 irc_001 22 irc_join 23 irc_topic 24 irc_322 25 ircd_daemon_nick 26 ircd_listener_add 27 ircd_listener_del 28 )], 29 ], 30 heap => { irc => $pocoirc, ircd => $pocosi }, 31); 32 33$poe_kernel->run(); 34 35sub _start { 36 my ($kernel, $heap) = @_[KERNEL, HEAP]; 37 38 $heap->{irc}->yield('register', 'all'); 39 $heap->{ircd}->yield('register', 'all'); 40 $heap->{ircd}->add_listener(); 41 $kernel->delay('_shutdown', 20); 42} 43 44sub _shutdown { 45 my $heap = $_[HEAP]; 46 $_[KERNEL]->delay('_shutdown'); 47 $heap->{irc}->yield('unregister', 'all'); 48 $heap->{irc}->yield('shutdown'); 49 $heap->{ircd}->yield('shutdown'); 50 delete $heap->{irc}; 51 delete $heap->{ircd}; 52} 53 54sub ircd_listener_add { 55 my ($heap, $port) = @_[HEAP, ARG0]; 56 pass("Started a listener on $port"); 57 $heap->{port} = $port; 58 $heap->{irc}->yield( 59 connect => { 60 server => 'localhost', 61 port => $port, 62 nick => 'Moo', 63 }, 64 ); 65} 66 67sub ircd_listener_del { 68 my ($heap, $port) = @_[HEAP, ARG0]; 69 pass("Stopped listener on $port"); 70 $_[KERNEL]->yield('_shutdown'); 71} 72 73sub ircd_backend_connection { 74 pass('ircd_backend_connection'); 75} 76 77sub ircd_backend_auth_done { 78 pass('ircd_backend_auth_done'); 79} 80 81sub ircd_daemon_nick { 82 pass("ircd_daemon_nick $_[ARG0]"); 83} 84 85sub ircd_backend_cmd_user { 86 pass('ircd_backend_cmd_user'); 87} 88 89sub irc_001 { 90 pass('irc_001'); 91 $poe_kernel->post($_[SENDER], 'join', '#test'); 92} 93 94sub irc_join { 95 my ($heap, $sender, $who, $where) = @_[HEAP, SENDER, ARG0..ARG1]; 96 my $nick = (split /!/, $who)[0]; 97 is($nick, 'Moo', "Nick is okay $nick"); 98 is($where, '#test', "Channel is okay"); 99 $poe_kernel->post($sender, 'topic', $where, 'Fubar'); 100 $heap->{set_topic} = 1; 101} 102 103sub irc_topic { 104 my ($heap, $who, $where, $what) = @_[HEAP, ARG0..ARG2]; 105 106 if ($heap->{set_topic}) { 107 is($what, 'Fubar', "Topic is okay"); 108 $poe_kernel->post($_[SENDER], 'list', $where); 109 } 110 else { 111 is($what, '', "Topic is unset"); 112 $poe_kernel->post($_[SENDER], 'list', $where); 113 } 114} 115 116sub irc_322 { 117 my ($heap, $sender, $text, $parsed) = @_[HEAP, SENDER, ARG1, ARG2]; 118 119 if ($heap->{set_topic}) { 120 is($parsed->[2], 'Fubar', 'Topic is okay from LIST'); 121 $heap->{set_topic} = 0; 122 $poe_kernel->post($sender, 'topic', $parsed->[0], ''); 123 } 124 else { 125 is($parsed->[2], '', "No topic set"); 126 $poe_kernel->post( $sender, 'quit'); 127 } 128} 129 130sub _default { 131 my $event = $_[ARG0]; 132 133 if ($event =~ /^irc_(00[1234]|25[15]|422|323)/ 134 || $event eq 'irc_isupport') { 135 pass($event); 136 } 137 elsif ($event eq 'irc_error') { 138 pass($event); 139 $_[HEAP]->{ircd}->del_listener(port => $_[HEAP]->{port}); 140 } 141} 142