# $Id: 10-recurse.t 1218 2014-06-11 08:26:33Z willem $ -*-perl-*-

use strict;
use Test::More;
use t::NonFatal;

use Net::DNS;


my @HINTS = qw(
		192.33.4.12
		199.7.91.13
		192.203.230.10
		192.5.5.241
		192.112.36.4
		128.63.2.53
		192.36.148.17
		192.58.128.30
		193.0.14.129
		199.7.83.42
		202.12.27.33
		198.41.0.4
		192.228.79.201
		);


exit( plan skip_all => 'Online tests disabled.' ) if -e 't/online.disabled';
exit( plan skip_all => 'Online tests disabled.' ) unless -e 't/online.enabled';


eval {
	my $res = Net::DNS::Resolver->new( retry => 1 );
	$res->nameservers(@HINTS);

	my $reply = $res->send( "a.t.", "A" ) || die;

	if ( $reply->header->ancount ) {
		diag "There seems to be a middle box in the path that modifies your packets";
		exit( plan skip_all => "Modifying middlebox detected" );
	}

	1;
} || exit( plan skip_all => "Unable to access global root nameservers" );


{
	# Some people try to run these on private address space."
	use IO::Socket::INET;

	my ($root_server) = @HINTS;
	my $sock = IO::Socket::INET->new(
		PeerAddr => $root_server,
		PeerPort => '53',
		Proto	 => 'udp'
		);

	exit( plan skip_all => "Cannot bind to socket:\n\t$!\n" ) unless $sock;

	my $ip = inet_ntoa( $sock->sockaddr );
	exit( plan skip_all => "Cannot run these tests from this IP: $ip" )
			if $ip =~ /^(10|172\.(1[6-9]|2.|30|31)|192.168)\./;
}


plan 'no_plan';

NonFatalBegin();

use_ok('Net::DNS::Resolver::Recurse');

{
	my $res = Net::DNS::Resolver::Recurse->new( debug => 0 );

	isa_ok( $res, 'Net::DNS::Resolver::Recurse', 'new() created object' );

	$res->udp_timeout(20);

	ok( $res->hints(@HINTS), "hints() set" );

	ok( %{$res->{'hints'}}, 'sanity check worked' );

	my $packet;

	# Try a domain that is a CNAME
	$packet = $res->query_dorecursion( "www.google.com.", "A" );
	ok( $packet,		    'got a packet' );
	ok( scalar $packet->answer, 'answer section has RRs' );

	# Try a big hairy one
	undef $packet;
	$packet = $res->query_dorecursion( "www.rob.com.au.", "A" );
	ok( $packet,		    'got a packet' );
	ok( scalar $packet->answer, 'answer section has RRs' );
}


{
	# test the callback
	my $res = Net::DNS::Resolver::Recurse->new( debug => 0 );

	$res->hints(@HINTS);

	my $count;

	$res->recursion_callback(
		sub {
			isa_ok( shift, 'Net::DNS::Packet', 'callback argument' );
			$count++;
		} );

	$res->query_dorecursion( 'a.t.net-dns.org', 'A' );

	ok( $count >= 3, "Lookup took $count queries which is at least 3." );
}


NonFatalEnd();
