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 131 132 133 134 135 136 137 138
|
#!/usr/bin/perl
# Testing the bits that keep track of connections per connection key.
use warnings;
use strict;
use lib qw(./mylib ../mylib);
use Test::More tests => 6;
sub POE::Kernel::ASSERT_DEFAULT () { 1 }
use POE;
use POE::Component::Client::Keepalive;
use POE::Component::Resolver;
use Socket qw(AF_INET);
use TestServer;
my $server_port = TestServer->spawn(0);
POE::Session->create(
inline_states => {
_start => \&start,
got_conn => \&got_conn,
got_error => \&got_error,
got_timeout => \&got_timeout,
test_alloc => \&test_alloc,
and_free => \&and_free,
_child => sub { },
_stop => sub { },
}
);
# Allocate two connections. Wait for both to be allocated. Free them
# both.
sub start {
my $heap = $_[HEAP];
$heap->{cm} = POE::Component::Client::Keepalive->new(
resolver => POE::Component::Resolver->new(af_order => [ AF_INET ]),
);
{
$heap->{cm}->allocate(
scheme => "http",
addr => "localhost",
port => $server_port,
event => "got_conn",
context => "first",
);
}
{
$heap->{cm}->allocate(
scheme => "http",
addr => "localhost",
port => $server_port,
event => "got_conn",
context => "second",
);
}
}
sub got_conn {
my ($heap, $stuff) = @_[HEAP, ARG0];
my $conn = $stuff->{connection};
my $which = $stuff->{context};
ok(defined($conn), "$which connection created successfully");
ok(not (defined ($stuff->{from_cache})), "$which not from cache");
$heap->{conn}{$which} = $conn;
return unless keys(%{$heap->{conn}}) == 2;
# Shut this one down.
$heap->{conn}{$which}->start();
$heap->{conn}{$which}->wheel()->shutdown_input();
$heap->{conn}{$which}->wheel()->shutdown_output();
# Free all heaped connections.
delete $heap->{conn};
# Give the server time to accept the connection.
$_[KERNEL]->delay(test_alloc => 1);
}
# Allocate and free a third connection. It's reused from the free
# pool.
sub test_alloc {
my $heap = $_[HEAP];
$heap->{cm}->allocate(
scheme => "http",
addr => "localhost",
port => $server_port,
event => "and_free",
context => "third",
);
}
sub and_free {
my ($heap, $stuff) = @_[HEAP, ARG0];
my $conn = delete $stuff->{connection};
my $which = $stuff->{context};
if (defined $conn) {
pass "$which request honored asynchronously";
}
else {
fail(
"$which request $stuff->{function} error $stuff->{error_num}: " .
$stuff->{error_str}
);
}
is(
$stuff->{from_cache}, 'immediate',
"third connection honored from the pool"
);
# Free the connection first.
# Close its internal socket before freeing. This will ensure that
# the connection manager can cope with such things.
close $conn->[POE::Component::Connection::Keepalive::CK_SOCKET];
$conn = undef;
TestServer->shutdown();
$heap->{cm}->shutdown();
}
POE::Kernel->run();
exit;
|