# $Id: 10-recurse.t 990 2012-02-27 14:51:45Z willem $ -*-perl-*-

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

BEGIN {
	if (-e 't/online.enabled' && ! -e 't/online.disabled' ) {

	    #
	    # Some people try to run these on private address space."
	    use IO::Socket::INET;
	    my $sock = IO::Socket::INET->new(PeerAddr => '193.0.14.129', # k.root-servers.net.
					  PeerPort => '53',
					  Proto    => 'udp');
	    
	    
	    unless($sock){
		plan skip_all => "Cannot bind to socket:\n\t".$!."\n";
		diag "This is an indication you do have network problems";
		exit;
	    }else{
		my $ip = inet_ntoa($sock->sockaddr);
		if ( $ip =~ /^(10|172\.(1[6-9]|2.|30|31)|192.168)\./ ) {
		    plan skip_all => "Cannot run these tests from this IP: $ip";		
		    exit;
		}else{
		    plan tests => 12;
		    NonFatalBegin();
		}
	    }

	} else {

		    plan skip_all => 'Online tests disabled.';		



	}
}


BEGIN { use_ok('Net::DNS::Resolver::Recurse'); }


{
	my $res = Net::DNS::Resolver::Recurse->new;

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

	$res->debug(1);	
	$res->udp_timeout(20);
	
	# Hard code A and K.ROOT-SERVERS.NET hint 
	ok($res->hints("193.0.14.129", "198.41.0.4" ), "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 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, 'anwer section had RRs');
}

# test the callback


my @HINTS= qw(
			
			192.33.4.12
			128.8.10.90
			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

			);

my $res2 = Net::DNS::Resolver::Recurse->new ;
$res2->nameservers( @HINTS );
my $ans_at=$res2->send("a.t.", "A");
if ($ans_at->header->ancount == 1 ){
    diag "We are going to skip a bunch of checks.";
    diag "There seems to be a middle box in the path that modifies your packets";
}
SKIP: {
    skip "Modifying middlebox detected ",4 if ($ans_at->header->ancount == 1 );
    
    {
	my $res = Net::DNS::Resolver::Recurse->new ;
	my $count;
	$res->debug(1);
	# Hard code root hints, there are some environments that will fail
	# the test otherwise
	$res->hints( @HINTS );
	
	
	$res->recursion_callback(sub {
	    my $packet = shift;
	    
	    isa_ok($packet, 'Net::DNS::Packet');
	    
	    $count++;
				 });
	
	$res->query_dorecursion('a.t.net-dns.org', 'A');
	
	ok($count >= 3, "Lookup took $count queries which is at least 3.");
    }
} 

NonFatalEnd();
