1use strict;
2use warnings FATAL => 'all';
3use lib 't/inc';
4use POE;
5use POE::Component::IRC;
6use POE::Component::Server::IRC;
7use Test::More tests => 14;
8
9my $bot1 = POE::Component::IRC->spawn(Flood => 1);
10my $bot2 = POE::Component::IRC->spawn(Flood => 1);
11my $ircd = POE::Component::Server::IRC->spawn(
12    Auth      => 0,
13    AntiFlood => 0,
14);
15
16POE::Session->create(
17    package_states => [
18        main => [qw(
19            _start
20            ircd_listener_add
21            ircd_listener_failure
22            _shutdown
23            irc_registered
24            irc_connected
25            irc_001
26            irc_error
27            irc_disconnected
28            irc_shutdown
29        )],
30    ],
31);
32
33$poe_kernel->run();
34
35sub _start {
36    my ($kernel) = $_[KERNEL];
37
38    $ircd->yield('register', 'all');
39    $ircd->yield('add_listener');
40    $kernel->delay(_shutdown => 60, 'Timed out');
41}
42
43sub ircd_listener_failure {
44    my ($kernel, $op, $reason) = @_[KERNEL, ARG1, ARG3];
45    $kernel->yield('_shutdown', "$op: $reason");
46}
47
48sub ircd_listener_add {
49    my ($kernel, $heap, $session, $port) = @_[KERNEL, HEAP, SESSION, ARG0];
50    $kernel->signal($kernel, 'POCOIRC_REGISTER', $session, 'all');
51    $heap->{nickcounter} = 0;
52    $heap->{port} = $port;
53}
54
55sub irc_registered {
56    my ($heap, $irc) = @_[HEAP, ARG0];
57
58    $heap->{nickcounter}++;
59    pass('Registered ' . $heap->{nickcounter});
60    isa_ok($irc, 'POE::Component::IRC');
61
62    $irc->yield(connect => {
63        nick    => 'TestBot' . $heap->{nickcounter},
64        server  => '127.0.0.1',
65        port    => $heap->{port},
66    });
67}
68
69sub irc_connected {
70    pass('Connected');
71}
72
73sub irc_001 {
74    my ($sender,$text) = @_[SENDER, ARG1];
75    my $irc = $sender->get_heap();
76    pass('Logged in');
77    $irc->yield('quit');
78}
79
80sub irc_error {
81    pass('irc_error');
82}
83
84sub irc_disconnected {
85    my ($kernel, $heap) = @_[KERNEL, HEAP];
86    pass('irc_disconnected');
87    $heap->{count}++;
88    $kernel->yield('_shutdown') if $heap->{count} == 2;
89}
90
91sub _shutdown {
92    my ($kernel, $error) = @_[KERNEL, ARG0];
93    fail($error) if defined $error;
94
95    $kernel->alarm_remove_all();
96    $kernel->signal($kernel, 'POCOIRC_SHUTDOWN');
97    $ircd->yield('shutdown');
98}
99
100sub irc_shutdown {
101    pass('irc_shutdown');
102}
103