# # # vim: syntax=perl use warnings; use strict; use Test::More tests => 10; BEGIN { use_ok 'POE'; use_ok 'Sprocket'; use_ok 'Sprocket::Client'; use_ok 'Sprocket::Server'; } my %opts = ( LogLevel => 1, TimeOut => 15, ); my $srv = Sprocket::Server->spawn( %opts, Name => 'Test Server', ListenPort => 0, ListenAddress => '127.0.0.1', Plugins => [ { plugin => Sprocket::Plugin::Test->new(), }, ], ); Sprocket::Client->spawn( %opts, Name => 'Test Client', ClientList => [ '127.0.0.1:'.$srv->listen_port, ], Plugins => [ { plugin => Sprocket::Plugin::Test->new(), }, ], ); $poe_kernel->run(); package Sprocket::Plugin::Test; use Sprocket qw( Plugin ); use base 'Sprocket::Plugin'; use POE::Filter::Line; use strict; use warnings; sub new { my $class = shift; $class->SUPER::new( name => 'Test', @_ ); } # --------------------------------------------------------- # server sub local_connected { my ( $self, $server, $con, $socket ) = @_; $self->take_connection( $con ); # POE::Filter::Stackable object: $con->filter->push( POE::Filter::Line->new() ); Test::More::pass('connected, sending test'); $con->send( "Test!" ); } sub local_receive { my ( $self, $server, $con, $data ) = @_; if ( $data =~ m/^Test!/i ) { $con->send( 'quit' ); $con->postback( chain_quit => $con->callback( 'send_quit' ) )->(); Test::More::pass('received test, sending quit'); } elsif ( $data =~ m/^quit/i ) { $con->send( 'goodbye.' ); Test::More::pass('received quit, closing connection'); $con->close(); } } sub chain_quit { my ( $self, $server, $con, $cb ) = @_; $cb->(); } sub send_quit { my ( $self, $server, $con ) = @_; $con->send( 'quit' ); } sub local_disconnected { my ( $self, $server, $con, $error ) = @_; Test::More::pass('local disconnected'); $server->shutdown(); } # --------------------------------------------------------- # client sub remote_connected { my ( $self, $client, $con, $socket ) = @_; $self->take_connection( $con ); # POE::Filter::Stackable object: $con->filter->push( POE::Filter::Line->new() ); } sub remote_receive { my ( $self, $client, $con, $data ) = @_; if ( $data =~ m/^Test!/i ) { Test::More::pass('received test, sending test'); $con->postback( 'send_test' )->(); } elsif ( $data =~ m/^quit/i ) { Test::More::pass('received quit, closing connection'); $con->close(); } } sub send_test{ my ( $self, $client, $con ) = @_; $con->send( "Test!" ); } sub remote_disconnected { my ( $self, $client, $con, $error ) = @_; Test::More::pass('remote disconnected'); $client->shutdown(); } sub remote_time_out { my ( $self, $client, $con, $error ) = @_; Test::More::fail("remote connect timeout"); $client->shutdown(); } sub remote_connect_error { my ( $self, $client, $con, $error ) = @_; Test::More::fail("remote connect failed"); $client->shutdown(); } 1;