|
Packit |
e6c8bb |
# $Id: 06-update.t 1571 2017-06-03 20:14:15Z willem $ -*-perl-*-
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
use strict;
|
|
Packit |
e6c8bb |
use Test::More tests => 85;
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
use Net::DNS;
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
sub is_empty {
|
|
Packit |
e6c8bb |
local $_ = shift;
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
return 0 unless defined $_;
|
|
Packit |
e6c8bb |
return 1 unless length $_;
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
return 1 if /\\# 0/;
|
|
Packit |
e6c8bb |
return 1 if /; no data/;
|
|
Packit |
e6c8bb |
return 1 if /; rdlength = 0/;
|
|
Packit |
e6c8bb |
return 0;
|
|
Packit |
e6c8bb |
}
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
# Canned data.
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
my $zone = "example.com";
|
|
Packit |
e6c8bb |
my $name = "foo.example.com";
|
|
Packit |
e6c8bb |
my $class = "HS";
|
|
Packit |
e6c8bb |
my $class2 = "CH";
|
|
Packit |
e6c8bb |
my $type = "A";
|
|
Packit |
e6c8bb |
my $ttl = 43200;
|
|
Packit |
e6c8bb |
my $rdata = "10.1.2.3";
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
# Packet creation.
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
{
|
|
Packit |
e6c8bb |
my $packet = new Net::DNS::Update( $zone, $class );
|
|
Packit |
e6c8bb |
my ($z) = $packet->zone;
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
ok( $packet, 'new() returned packet' );
|
|
Packit |
e6c8bb |
is( $packet->header->opcode, 'UPDATE', 'header opcode correct' );
|
|
Packit |
e6c8bb |
is( $z->zname, $zone, 'zname from explicit argument' );
|
|
Packit |
e6c8bb |
is( $z->zclass, $class, 'zclass correct' );
|
|
Packit |
e6c8bb |
is( $z->ztype, 'SOA', 'ztype correct' );
|
|
Packit |
e6c8bb |
}
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
{
|
|
Packit |
e6c8bb |
Net::DNS::Resolver->domain($zone); # overides config files
|
|
Packit |
e6c8bb |
my $packet = new Net::DNS::Update();
|
|
Packit |
e6c8bb |
my ($z) = $packet->zone;
|
|
Packit |
e6c8bb |
is( $z->zname, $zone, 'zname from resolver defaults' );
|
|
Packit |
e6c8bb |
}
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
{
|
|
Packit |
e6c8bb |
Net::DNS::Resolver->domain(''); # overides config files
|
|
Packit |
e6c8bb |
my $packet = eval { new Net::DNS::Update(undef); };
|
|
Packit |
e6c8bb |
my $exception = $1 if $@ =~ /^(.+)\n/;
|
|
Packit |
e6c8bb |
ok( $exception ||= '', "argument undefined\t[$exception]" );
|
|
Packit |
e6c8bb |
}
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
# RRset exists (value-independent).
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
{
|
|
Packit |
e6c8bb |
my $arg = "$name $ttl $class $type";
|
|
Packit |
e6c8bb |
my $rr = yxrrset($arg);
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
ok( $rr, "yxrrset($arg)" ); #9
|
|
Packit |
e6c8bb |
is( $rr->name, $name, 'yxrrset - right name' );
|
|
Packit |
e6c8bb |
is( $rr->ttl, 0, 'yxrrset - ttl 0' );
|
|
Packit |
e6c8bb |
is( $rr->class, 'ANY', 'yxrrset - class ANY' );
|
|
Packit |
e6c8bb |
is( $rr->type, $type, "yxrrset - type $type" );
|
|
Packit |
e6c8bb |
ok( is_empty( $rr->rdstring ), 'yxrrset - data empty' );
|
|
Packit |
e6c8bb |
}
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
# RRset exists (value-dependent).
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
{
|
|
Packit |
e6c8bb |
my $arg = "$name $ttl $class $type $rdata";
|
|
Packit |
e6c8bb |
my $rr = yxrrset($arg);
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
ok( $rr, "yxrrset($arg)" );
|
|
Packit |
e6c8bb |
is( $rr->name, $name, 'yxrrset - right name' );
|
|
Packit |
e6c8bb |
is( $rr->ttl, 0, 'yxrrset - ttl 0' );
|
|
Packit |
e6c8bb |
is( $rr->class, $class, "yxrrset - class $class" );
|
|
Packit |
e6c8bb |
is( $rr->type, $type, "yxrrset - type $type" );
|
|
Packit |
e6c8bb |
is( $rr->rdstring, $rdata, 'yxrrset - right data' );
|
|
Packit |
e6c8bb |
}
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
# RRset does not exist.
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
{
|
|
Packit |
e6c8bb |
my $arg = "$name $ttl $class $type $rdata";
|
|
Packit |
e6c8bb |
my $rr = nxrrset($arg);
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
ok( $rr, "nxrrset($arg)" ); #21
|
|
Packit |
e6c8bb |
is( $rr->name, $name, 'nxrrset - right name' );
|
|
Packit |
e6c8bb |
is( $rr->ttl, 0, 'nxrrset - ttl 0' );
|
|
Packit |
e6c8bb |
is( $rr->class, 'NONE', 'nxrrset - class NONE' );
|
|
Packit |
e6c8bb |
is( $rr->type, $type, "nxrrset - type $type" );
|
|
Packit |
e6c8bb |
ok( is_empty( $rr->rdstring ), 'nxrrset - data empty' );
|
|
Packit |
e6c8bb |
}
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
# Name is in use.
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
{
|
|
Packit |
e6c8bb |
my @arg = "$name";
|
|
Packit |
e6c8bb |
my $rr = yxdomain(@arg);
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
ok( $rr, "yxdomain(@arg)" ); #27
|
|
Packit |
e6c8bb |
is( $rr->name, $name, 'yxdomain - right name' );
|
|
Packit |
e6c8bb |
is( $rr->ttl, 0, 'yxdomain - ttl 0' );
|
|
Packit |
e6c8bb |
is( $rr->class, 'ANY', 'yxdomain - class ANY' );
|
|
Packit |
e6c8bb |
is( $rr->type, 'ANY', 'yxdomain - type ANY' );
|
|
Packit |
e6c8bb |
ok( is_empty( $rr->rdstring ), 'yxdomain - data empty' );
|
|
Packit |
e6c8bb |
}
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
{
|
|
Packit |
e6c8bb |
my @arg = ( name => $name );
|
|
Packit |
e6c8bb |
my $rr = yxdomain(@arg);
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
ok( $rr, "yxdomain(@arg)" );
|
|
Packit |
e6c8bb |
is( $rr->name, $name, 'yxdomain - right name' );
|
|
Packit |
e6c8bb |
is( $rr->ttl, 0, 'yxdomain - ttl 0' );
|
|
Packit |
e6c8bb |
is( $rr->class, 'ANY', 'yxdomain - class ANY' );
|
|
Packit |
e6c8bb |
is( $rr->type, 'ANY', 'yxdomain - type ANY' );
|
|
Packit |
e6c8bb |
ok( is_empty( $rr->rdstring ), 'yxdomain - data empty' );
|
|
Packit |
e6c8bb |
}
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
# Name is not in use.
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
{
|
|
Packit |
e6c8bb |
my @arg = "$name";
|
|
Packit |
e6c8bb |
my $rr = nxdomain(@arg);
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
ok( $rr, "nxdomain(@arg)" ); #39
|
|
Packit |
e6c8bb |
is( $rr->name, $name, 'nxdomain - right name' );
|
|
Packit |
e6c8bb |
is( $rr->ttl, 0, 'nxdomain - ttl 0' );
|
|
Packit |
e6c8bb |
is( $rr->class, 'NONE', 'nxdomain - class NONE' );
|
|
Packit |
e6c8bb |
is( $rr->type, 'ANY', 'nxdomain - type ANY' );
|
|
Packit |
e6c8bb |
ok( is_empty( $rr->rdstring ), 'nxdomain - data empty' );
|
|
Packit |
e6c8bb |
}
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
{
|
|
Packit |
e6c8bb |
my @arg = ( name => $name );
|
|
Packit |
e6c8bb |
my $rr = nxdomain(@arg);
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
ok( $rr, "nxdomain(@arg)" );
|
|
Packit |
e6c8bb |
is( $rr->name, $name, 'nxdomain - right name' );
|
|
Packit |
e6c8bb |
is( $rr->ttl, 0, 'nxdomain - ttl 0' );
|
|
Packit |
e6c8bb |
is( $rr->class, 'NONE', 'nxdomain - class NONE' );
|
|
Packit |
e6c8bb |
is( $rr->type, 'ANY', 'nxdomain - type ANY' );
|
|
Packit |
e6c8bb |
ok( is_empty( $rr->rdstring ), 'nxdomain - data empty' );
|
|
Packit |
e6c8bb |
}
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
# Add to an RRset.
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
{
|
|
Packit |
e6c8bb |
my $arg = "$name $ttl $class $type $rdata";
|
|
Packit |
e6c8bb |
my $rr = rr_add($arg);
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
ok( $rr, "rr_add($arg)" ); #51
|
|
Packit |
e6c8bb |
is( $rr->name, $name, 'rr_add - right name' );
|
|
Packit |
e6c8bb |
is( $rr->ttl, $ttl, "rr_add - ttl $ttl" );
|
|
Packit |
e6c8bb |
is( $rr->class, $class, "rr_add - class $class" );
|
|
Packit |
e6c8bb |
is( $rr->type, $type, "rr_add - type $type" );
|
|
Packit |
e6c8bb |
is( $rr->rdstring, $rdata, 'rr_add - right data' );
|
|
Packit |
e6c8bb |
}
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
{
|
|
Packit |
e6c8bb |
my $arg = "$name $class $type $rdata";
|
|
Packit |
e6c8bb |
my $rr = rr_add($arg);
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
ok( $rr, "rr_add($arg)" );
|
|
Packit |
e6c8bb |
is( $rr->name, $name, 'rr_add - right name' );
|
|
Packit |
e6c8bb |
is( $rr->ttl, 86400, "rr_add - ttl 86400" );
|
|
Packit |
e6c8bb |
is( $rr->class, $class, "rr_add - class $class" );
|
|
Packit |
e6c8bb |
is( $rr->type, $type, "rr_add - type $type" );
|
|
Packit |
e6c8bb |
is( $rr->rdstring, $rdata, 'rr_add - right data' );
|
|
Packit |
e6c8bb |
}
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
# Delete an RRset.
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
{
|
|
Packit |
e6c8bb |
my $arg = "$name $class $type";
|
|
Packit |
e6c8bb |
my $rr = rr_del($arg);
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
ok( $rr, "rr_del($arg)" ); #63
|
|
Packit |
e6c8bb |
is( $rr->name, $name, 'rr_del - right name' );
|
|
Packit |
e6c8bb |
is( $rr->ttl, 0, 'rr_del - ttl 0' );
|
|
Packit |
e6c8bb |
is( $rr->class, 'ANY', 'rr_del - class ANY' );
|
|
Packit |
e6c8bb |
is( $rr->type, $type, "rr_del - type $type" );
|
|
Packit |
e6c8bb |
ok( is_empty( $rr->rdstring ), 'rr_del - data empty' );
|
|
Packit |
e6c8bb |
}
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
# Delete All RRsets From A Name.
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
{
|
|
Packit |
e6c8bb |
my $arg = "$name";
|
|
Packit |
e6c8bb |
my $rr = rr_del($arg);
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
ok( $rr, "rr_del($arg)" );
|
|
Packit |
e6c8bb |
is( $rr->name, $name, 'rr_del - right name' );
|
|
Packit |
e6c8bb |
is( $rr->ttl, 0, 'rr_del - ttl 0' );
|
|
Packit |
e6c8bb |
is( $rr->class, 'ANY', 'rr_del - class ANY' );
|
|
Packit |
e6c8bb |
is( $rr->type, 'ANY', 'rr_del - type ANY' );
|
|
Packit |
e6c8bb |
ok( is_empty( $rr->rdstring ), 'rr_del - data empty' );
|
|
Packit |
e6c8bb |
}
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
# Delete An RR From An RRset.
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
{
|
|
Packit |
e6c8bb |
my $arg = "$name $class $type $rdata";
|
|
Packit |
e6c8bb |
my $rr = rr_del($arg);
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
ok( $rr, "rr_del($arg)" );
|
|
Packit |
e6c8bb |
is( $rr->name, $name, 'rr_del - right name' );
|
|
Packit |
e6c8bb |
is( $rr->ttl, 0, 'rr_del - ttl 0' );
|
|
Packit |
e6c8bb |
is( $rr->class, 'NONE', 'rr_del - class NONE' );
|
|
Packit |
e6c8bb |
is( $rr->type, $type, "rr_del - type $type" );
|
|
Packit |
e6c8bb |
is( $rr->rdstring, $rdata, 'rr_del - right data' );
|
|
Packit |
e6c8bb |
}
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
# Make sure RRs in an update packet have the same class as the zone, unless
|
|
Packit |
e6c8bb |
# the class is NONE or ANY.
|
|
Packit |
e6c8bb |
#------------------------------------------------------------------------------
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
{
|
|
Packit |
e6c8bb |
my $packet = Net::DNS::Update->new( $zone, $class );
|
|
Packit |
e6c8bb |
ok( $packet, 'packet created' ); #81
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
$packet->push( "pre", yxrrset("$name $class $type $rdata") );
|
|
Packit |
e6c8bb |
$packet->push( "pre", yxrrset("$name $class2 $type $rdata") );
|
|
Packit |
e6c8bb |
$packet->push( "pre", yxrrset("$name $class2 $type") );
|
|
Packit |
e6c8bb |
$packet->push( "pre", nxrrset("$name $class2 $type") );
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
my @pre = $packet->pre;
|
|
Packit |
e6c8bb |
|
|
Packit |
e6c8bb |
is( scalar(@pre), 4, '"pre" length correct' );
|
|
Packit |
e6c8bb |
is( $pre[0]->class, $class, 'first class right' );
|
|
Packit |
e6c8bb |
is( $pre[1]->class, $class, 'second class right' );
|
|
Packit |
e6c8bb |
is( $pre[2]->class, 'ANY', 'third class right' );
|
|
Packit |
e6c8bb |
is( $pre[3]->class, 'NONE', 'fourth class right' );
|
|
Packit |
e6c8bb |
}
|
|
Packit |
e6c8bb |
|