# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl Net::Analysis-Utils.t'
use warnings;
use strict;
use Data::Dumper;
use Test::More tests => 13;
use t::TestMockListener;
use Net::Analysis::Dispatcher;
use Net::Analysis::EventLoop;
use Net::Analysis::Listener::TCP;
#########################
BEGIN { use_ok('Net::Analysis::Listener::HTTP') }
#### Create Dispatcher, TCP listener, and mock object listening for TCP events
#
my ($d) = Net::Analysis::Dispatcher->new();
my ($l_tcp) = Net::Analysis::Listener::TCP->new (dispatcher => $d);
my ($l_http) = Net::Analysis::Listener::HTTP->new (dispatcher => $d);
my ($mock) = mock_listener (qw(http_transaction));
$d->add_listener (listener => $mock);
#### Simple google test; check we get the right sequence of events
#
my ($el) = Net::Analysis::EventLoop->new (dispatcher => $d);
$el->loop_file (filename => "t/t1_google.tcp");
my (@found_ev);
my ($args);
while (my (@call) = $mock->next_call()) {
#print ">> $call[0] (". join(',', sort keys %{$call[1][1]} ).")\n";
push (@found_ev, $call[0]);
$args = $call[1][1];
}
# Check that a single HTTP event was emitted
my (@ev) = qw(http_transaction);
is_deeply (\@found_ev, \@ev, "HTTP events for t1_google");
# Now check that the event had the right data
is ($args->{socketpair_key}, '145.246.233.194:33403-216.239.59.147:80', 'key');
is_deeply ([sort keys %{$args}],
[sort qw(socketpair_key req resp req_mono resp_mono
t_start t_end t_elapsed)],
'keys present');
# Check we have nice HTTP objects for the request and response
is ($args->{req}->uri(), '/index.html', 'req1');
is ($args->{resp}->header('content_length'), 1925, 'resp1');
like ($args->{req}->as_string(), qr{Host: www.google.com}, 'req2');
like ($args->{resp}->as_string(), qr{Server: GWS/2.1}, 'resp2');
# Check that the overall timings are here
is (sprintf ("%017.6f", $args->{t_start}), '1096989582.687684', 't_start');
is (sprintf ("%017.6f", $args->{t_end}), '1096989582.739386', 't_end');
is (sprintf ("%017.6f", $args->{t_elapsed}), '0000000000.051702', 't_elapsed');
# Now check that we have the monologue objects for more accurate timings
is (sprintf("%017.6f",$args->{req_mono}->t_end()), '1096989582.687684','req');
is (sprintf("%017.6f",$args->{resp_mono}->t_end()),'1096989582.739386','resp');
__DATA__