Blame t/08-recurse.t

Packit e6c8bb
# $Id: 08-recurse.t 1549 2017-03-08 09:54:14Z willem $ -*-perl-*-
Packit e6c8bb
Packit e6c8bb
use strict;
Packit e6c8bb
use Test::More;
Packit e6c8bb
Packit e6c8bb
BEGIN {
Packit e6c8bb
	local @INC = ( @INC, qw(t) );
Packit e6c8bb
	require NonFatal;
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
use Net::DNS;
Packit e6c8bb
use Net::DNS::Resolver::Recurse;
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
exit( plan skip_all => 'Online tests disabled.' ) if -e 't/online.disabled';
Packit e6c8bb
exit( plan skip_all => 'Online tests disabled.' ) unless -e 't/online.enabled';
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
eval {
Packit e6c8bb
	my $resolver = new Net::DNS::Resolver();
Packit e6c8bb
	exit plan skip_all => 'No nameservers' unless $resolver->nameservers;
Packit e6c8bb
Packit e6c8bb
	my $reply = $resolver->send(qw(. NS IN)) || die;
Packit e6c8bb
Packit e6c8bb
	my @ns = grep $_->type eq 'NS', $reply->answer, $reply->authority;
Packit e6c8bb
	exit plan skip_all => 'Local nameserver broken' unless scalar @ns;
Packit e6c8bb
Packit e6c8bb
	1;
Packit e6c8bb
} || exit( plan skip_all => 'Non-responding local nameserver' );
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
eval {
Packit e6c8bb
	my $resolver = new Net::DNS::Resolver::Recurse();
Packit e6c8bb
	exit plan skip_all => "No nameservers" unless $resolver->nameservers;
Packit e6c8bb
Packit e6c8bb
	my $reply = $resolver->send(qw(. NS IN)) || die;
Packit e6c8bb
	my $from = $reply->answerfrom();
Packit e6c8bb
Packit e6c8bb
	my @ns = grep $_->type eq 'NS', $reply->answer;
Packit e6c8bb
	exit plan skip_all => "No NS RRs in response from $from" unless scalar @ns;
Packit e6c8bb
Packit e6c8bb
	exit plan skip_all => "Non-authoritative response from $from" unless $reply->header->aa;
Packit e6c8bb
Packit e6c8bb
	1;
Packit e6c8bb
} || exit( plan skip_all => 'Unable to reach global root nameservers' );
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
plan 'no_plan';
Packit e6c8bb
Packit e6c8bb
NonFatalBegin();
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
{
Packit e6c8bb
	my $res = Net::DNS::Resolver::Recurse->new( debug => 0 );
Packit e6c8bb
Packit e6c8bb
	ok( $res->isa('Net::DNS::Resolver::Recurse'), 'new() created object' );
Packit e6c8bb
Packit e6c8bb
	my $packet = $res->query_dorecursion( 'www.net-dns.org', 'A' );
Packit e6c8bb
	ok( $packet, 'got a packet' );
Packit e6c8bb
	ok( scalar $packet->answer, 'answer section has RRs' ) if $packet;
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
{
Packit e6c8bb
	# test the callback
Packit e6c8bb
	my $res = Net::DNS::Resolver::Recurse->new( debug => 0 );
Packit e6c8bb
Packit e6c8bb
	my $count = 0;
Packit e6c8bb
Packit e6c8bb
	$res->recursion_callback(
Packit e6c8bb
		sub {
Packit e6c8bb
			ok( shift->isa('Net::DNS::Packet'), 'callback argument is a packet' );
Packit e6c8bb
			$count++;
Packit e6c8bb
		} );
Packit e6c8bb
Packit e6c8bb
	$res->query_dorecursion( 'a.t.net-dns.org', 'A' );
Packit e6c8bb
Packit e6c8bb
	ok( $count >= 3, "Lookup took $count queries which is at least 3" );
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
{
Packit e6c8bb
	my $res = Net::DNS::Resolver::Recurse->new( debug => 0 );
Packit e6c8bb
Packit e6c8bb
	my $count = 0;
Packit e6c8bb
Packit e6c8bb
	$res->recursion_callback(
Packit e6c8bb
		sub {
Packit e6c8bb
			$count++;
Packit e6c8bb
		} );
Packit e6c8bb
Packit e6c8bb
	$res->query_dorecursion( '2a04:b900:0:0:8:0:0:60', 'PTR' );
Packit e6c8bb
Packit e6c8bb
	ok( $count >= 3, "Reverse lookup took $count queries" );
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
SKIP: {
Packit e6c8bb
	my @hints = new Net::DNS::Resolver::Recurse()->_hints;
Packit e6c8bb
	my $res	  = Net::DNS::Resolver::Recurse->new();
Packit e6c8bb
	is( scalar( $res->hints() ), 0, "hints() initially empty" );
Packit e6c8bb
	$res->hints(@hints);
Packit e6c8bb
	is( scalar( $res->hints ), scalar(@hints), "hints() set" );
Packit e6c8bb
Packit e6c8bb
	my $reply = $res->send( ".", "NS" );
Packit e6c8bb
	ok( $reply, 'got response to priming query' );
Packit e6c8bb
	skip( 'no response to priming query', 3 ) unless $reply;
Packit e6c8bb
	my $from = $reply->answerfrom();
Packit e6c8bb
Packit e6c8bb
	ok( $reply->header->aa, "authoritative response from $from" );
Packit e6c8bb
Packit e6c8bb
	my @ns = grep $_->type eq 'NS', $reply->answer;
Packit e6c8bb
	ok( scalar(@ns), "NS RRs in response from $from" );
Packit e6c8bb
Packit e6c8bb
	my @ar = grep $_->can('address'), $reply->additional;
Packit e6c8bb
	ok( scalar(@ar), "address RRs in response from $from" );
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
{
Packit e6c8bb
	my $res = Net::DNS::Resolver::Recurse->new();
Packit e6c8bb
	$res->retrans(0);
Packit e6c8bb
	$res->retry(0);
Packit e6c8bb
	$res->srcport(-1);
Packit e6c8bb
Packit e6c8bb
	ok( !$res->send( "www.net-dns.org", "A" ), 'fail if no reachable server' );
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
{
Packit e6c8bb
	Net::DNS::Resolver->retry(0);
Packit e6c8bb
	my $res = Net::DNS::Resolver::Recurse->new();
Packit e6c8bb
	$res->hints( '0.0.0.0', '::' );
Packit e6c8bb
Packit e6c8bb
	ok( !$res->send( "www.net-dns.org", "A" ), 'fail if no usable hint' );
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
NonFatalEnd();
Packit e6c8bb
Packit e6c8bb
exit;