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
15if ($pocosi && $pocoirc) {
16    isa_ok($pocosi, 'POE::Component::Server::IRC');
17    POE::Session->create(
18        package_states => [
19            main => [qw(
20                _start
21                _shutdown
22                _default
23                ircd_registered
24                ircd_daemon_nick
25                ircd_listener_add
26                ircd_listener_del) ],
27        ],
28        options => { trace => 0 },
29        heap => { irc => $pocoirc, ircd => $pocosi },
30    );
31    $poe_kernel->run();
32}
33
34exit 0;
35
36sub _start {
37    my ($kernel,$heap) = @_[KERNEL,HEAP];
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_registered {
55    my ($heap, $object) = @_[HEAP, ARG0];
56    my $backend = $_[SENDER]->get_heap();
57    isa_ok($object, 'Object::Pluggable' );
58    isa_ok($object, 'POE::Component::Server::IRC');
59    isa_ok($backend, 'POE::Component::Server::IRC');
60    isa_ok($backend->pipeline, 'Object::Pluggable::Pipeline');
61}
62
63sub ircd_listener_add {
64    my ($heap, $port) = @_[HEAP, ARG0];
65    pass("Started a listener on $port");
66    $heap->{port} = $port;
67    $heap->{irc}->yield(
68        connect => {
69            server  => 'localhost',
70            port    => $port,
71            nick    => __PACKAGE__,
72        },
73    );
74}
75
76sub ircd_listener_del {
77    my ($heap, $port) = @_[HEAP, ARG0];
78    pass("Stopped listener on $port");
79    $_[KERNEL]->yield('_shutdown');
80}
81
82sub ircd_backend_connection {
83    pass('ircd_backend_connection');
84}
85
86sub ircd_backend_auth_done {
87    pass('ircd_backend_auth_done');
88}
89
90sub ircd_daemon_nick {
91    pass('ircd_daemon_nick');
92}
93
94sub ircd_backend_cmd_user {
95    pass('ircd_backend_cmd_user');
96}
97
98sub _default {
99    my $event = $_[ARG0];
100
101    if ($event =~ /^irc_(00[1234]|25[15]|422)/ || $event eq 'irc_isupport') {
102        pass($event);
103    }
104    if ($event eq 'irc_mode') {
105        pass($event);
106        $_[HEAP]->{irc}->yield('nick', 'moo');
107    }
108    if ($event eq 'irc_nick') {
109        pass($event);
110        $_[HEAP]->{irc}->yield('quit', 'moo');
111    }
112    if ($event eq 'irc_error') {
113        pass($event);
114        $_[HEAP]->{ircd}->del_listener('port', $_[HEAP]->{port});
115    }
116}
117