use strict; use warnings; use Test::More tests => 14; use HTTP::Request; use Data::Dumper; use HTTP::Async::Polite; my $q = HTTP::Async::Polite->new; # Check that we can set and get the interval. is $q->send_interval, 5, "default interval is 5 seconds"; ok $q->send_interval(3), "change interval to 3 seconds"; is $q->send_interval, 3, "new interval is 3 seconds"; require 't/TestServer.pm'; my @servers = map { TestServer->new($_) } 80800 .. 80801; my @url_roots = (); foreach my $s (@servers) { push @url_roots, $s->started_ok("starting a test server"); } # Fire off three requests to two different servers. Check that the correct # interval is observed between each request and that the two different servers # were scaped in parallel. Also add another request so that the lists are not # balanced. my @urls = map { my $url_root = $_; my ($port) = $url_root =~ m/\d+$/g; my $number = $_ eq $url_roots[0] ? 3 : 4; my @ret = map { "$url_root/?set_time=$port-$_" } 1 .. $number; @ret; } @url_roots; my @requests = map { HTTP::Request->new( GET => $_ ) } @urls; ok $q->add(@requests), "Add the requests"; is $q->to_send_count, 5, "Got correct to_send count"; is $q->total_count, 7, "Got correct total count"; # Get all the responses. my @responses = (); while ( my $res = $q->wait_for_next_response ) { push @responses, $res; } is scalar(@responses), 7, "got six responses back"; # Extract the url and the timestamp from the responses; my %data = (); foreach my $res (@responses) { my ( $id, $timestamp ) = split /\n/, $res->content, 2; my ( $port, $number ) = split /-/, $id, 2; # Skip if the number is greater than 3 - extra req to test unbalanced list next if $number > 3; s/\s+//g for $port, $number, $timestamp; $data{$port}{$number} = $timestamp; } # diag Dumper \%data; # Check that the requests did not come too close together. my @first_times = (); foreach my $port ( sort keys %data ) { my @times = sort { $a <=> $b } values %{ $data{$port} }; my $last_time = shift @times; push @first_times, $last_time; foreach my $time (@times) { cmp_ok $time - $last_time, ">", 3, "at least three seconds between requests to same domain"; $last_time = $time; } } # check that the first two requests were near each other. cmp_ok abs( $first_times[0] - $first_times[1] ), "<", 1, "at most 1 second between first two requests";