Blame t/04-packet-truncate.t

Packit e6c8bb
# $Id: 04-packet-truncate.t 1449 2016-02-01 12:27:12Z willem $ -*-perl-*-
Packit e6c8bb
Packit e6c8bb
use strict;
Packit e6c8bb
use Test::More tests => 33;
Packit e6c8bb
Packit e6c8bb
use Net::DNS;
Packit e6c8bb
use Net::DNS::ZoneFile;
Packit e6c8bb
Packit e6c8bb
my $source = new Net::DNS::ZoneFile( \*DATA );
Packit e6c8bb
Packit e6c8bb
my @rr = $source->read;
Packit e6c8bb
Packit e6c8bb
{
Packit e6c8bb
	my $packet = new Net::DNS::Packet('query.example.');
Packit e6c8bb
	$packet->push( answer	  => @rr );
Packit e6c8bb
	$packet->push( authority  => @rr );
Packit e6c8bb
	$packet->push( additional => @rr );
Packit e6c8bb
	my $unlimited = length $packet->data;
Packit e6c8bb
	my %before    = map { ( $_, scalar $packet->$_ ) } qw(answer authority additional);
Packit e6c8bb
	my $truncated = length $packet->truncate($unlimited);
Packit e6c8bb
	ok( $truncated == $unlimited, "unconstrained packet length $unlimited" );
Packit e6c8bb
Packit e6c8bb
	foreach my $section (qw(answer authority additional)) {
Packit e6c8bb
		my $before = $before{$section};
Packit e6c8bb
		my $after  = scalar( $packet->$section );
Packit e6c8bb
		is( $after, $before, "$section section unchanged, $before RRs" );
Packit e6c8bb
	}
Packit e6c8bb
	ok( !$packet->header->tc, 'header->tc flag not set' );
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
{
Packit e6c8bb
	my $packet = new Net::DNS::Packet('query.example.');
Packit e6c8bb
	$packet->push( answer	  => @rr );
Packit e6c8bb
	$packet->push( authority  => @rr );
Packit e6c8bb
	$packet->push( additional => @rr );
Packit e6c8bb
	my $unlimited = length $packet->data;
Packit e6c8bb
	my %before    = map { ( $_, scalar $packet->$_ ) } qw(answer authority additional);
Packit e6c8bb
	my $truncated = length $packet->truncate;		# exercise default size
Packit e6c8bb
	ok( $truncated < $unlimited, "long packet was $unlimited, now $truncated" );
Packit e6c8bb
Packit e6c8bb
	foreach my $section (qw(answer authority additional)) {
Packit e6c8bb
		my $before = $before{$section};
Packit e6c8bb
		my $after  = scalar( $packet->$section );
Packit e6c8bb
		ok( $after < $before, "$section section was $before RRs, now $after" );
Packit e6c8bb
	}
Packit e6c8bb
	ok( $packet->header->tc, 'header->tc flag set' );
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
{
Packit e6c8bb
	my $packet = new Net::DNS::Packet('query.example.');
Packit e6c8bb
	$packet->push( answer	  => @rr );
Packit e6c8bb
	$packet->push( authority  => @rr );
Packit e6c8bb
	$packet->push( additional => @rr );
Packit e6c8bb
Packit e6c8bb
	my $tsig = eval { $packet->sign_tsig( 'tsig.example', 'ARDJZgtuTDzAWeSGYPAu9uJUkX0=' ) };
Packit e6c8bb
Packit e6c8bb
	my $unlimited = length $packet->data;
Packit e6c8bb
	my %before    = map { ( $_, scalar $packet->$_ ) } qw(answer authority additional);
Packit e6c8bb
	my $truncated = length $packet->data(512);		# explicit minimum size
Packit e6c8bb
	ok( $truncated < $unlimited, "signed packet was $unlimited, now $truncated" );
Packit e6c8bb
Packit e6c8bb
	foreach my $section (qw(answer authority additional)) {
Packit e6c8bb
		my $before = $before{$section};
Packit e6c8bb
		my $after  = scalar( $packet->$section );
Packit e6c8bb
		ok( $after < $before, "$section section was $before RRs, now $after" );
Packit e6c8bb
	}
Packit e6c8bb
	my $sigrr = $packet->sigrr;
Packit e6c8bb
	is( $sigrr, $tsig, 'TSIG still in additional section' );
Packit e6c8bb
	ok( $packet->header->tc, 'header->tc flag set' );
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
{
Packit e6c8bb
	my $packet = new Net::DNS::Packet('query.example.');
Packit e6c8bb
	my @auth = map Net::DNS::RR->new( type => 'NS', nsdname => $_->name ), @rr;
Packit e6c8bb
	$packet->unique_push( authority => @auth );
Packit e6c8bb
	$packet->push( additional => @rr );
Packit e6c8bb
	$packet->edns->size(2048);				# + all bells and whistles
Packit e6c8bb
	my $unlimited = length $packet->data;
Packit e6c8bb
	my %before    = map { ( $_, scalar $packet->$_ ) } qw(answer authority additional);
Packit e6c8bb
	my $truncated = length $packet->truncate;
Packit e6c8bb
	ok( $truncated < $unlimited, "referral packet was $unlimited, now $truncated" );
Packit e6c8bb
Packit e6c8bb
	foreach my $section (qw(answer authority)) {
Packit e6c8bb
		my $before = $before{$section};
Packit e6c8bb
		my $after  = scalar( $packet->$section );
Packit e6c8bb
		is( $after, $before, "$section section unchanged, $before RRs" );
Packit e6c8bb
	}
Packit e6c8bb
Packit e6c8bb
	foreach my $section (qw(additional)) {
Packit e6c8bb
		my $before = $before{$section};
Packit e6c8bb
		my $after  = scalar( $packet->$section );
Packit e6c8bb
		ok( $after <= $before, "$section section was $before RRs, now $after" );
Packit e6c8bb
	}
Packit e6c8bb
	ok( !$packet->header->tc, 'header->tc flag not set' );
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
{
Packit e6c8bb
	my $packet = new Net::DNS::Packet('query.example.');
Packit e6c8bb
	$packet->push( additional => @rr, @rr );		# two of everything
Packit e6c8bb
	my $unlimited = length $packet->data;
Packit e6c8bb
	my $truncated = length $packet->truncate( $unlimited >> 1 );
Packit e6c8bb
	ok( $truncated, "check RRsets in truncated additional section" );
Packit e6c8bb
Packit e6c8bb
	my %rrset;
Packit e6c8bb
	foreach my $rr ( grep $_->type eq 'A', $packet->additional ) {
Packit e6c8bb
		my $name = $rr->name;
Packit e6c8bb
		$rrset{"$name. A"}++;
Packit e6c8bb
	}
Packit e6c8bb
Packit e6c8bb
	foreach my $rr ( grep $_->type eq 'AAAA', $packet->additional ) {
Packit e6c8bb
		my $name = $rr->name;
Packit e6c8bb
		$rrset{"$name. AAAA"}++;
Packit e6c8bb
	}
Packit e6c8bb
Packit e6c8bb
	my $expect = 2;
Packit e6c8bb
	foreach my $key ( sort keys %rrset ) {
Packit e6c8bb
		is( $rrset{$key}, $expect, "$key	; $expect RRs" );
Packit e6c8bb
	}
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
exit;
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
__DATA__
Packit e6c8bb
Packit e6c8bb
a.example.	A	198.41.0.4
Packit e6c8bb
a.example.	AAAA	2001:503:ba3e::2:30
Packit e6c8bb
b.example.	A	192.228.79.201
Packit e6c8bb
b.example.	AAAA	2001:500:84::b
Packit e6c8bb
c.example.	A	192.33.4.12
Packit e6c8bb
c.example.	AAAA	2001:500:2::c
Packit e6c8bb
d.example.	A	199.7.91.13
Packit e6c8bb
d.example.	AAAA	2001:500:2d::d
Packit e6c8bb
e.example.	A	192.203.230.10
Packit e6c8bb
f.example.	A	192.5.5.241
Packit e6c8bb
f.example.	AAAA	2001:500:2f::f
Packit e6c8bb
g.example.	A	192.112.36.4
Packit e6c8bb
h.example.	A	128.63.2.53
Packit e6c8bb
h.example.	AAAA	2001:500:1::803f:235
Packit e6c8bb
i.example.	A	192.36.148.17
Packit e6c8bb
i.example.	AAAA	2001:7fe::53
Packit e6c8bb
j.example.	A	192.58.128.30
Packit e6c8bb
j.example.	AAAA	2001:503:c27::2:30
Packit e6c8bb
k.example.	A	193.0.14.129
Packit e6c8bb
k.example.	AAAA	2001:7fd::1
Packit e6c8bb
l.example.	A	199.7.83.42
Packit e6c8bb
l.example.	AAAA	2001:500:3::42
Packit e6c8bb
m.example.	A	202.12.27.33
Packit e6c8bb
m.example.	AAAA	2001:dc3::35
Packit e6c8bb