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
|
use strict;
use Test::More;
use POE qw(Wheel::SocketFactory Wheel::ReadWrite Filter::Line);
use Test::POE::Server::TCP;
plan tests => 5;
my @data = (
'This is a test',
'This is another test',
'This is the last test',
);
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
)],
],
heap => { data => \@data, },
);
$poe_kernel->run();
exit 0;
sub _start {
$_[HEAP]->{testd} = Test::POE::Server::TCP->spawn(
address => '127.0.0.1',
port => 0,
);
return;
}
sub testd_registered {
my ($heap,$object) = @_[HEAP,ARG0];
$heap->{port} = $object->port();
$heap->{factory} = POE::Wheel::SocketFactory->new(
RemoteAddress => '127.0.0.1',
RemotePort => $heap->{port},
SuccessEvent => '_sock_up',
FailureEvent => '_sock_fail',
);
return;
}
sub _sock_up {
my ($heap,$socket) = @_[HEAP,ARG0];
delete $heap->{factory};
$heap->{socket} = POE::Wheel::ReadWrite->new(
Handle => $socket,
InputEvent => '_sock_in',
ErrorEvent => '_sock_err',
);
$heap->{socket}->put( $heap->{data}->[0] );
return;
}
sub _sock_fail {
my $heap = $_[HEAP];
delete $heap->{factory};
$heap->{testd}->shutdown();
return;
}
sub _sock_in {
my ($heap,$input) = @_[HEAP,ARG0];
my $data = shift @{ $heap->{data} };
ok( $input eq $data, 'Data matched' );
unless ( scalar @{ $heap->{data} } ) {
if ( $^O eq 'cygwin' ) {
$heap->{socket}->shutdown_input();
$heap->{socket}->shutdown_output();
}
delete $heap->{socket};
return;
}
$heap->{socket}->put( $heap->{data}->[0] );
return;
}
sub _sock_err {
delete $_[HEAP]->{socket};
return;
}
sub testd_connected {
my ($heap,$state,$id) = @_[HEAP,STATE,ARG0];
pass($state);
return;
}
sub testd_disconnected {
pass($_[STATE]);
$poe_kernel->post( $_[SENDER], 'shutdown' );
return;
}
sub testd_client_input {
my ($sender,$id,$input) = @_[SENDER,ARG0,ARG1];
my $testd = $_[SENDER]->get_heap();
$testd->send_to_client( $id, $input );
return;
}
|