#!/usr/bin/perl
# single process regression tester for the PoCO::Proxy::TCP
# sets up system with server, proxy, one or more clients
# and tests to see if the clients get what they expect back from server.
# Andrew Purshottam Jun 2004
# to do:
# -fix debugging print to show module and session, zap all print (done)
# - multiple sinultaneous conncections don't work! (they do actually,
# but your test code had race conditions.)
# is this the fault of the TestServer, the TestClient (DTS?)
# the proxy or both server and proxy (cause they use PoCo::S:TCP?
# - make system shut down gracefully at end so it can be a unit test.
# - add event handlers for _child _default to main session (done)
# - add destructors to all class oriented modules
# - lookup for resource leaks and under-references (places you need
# to put a POEish thingy on a parents heap.)
use warnings;
use strict;
use diagnostics;
use Getopt::Std;
sub POE::Kernel::ASSERT_DEFAULT () { 1 }
use POE;
use POE::Filter::Stream;
use POE::Filter::Line;
use POE::Component::Proxy::TCP;
use Data::Dumper;
use POSIX;
use Test::More qw(no_plan);
use Getopt::Std;
use lib qw(../inc);
use POE::Component::Proxy::TCP::PoeDebug;
use TestServer;
use TestClient;
use ClientRequest;
$|++;
my %opts;
getopts('d:', \%opts);
# shut up so test frame is not confused
$opts{'d'} = 0 unless defined($opts{'d'});
set_level($opts{'d'});
# create inital session
POE::Session->create
(inline_states =>
{ _start => sub {
my ( $kernel, $session, $heap ) = @_[KERNEL, SESSION, HEAP];
my $status = $kernel->alias_set("main");
my $server = TestServer->new(Port => 5000);
$heap->{server} = $server;
$heap->{proxy} = POE::Component::Proxy::TCP->new
( Alias => "ProxyServerSessionAlias",
Port => 4000,
OrigPort => 5000,
OrigAddress => "localhost",
InlineStates => { },
DataFromClient => sub {
my $s = shift;
dbprint(3, "**from client $s");
},
DataFromServer => sub {
my $s = shift;
dbprint(3, "**from server $s");
},
);
# make sure
$kernel->delay_add( "start_client", 3);
},
client_done => sub {
my ( $kernel, $session, $heap ) = @_[KERNEL, SESSION, HEAP];
$heap->{client_count}++;
if ($heap->{client_count} == $heap->{number_clients}) {
exit(0);
}
},
test_result => sub {
my ( $kernel, $session, $heap, $ok, $test_name ) =
@_[KERNEL, SESSION, HEAP, ARG0, ARG1];
ok($ok, $test_name);
},
start_client => sub {
my ( $kernel, $session, $heap ) = @_[KERNEL, SESSION, HEAP];
$heap->{client_count} = 0; # so we know when to shutn down
$heap->{number_clients} = 0;# number of test clients run below, counted as generated.
# test client #1
my $request_list_ref1 = [ClientRequest->new(Count => 15,
Text => "client #1 request #1!",
DelaySecs => 2),
ClientRequest->new(Count => 6,
Text => "Client #1 request #2",
DelaySecs => 4),
];
my $client1 = TestClient->new(Port => 4000,
RequestList => $request_list_ref1);
$heap->{client1} = $client1;
$heap->{number_clients}++;
# test client #2
my $request_list_ref2 = [ClientRequest->new(Count => 5,
Text => "client #2 request #1!",
DelaySecs => 2),
ClientRequest->new(Count => 6,
Text => "client #2 request #2!",
DelaySecs => 4),
];
my $client2 = TestClient->new(Port => 4000,
RequestList => $request_list_ref2);
$heap->{client2} = $client2;
$heap->{number_clients}++;
},
# Dummy states to prevent warnings.
_stop => sub { return 0 },
_child => sub { },
},
);
$poe_kernel->run();
exit 0;