Blame t/06-update.t

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