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