|
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 |
|