1use strict;
2use warnings;
3use Test::More tests => 11;
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_422
23            irc_391
24            ircd_daemon_nick
25            ircd_listener_add
26            ircd_listener_del
27        )],
28    ],
29    heap => { irc => $pocoirc, ircd => $pocosi },
30);
31
32$poe_kernel->run();
33
34sub _start {
35    my ($kernel, $heap) = @_[KERNEL, HEAP];
36
37    $heap->{irc}->yield('register', 'all');
38    $heap->{ircd}->yield('register', 'all');
39    $heap->{ircd}->add_listener();
40    $kernel->delay('_shutdown', 20);
41}
42
43sub _shutdown {
44    my $heap = $_[HEAP];
45    $_[KERNEL]->delay('_shutdown');
46    $heap->{irc}->yield('unregister', 'all');
47    $heap->{irc}->yield('shutdown');
48    $heap->{ircd}->yield('shutdown');
49    delete $heap->{irc};
50    delete $heap->{ircd};
51}
52
53sub ircd_listener_add {
54    my ($heap, $port) = @_[HEAP, ARG0];
55    pass("Started a listener on $port");
56    $heap->{port} = $port;
57    $heap->{irc}->yield(
58        connect => {
59            server => 'localhost',
60            port   => $port,
61            nick   => 'Moo',
62        },
63    );
64}
65
66sub ircd_listener_del {
67    my ($heap, $port) = @_[HEAP, ARG0];
68    pass("Stopped listener on $port");
69    $_[KERNEL]->yield('_shutdown');
70}
71
72sub ircd_backend_connection {
73    pass('ircd_backend_connection');
74}
75
76sub ircd_backend_auth_done {
77    pass('ircd_backend_auth_done');
78}
79
80sub ircd_daemon_nick {
81    pass("ircd_daemon_nick $_[ARG0]");
82}
83
84sub ircd_backend_cmd_user {
85    pass('ircd_backend_cmd_user');
86}
87
88sub irc_001 {
89    pass("irc_001");
90    $poe_kernel->post( $_[SENDER], 'time' );
91}
92
93sub irc_391 {
94    pass("irc_391");
95    $poe_kernel->yield('_shutdown');
96}
97
98sub irc_422 {
99    return if $_[HEAP]->{422};
100    pass("irc_422");
101    $_[HEAP]->{422}++;
102}
103
104sub _default {
105    my $event = $_[ARG0];
106
107    if ($event =~ /^irc_(00[1234]|25[15]|323)/ || $event eq 'irc_isupport') {
108        pass($event);
109    }
110    elsif ($event eq 'irc_error') {
111        pass($event);
112        $_[HEAP]->{ircd}->del_listener(port => $_[HEAP]->{port});
113    }
114}
115