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
15POE::Session->create(
16    package_states => [
17        'main' => [qw(
18            _start
19            _shutdown
20            _default
21            irc_001
22            irc_join
23            irc_topic
24            irc_322
25            ircd_daemon_nick
26            ircd_listener_add
27            ircd_listener_del
28        )],
29    ],
30    heap => { irc => $pocoirc, ircd => $pocosi },
31);
32
33$poe_kernel->run();
34
35sub _start {
36    my ($kernel, $heap) = @_[KERNEL, HEAP];
37
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_listener_add {
55    my ($heap, $port) = @_[HEAP, ARG0];
56    pass("Started a listener on $port");
57    $heap->{port} = $port;
58    $heap->{irc}->yield(
59        connect => {
60            server => 'localhost',
61            port   => $port,
62            nick   => 'Moo',
63        },
64    );
65}
66
67sub ircd_listener_del {
68    my ($heap, $port) = @_[HEAP, ARG0];
69    pass("Stopped listener on $port");
70    $_[KERNEL]->yield('_shutdown');
71}
72
73sub ircd_backend_connection {
74    pass('ircd_backend_connection');
75}
76
77sub ircd_backend_auth_done {
78    pass('ircd_backend_auth_done');
79}
80
81sub ircd_daemon_nick {
82    pass("ircd_daemon_nick $_[ARG0]");
83}
84
85sub ircd_backend_cmd_user {
86    pass('ircd_backend_cmd_user');
87}
88
89sub irc_001 {
90    pass('irc_001');
91    $poe_kernel->post($_[SENDER], 'join', '#test');
92}
93
94sub irc_join {
95    my ($heap, $sender, $who, $where) = @_[HEAP, SENDER, ARG0..ARG1];
96    my $nick = (split /!/, $who)[0];
97    is($nick, 'Moo', "Nick is okay $nick");
98    is($where, '#test', "Channel is okay");
99    $poe_kernel->post($sender, 'topic', $where, 'Fubar');
100    $heap->{set_topic} = 1;
101}
102
103sub irc_topic {
104    my ($heap, $who, $where, $what) = @_[HEAP, ARG0..ARG2];
105
106    if ($heap->{set_topic}) {
107        is($what, 'Fubar', "Topic is okay");
108        $poe_kernel->post($_[SENDER], 'list', $where);
109    }
110    else {
111        is($what, '', "Topic is unset");
112        $poe_kernel->post($_[SENDER], 'list', $where);
113    }
114}
115
116sub irc_322 {
117    my ($heap, $sender, $text, $parsed) = @_[HEAP, SENDER, ARG1, ARG2];
118
119    if ($heap->{set_topic}) {
120        is($parsed->[2], 'Fubar', 'Topic is okay from LIST');
121        $heap->{set_topic} = 0;
122        $poe_kernel->post($sender, 'topic', $parsed->[0], '');
123    }
124    else {
125        is($parsed->[2], '', "No topic set");
126        $poe_kernel->post( $sender, 'quit');
127    }
128}
129
130sub _default {
131    my $event = $_[ARG0];
132
133    if ($event =~ /^irc_(00[1234]|25[15]|422|323)/
134            || $event eq 'irc_isupport') {
135        pass($event);
136    }
137    elsif ($event eq 'irc_error') {
138        pass($event);
139        $_[HEAP]->{ircd}->del_listener(port => $_[HEAP]->{port});
140    }
141}
142