1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
use strict;
use Socket;
use Test::More;
use POE qw(Wheel::SocketFactory Wheel::ReadWrite Filter::Line);
use Test::POE::Server::TCP;
my %data = (
tests => [
[ '+OK' => 'cock' ],
[ '-ERR' => 'quit' ],
],
clients => 2,
);
plan tests => 14;
POE::Session->create(
package_states => [
'main' => [qw(
_start
_sock_up
_sock_fail
_sock_in
_sock_err
testd_registered
testd_connected
testd_disconnected
testd_client_input
testd_client_flushed
)],
],
heap => \%data,
);
$poe_kernel->run();
exit 0;
sub _start {
$_[HEAP]->{testd} = Test::POE::Server::TCP->spawn(
address => '127.0.0.1',
port => 0,
options => { trace => 0 },
);
isa_ok( $_[HEAP]->{testd}, 'Test::POE::Server::TCP' );
return;
}
sub testd_registered {
my ($heap,$object) = @_[HEAP,ARG0];
isa_ok( $object, 'Test::POE::Server::TCP' );
$heap->{port} = $object->port();
for ( 1 .. $heap->{clients} ) {
my $factory = POE::Wheel::SocketFactory->new(
RemoteAddress => '127.0.0.1',
RemotePort => $heap->{port},
SuccessEvent => '_sock_up',
FailureEvent => '_sock_fail',
);
$heap->{factories}->{ $factory->ID } = $factory;
}
return;
}
sub _sock_up {
my ($heap,$socket,$fact_id) = @_[HEAP,ARG0,ARG3];
delete $heap->{factories}->{ $fact_id };
my $wheel = POE::Wheel::ReadWrite->new(
Handle => $socket,
InputEvent => '_sock_in',
ErrorEvent => '_sock_err',
);
$heap->{wheels}->{ $wheel->ID } = $wheel;
$heap->{numbers}->{ $wheel->ID } = 0;
return;
}
sub _sock_fail {
my ($heap,$fact_id) = @_[HEAP,ARG3];
delete $heap->{factory}->{ $fact_id };
$heap->{clients}--;
$heap->{testd}->shutdown() if $heap->{clients} <= 0;
return;
}
sub _sock_in {
my ($heap,$input,$wheel_id) = @_[HEAP,ARG0,ARG1];
is($input,'HELLO ALL','Input from server to all');
$heap->{wheels}->{ $wheel_id }->put('quit');
return;
}
sub _sock_err {
my ($heap,$wheel_id) = @_[HEAP,ARG3];
delete $heap->{wheels}->{ $wheel_id };
pass("Disconnected");
$heap->{clients}--;
$heap->{testd}->shutdown() if $heap->{clients} <= 0;
return;
}
sub testd_connected {
my ($heap,$state,$id) = @_[HEAP,STATE,ARG0];
pass($state);
$heap->{connected}++;
return unless $heap->{connected} == $heap->{clients};
$poe_kernel->post( $_[SENDER], 'send_to_all_clients', 'HELLO ALL' );
return;
}
sub testd_disconnected {
pass($_[STATE]);
return;
}
sub testd_client_flushed {
pass($_[STATE]);
return;
}
sub testd_client_input {
my ($sender,$id,$input) = @_[SENDER,ARG0,ARG1];
my $testd = $_[SENDER]->get_heap();
pass($_[STATE]);
if ( $input eq 'quit' ) {
$testd->terminate( $id );
return;
}
$testd->send_to_client( $id, '-ERR' );
return;
}
|