1use strict; 2use warnings; 3use Test::More; 4use POE; 5use POE::Component::Server::IRC; 6use POE::Component::IRC; 7 8our $GOT_SSL; 9 10BEGIN { 11 eval { 12 require POE::Component::SSLify; 13 import POE::Component::SSLify qw( Server_SSLify SSLify_Options Client_SSLify ); 14 $GOT_SSL = 1; 15 }; 16} 17 18if (!$GOT_SSL) { 19 plan skip_all => "POE::Component::SSLify not available"; 20} 21 22plan tests => 15; 23 24my $pocosi = POE::Component::Server::IRC->spawn( 25 auth => 0, 26 antiflood => 0, 27 plugin_debug => 1, 28 sslify_options => ['ircd.key', 'ircd.crt'], 29); 30my $pocoirc = POE::Component::IRC->spawn( 31 flood => 1, 32 UseSSL => 1, 33); 34 35POE::Session->create( 36 package_states => [ 37 'main' => [qw( 38 _start 39 _shutdown 40 _default 41 ircd_daemon_nick 42 ircd_listener_add 43 ircd_listener_del 44 )], 45 ], 46 heap => { irc => $pocoirc, ircd => $pocosi }, 47); 48 49$poe_kernel->run(); 50 51sub _start { 52 my ($kernel, $heap) = @_[KERNEL, HEAP]; 53 54 $heap->{irc}->yield('register', 'all'); 55 $heap->{ircd}->yield('register', 'all'); 56 $heap->{ircd}->add_listener(usessl => 1); 57 $kernel->delay('_shutdown', 20); 58} 59 60sub _shutdown { 61 my $heap = $_[HEAP]; 62 $_[KERNEL]->delay('_shutdown'); 63 $heap->{irc}->yield('unregister', 'all'); 64 $heap->{irc}->yield('shutdown'); 65 $heap->{ircd}->yield('shutdown'); 66 delete $heap->{irc}; 67 delete $heap->{ircd}; 68} 69 70sub ircd_listener_add { 71 my ($heap, $port) = @_[HEAP, ARG0]; 72 pass("Started a listener on $port"); 73 $heap->{port} = $port; 74 $heap->{irc}->yield( 75 connect => { 76 server => 'localhost', 77 port => $port, 78 nick => __PACKAGE__, 79 }, 80 ); 81} 82 83sub ircd_listener_del { 84 my ($heap, $port) = @_[HEAP, ARG0]; 85 pass("Stopped listener on $port"); 86 $_[KERNEL]->yield('_shutdown'); 87} 88 89sub ircd_backend_connection { 90 pass('ircd_backend_connection'); 91} 92 93sub ircd_backend_auth_done { 94 pass('ircd_backend_auth_done'); 95} 96 97sub ircd_daemon_nick { 98 pass('ircd_daemon_nick'); 99} 100 101sub ircd_backend_cmd_user { 102 pass('ircd_backend_cmd_user'); 103} 104 105sub _default { 106 my $event = $_[ARG0]; 107 108 if ($event =~ /^irc_(00[1234]|25[15]|422)/ || $event eq 'irc_isupport') { 109 pass($event); 110 } 111 elsif ($event eq 'irc_mode') { 112 pass($event); 113 $_[HEAP]->{irc}->yield('nick', 'moo'); 114 } 115 elsif ($event eq 'irc_nick') { 116 pass($event); 117 $_[HEAP]->{irc}->yield('quit', 'moo'); 118 } 119 elsif ($event eq 'irc_error') { 120 pass($event); 121 $_[HEAP]->{ircd}->del_listener(port => $_[HEAP]->{port}); 122 } 123} 124