Test::POE::Client::TCP(3pm) | User Contributed Perl Documentation | Test::POE::Client::TCP(3pm) |
Test::POE::Client::TCP - A POE Component providing TCP client services for test cases
version 1.26
use strict; use Socket; use Test::More tests => 15; use POE qw(Wheel::SocketFactory Wheel::ReadWrite Filter::Line); use Test::POE::Client::TCP; my @data = ( 'This is a test', 'This is another test', 'This is the last test', ); POE::Session->create( package_states => [ 'main' => [qw( _start _accept _failed _sock_in _sock_err testc_registered testc_connected testc_disconnected testc_input testc_flushed )], ], heap => { data => \@data, }, ); $poe_kernel->run(); exit 0; sub _start { my ($kernel,$heap) = @_[KERNEL,HEAP]; $heap->{listener} = POE::Wheel::SocketFactory->new( BindAddress => '127.0.0.1', SuccessEvent => '_accept', FailureEvent => '_failed', SocketDomain => AF_INET, # Sets the socket() domain SocketType => SOCK_STREAM, # Sets the socket() type SocketProtocol => 'tcp', # Sets the socket() protocol Reuse => 'on', # Lets the port be reused ); $heap->{testc} = Test::POE::Client::TCP->spawn(); return; } sub _accept { my ($kernel,$heap,$socket) = @_[KERNEL,HEAP,ARG0]; my $wheel = POE::Wheel::ReadWrite->new( Handle => $socket, InputEvent => '_sock_in', ErrorEvent => '_sock_err', ); $heap->{wheels}->{ $wheel->ID } = $wheel; return; } sub _failed { my ($kernel,$heap,$operation,$errnum,$errstr,$wheel_id) = @_[KERNEL,HEAP,ARG0..ARG3]; die "Wheel $wheel_id generated $operation error $errnum: $errstr\n"; return; } sub _sock_in { my ($heap,$input,$wheel_id) = @_[HEAP,ARG0,ARG1]; pass('Got input from client'); $heap->{wheels}->{ $wheel_id }->put( $input ) if $heap->{wheels}->{ $wheel_id }; return; } sub _sock_err { my ($heap,$wheel_id) = @_[HEAP,ARG3]; pass('Client disconnected'); delete $heap->{wheels}->{ $wheel_id }; return; } sub testc_registered { my ($kernel,$sender,$object) = @_[KERNEL,SENDER,ARG0]; pass($_[STATE]); my $port = ( sockaddr_in( $_[HEAP]->{listener}->getsockname() ) )[0]; $kernel->post( $sender, 'connect', { address => '127.0.0.1', port => $port } ); return; } sub testc_connected { my ($kernel,$heap,$sender) = @_[KERNEL,HEAP,SENDER]; pass($_[STATE]); $kernel->post( $sender, 'send_to_server', $heap->{data}->[0] ); return; } sub testc_flushed { pass($_[STATE]); return; } sub testc_input { my ($heap,$input) = @_[HEAP,ARG0]; pass('Got something back from the server'); my $data = shift @{ $heap->{data} }; ok( $input eq $data, "Data matched: '$input'" ); unless ( scalar @{ $heap->{data} } ) { $heap->{testc}->terminate(); return; } $poe_kernel->post( $_[SENDER], 'send_to_server', $heap->{data}->[0] ); return; } sub testc_disconnected { my ($heap,$state) = @_[HEAP,STATE]; pass($state); delete $heap->{wheels}; delete $heap->{listener}; $heap->{testc}->shutdown(); return; }
Test::POE::Client::TCP is a POE component that provides a TCP client framework for inclusion in client component test cases, instead of having to roll your own.
Once registered with the component, a session will receive events related to connections made, disconnects, flushed output and input from the specified server.
'alias', set an alias on the component; 'address', the remote address to connect to; 'port', the remote port to connect to; 'options', a hashref of POE::Session options; 'filter', specify a POE::Filter to use for client connections, default is POE::Filter::Line; 'inputfilter', specify a POE::Filter for client input; 'outputfilter', specify a POE::Filter for output to clients; 'localaddr', specify that connections be made from a particular local address; 'localport', specify that connections be made from a particular port; 'autoconnect', set to a true value to make the poco connect immediately; 'prefix', specify an event prefix other than the default of 'testc'; 'timeout', specify number of seconds to wait for socket timeouts; 'context', anything that can fit into a scalar, such as a ref, etc. 'usessl', enable SSL/TLS if POE::Component::SSLify is available; 'sslctx', set to a SSL Context to configure the SSL Connection; 'sslcert', set to a x509 Certificate(PEM encoded) to connect using a client cert; 'sslkey', set to a private Key(PEM encoded) to connect using a client cert;
The semantics for "filter", "inputfilter" and "outputfilter" are the same as for POE::Component::Server::TCP in that one may provide either a "SCALAR", "ARRAYREF" or an "OBJECT".
If the component is "spawn"ed within another session it will automatically "register" the parent session to receive "all" events.
"address" and "port" are optional within "spawn", but if they aren't specified they must be provided to subsequent "connect"s. If "autoconnect" is specified, "address" and "port" must also be defined.
"usessl" is dependent on whether POE::Component::SSLify is available.
'address', the remote address to connect to; 'port', the remote port to connect to; 'localaddr', specify that connections be made from a particular local address, optional; 'localport', specify that connections be made from a particular port, optional; 'usessl', enable SSL/TLS if POE::Component::SSLify is available;
"address" and "port" are optional if they have been already specified during "spawn".
'peeraddr', the server address; 'peerport', the server TCP port; 'sockaddr', our address; 'sockport', our TCP port;
These are events that the component will accept:
Registering for 'all' will cause it to send all TESTC-related events to you; this is the easiest way to handle it.
'address', the remote address to connect to; 'port', the remote port to connect to; 'localaddr', specify that connections be made from a particular local address, optional; 'localport', specify that connections be made from a particular port, optional;
"address" and "port" are optional if they have been already specified during "spawn".
The component sends the following events to registered sessions. If you have changed the "prefix" option in "spawn" then substitute "testc" with the event prefix that you specified.
Contains code borrowed from POE::Component::Server::TCP by Rocco Caputo, Ann Barcomb and Jos Boumans.
POE
POE::Component::Server::TCP
Chris Williams <chris@bingosnet.co.uk>
This software is copyright (c) 2018 by Chris Williams, Rocco Caputo, Ann Barcomb and Jos Boumans.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
2018-11-17 | perl v5.28.0 |