AnyEvent-Whois-Raw

 view release on metacpan or  search on metacpan

t/2_blocking.t  view on Meta::CPAN

#!/usr/bin/env perl

use strict;
use Test::More;
use AnyEvent::Whois::Raw;

if( $^O eq 'MSWin32' ) {
	plan skip_all => 'Fork ~~ Windows -> False';
}

my %rules = (
	'google.com' => {
		sleep => 2,
		info => 'Google Inc.'
	},
	'mail.com' => {
		sleep => 10,
		info => 'PSI-USA, Inc.'
	},
	'www.com' => {
		sleep => 0,
		info => 'Diagonal Axis Limited'
	},
	'2gis.com' => {
		sleep => 1,
		info => '"DoubleGIS" Ltd'
	},
	'academ.org' => {
		sleep => 3,
		info => 'Pervaya Milya'
	}
);

my ($pid, $host, $port) = make_whois_server(%rules);
my $start = time();
my $cv = AnyEvent->condvar;
$cv->begin for 1..scalar(keys %rules);

delete $rules{'mail.com'};
whois 'mail.com', "$host:$port", timeout => 3, sub {
	my ($info, $srv) = @_;
	is($info, '', 'mail.com timeout');
	like($srv, qr/timed out/, 'right error message');
	ok(time()-$start < 10, 'mail.com timed out');
	$cv->end;
};

while (my ($domain, $rule) = each(%rules)) {
	whois $domain, "$host:$port", sub {
		my ($info, $srv) = @_;
		is($info, $rule->{info}, "$domain info");
		ok(time()-$start < $rule->{sleep}+2, "$domain was not blocked ");
		$cv->end;
	};
}

$cv->recv;
kill 15, $pid;
done_testing();

sub make_whois_server {
	my %rules = @_;
	my $serv = IO::Socket::INET->new(Listen => 3)
		or die $@;
	
	my $child = fork();
	die 'fork: ', $! unless defined $child;
	
	if ($child == 0) {
		my @childs;
		local $SIG{TERM} = sub { kill 9, @childs; exit };
		local $/ = "\012";
		while (1) {
			my $client = $serv->accept()
				or next;
			
			my $child = fork();
			die 'subfork: ', $! unless defined $child;
			
			if ($child == 0) {
				my $domain = <$client>;
				$domain =~ s/\s*$//;
				if (exists $rules{$domain}) {
					sleep $rules{$domain}{sleep};
					print $client $rules{$domain}{info};
				}
				exit;
			}
			else {
				push @childs, $child;
			}
		}
		
		exit;
	}
	
	return ($child, $serv->sockhost eq '0.0.0.0' ? '127.0.0.1' : $serv->sockhost, $serv->sockport);
}



( run in 1.002 second using v1.01-cache-2.11-cpan-bbe5e583499 )