1use strict;
2use warnings;
3use POE qw(Wheel::SocketFactory);
4use POE::Component::IRC;
5use POE::Component::Server::IRC;
6use Test::More tests => 3;
7
8my $ircd = POE::Component::Server::IRC->spawn(
9    Auth         => 0,
10    AntiFlood    => 0,
11    plugin_debug => 1,
12);
13
14my $irc = POE::Component::IRC->spawn(Flood => 1);
15
16POE::Session->create(
17    package_states => [
18        (__PACKAGE__) => [qw(
19            _start
20            ircd_listener_add
21            ircd_listener_failure
22            irc_001
23            irc_join
24            irc_nick
25            irc_disconnected
26            _shutdown
27        )],
28    ],
29);
30
31POE::Kernel->run();
32
33sub _start {
34    my ($kernel, $heap) = @_[KERNEL, HEAP];
35    $ircd->yield('register', 'all');
36    $ircd->yield('add_listener');
37    $kernel->delay(_shutdown => 60, 'Timed out');
38}
39
40sub ircd_listener_failure {
41    my ($kernel, $op, $reason) = @_[KERNEL, ARG1, ARG3];
42    $kernel->yield('_shutdown', "$op: $reason");
43}
44
45sub ircd_listener_add {
46    my ($heap, $port) = @_[HEAP, ARG0];
47
48    $irc->yield(register => 'all');
49    $irc->yield(connect => {
50        nick   => 'foo',
51        server => '127.0.0.1',
52        port   => $port,
53    });
54}
55
56sub irc_001 {
57    my $irc = $_[SENDER]->get_heap();
58    pass('Logged in');
59    $irc->yield(join => '#foobar');
60}
61
62sub irc_join {
63    my $irc = $_[SENDER]->get_heap();
64    pass('Joined channel');
65    $irc->yield(nick => 'newnick');
66    $irc->yield('quit');
67}
68
69sub irc_nick {
70    is($_[HEAP]{got_nick}, undef, 'Got irc_nick only once');
71    $_[HEAP]->{irc_nick}++;
72}
73
74sub irc_disconnected {
75    $_[KERNEL]->yield('_shutdown');
76}
77
78sub _shutdown {
79    $_[KERNEL]->alarm_remove_all();
80    $ircd->yield('shutdown');
81    $irc->yield('shutdown');
82}
83