1use strict;
2use warnings;
3use Test::More tests => 8;
4use POE::Component::Server::IRC::Backend;
5use POE::Component::IRC;
6use POE;
7
8my $pocosi = POE::Component::Server::IRC::Backend->create(
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::Backend');
17    POE::Session->create(
18        package_states => [
19            'main' => [qw(
20                _start
21                _shutdown
22                ircd_connection
23                ircd_cmd_nick
24                ircd_cmd_user
25                ircd_registered
26                ircd_listener_add
27                ircd_listener_del
28            )],
29        ],
30        options => { trace => 0 },
31        heap => { irc => $pocoirc, ircd => $pocosi },
32    );
33    $poe_kernel->run();
34}
35
36exit 0;
37
38sub _start {
39    my ($kernel, $heap) = @_[KERNEL, HEAP];
40
41    $heap->{irc}->yield('register', 'all');
42    $heap->{ircd}->yield('register', 'all');
43    $heap->{ircd}->add_listener();
44    $kernel->delay('_shutdown', 20);
45}
46
47sub _shutdown {
48    my ($kernel, $heap) = @_[KERNEL, HEAP];
49
50    $kernel->delay('_shutdown');
51    $heap->{irc}->yield('unregister', 'all');
52    $heap->{irc}->yield('shutdown');
53    $heap->{ircd}->yield('shutdown');
54}
55
56sub ircd_registered {
57    my ($heap, $object) = @_[HEAP, ARG0];
58    my $backend = $_[SENDER]->get_heap();
59    isa_ok($object, 'POE::Component::Server::IRC::Backend');
60    isa_ok($backend, 'POE::Component::Server::IRC::Backend');
61}
62
63sub ircd_listener_add {
64    my ($heap, $port) = @_[HEAP, ARG0];
65
66    pass("Started a listener on $port");
67    $heap->{port} = $port;
68    $heap->{irc}->yield(
69        connect => {
70            server => 'localhost',
71            port   => $port,
72            nick   => __PACKAGE__,
73        },
74    );
75}
76
77sub ircd_listener_del {
78    my ($heap, $port) = @_[HEAP, ARG0];
79    is($port, $heap->{port}, "Stopped listener on $port");
80    $_[KERNEL]->yield('_shutdown');
81}
82
83sub ircd_connection {
84    pass('ircd_backend_connection');
85}
86
87sub ircd_cmd_nick {
88    pass('ircd_backend_cmd_nick');
89    $_[HEAP]->{result}++;
90    if ($_[HEAP]->{result} >= 2) {
91        $_[HEAP]->{ircd}->del_listener('port', $_[HEAP]->{port});
92    }
93}
94
95sub ircd_cmd_user {
96    pass('ircd_backend_cmd_user');
97    $_[HEAP]->{result}++;
98    if ($_[HEAP]->{result} >= 2) {
99        $_[HEAP]->{ircd}->del_listener('port', $_[HEAP]->{port});
100    }
101}
102
103
104