The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl test.pl'

######################### We start with some black magic to print on failure.
# Change 1..1 below to 1..last_test_to_print .
# (It may become useful if the test is moved to ./t subdirectory.)

BEGIN { $| = 1; print "1..37\n"; }
END {print "not ok 1\n" unless $loaded;}

#use diagnostics;
use Net::DNS::ToolKit qw(
	newhead
	put_qdcount
	put_ancount
	get1char
	inet_aton
);
use Net::DNS::ToolKit::RR;
use Net::DNS::ToolKit::Debug qw(
	print_head
	print_buf
);
use Net::DNS::Codes qw(:all);

use Net::Bind::rbldnsdAccessor qw(
	:test
	rblf_next_answer
);

$loaded = 1;
print "ok 1\n";
######################### End of black magic.

# Insert your test code below (better if it prints "ok 13"
# (correspondingly "not ok 13") depending on the success of chunk 13
# of the test code):

$test = 2;

sub ok {
  print "ok $test\n";
  ++$test;
}

## test 2	setup, generate a header for a question

my $buffer = '';
my $off = newhead(\$buffer,
	12345,			# id
	QR | BITS_QUERY | RD | RA,	# query response, query, recursion desired, recursion available
);

print "bad question size $off\nnot "
	unless $off == NS_HFIXEDSZ;
&ok;

sub expect {
  my $x = shift;
  my @exp;
  foreach(split(/\n/,$x)) {
    if ($_ =~ /0x\w+\s+(\d+) /) {
      push @exp,$1;
    }
  }
  return @exp;
}

sub print_ptrs {
  foreach(@_) {
    print "$_ ";
  }
  print "\n";
}

sub chk_exp {
  my($bp,$exp) = @_;
  my @expect = expect($$exp);
  foreach(0..length($$bp) -1) {
    $char = get1char($bp,$_);
    next if $char == $expect[$_];
    print "buffer mismatch $_, got: $char, exp: $expect[$_]\nnot ";
    last;
  }
  &ok;
}

## test 3	setup, append question
# expect this from print_buf
my $exptext = q(
  0     :  0011_0000  0x30   48  0  
  1     :  0011_1001  0x39   57  9  
  2     :  1000_0001  0x81  129    
  3     :  1000_0000  0x80  128    
  4     :  0000_0000  0x00    0    
  5     :  0000_0001  0x01    1    
  6     :  0000_0000  0x00    0    
  7     :  0000_0000  0x00    0    
  8     :  0000_0000  0x00    0    
  9     :  0000_0000  0x00    0    
  10    :  0000_0000  0x00    0    
  11    :  0000_0000  0x00    0    
  12    :  0000_0011  0x03    3    
  13    :  0110_0110  0x66  102  f  
  14    :  0110_1111  0x6F  111  o  
  15    :  0110_1111  0x6F  111  o  
  16    :  0000_0011  0x03    3    
  17    :  0110_0010  0x62   98  b  
  18    :  0110_0001  0x61   97  a  
  19    :  0111_0010  0x72  114  r  
  20    :  0000_0011  0x03    3    
  21    :  0110_0011  0x63   99  c  
  22    :  0110_1111  0x6F  111  o  
  23    :  0110_1101  0x6D  109  m  
  24    :  0000_0000  0x00    0    
  25    :  0000_0000  0x00    0    
  26    :  0000_0001  0x01    1    
  27    :  0000_0000  0x00    0    
  28    :  0000_0001  0x01    1    
);

my $name = 'foo.bar.com';

my($get,$put,$parse) = new Net::DNS::ToolKit::RR(C_IN);
($off,(my @dnptrs)) = $put->Question(\$buffer,$off,$name,T_A,C_IN);
put_qdcount(\$buffer,1);
#print_head(\$buffer);
#print_buf(\$buffer);

chk_exp(\$buffer,\$exptext);

#######################################
# append one each of NS A TXT MX SOA

my $ancount = 0;
## test 4	put NS record
#	This is what we must test

#  ($newoff,$name,$type,$class,$ttl,$rdlength,
#        $rdata,...) = $get->XYZ(\$buffer,$offset);
#
#  ($newoff,@dnptrs)=$put->XYZ(\$buffer,$offset,\@dnptrs,   
#        $name,$type,$class,$ttl,$rdlength,$rdata,...);
#
#  $name,$TYPE,$CLASS,$TTL,$rdlength,$IPaddr) 
#    = $parse->XYZ($name,$type,$class,$ttl,$rdlength,
#        $rdata,...);

$exptext = q(
  0     :  0011_0000  0x30   48  0  
  1     :  0011_1001  0x39   57  9  
  2     :  1000_0001  0x81  129    
  3     :  1000_0000  0x80  128    
  4     :  0000_0000  0x00    0    
  5     :  0000_0001  0x01    1    
  6     :  0000_0000  0x00    0    
  7     :  0000_0000  0x00    0    
  8     :  0000_0000  0x00    0    
  9     :  0000_0000  0x00    0    
  10    :  0000_0000  0x00    0    
  11    :  0000_0000  0x00    0    
  12    :  0000_0011  0x03    3    
  13    :  0110_0110  0x66  102  f  
  14    :  0110_1111  0x6F  111  o  
  15    :  0110_1111  0x6F  111  o  
  16    :  0000_0011  0x03    3    
  17    :  0110_0010  0x62   98  b  
  18    :  0110_0001  0x61   97  a  
  19    :  0111_0010  0x72  114  r  
  20    :  0000_0011  0x03    3    
  21    :  0110_0011  0x63   99  c  
  22    :  0110_1111  0x6F  111  o  
  23    :  0110_1101  0x6D  109  m  
  24    :  0000_0000  0x00    0    
  25    :  0000_0000  0x00    0    
  26    :  0000_0001  0x01    1    
  27    :  0000_0000  0x00    0    
  28    :  0000_0001  0x01    1    
  29    :  1100_0000  0xC0  192    
  30    :  0000_1100  0x0C   12    
  31    :  0000_0000  0x00    0    
  32    :  0000_0010  0x02    2    
  33    :  0000_0000  0x00    0    
  34    :  0000_0001  0x01    1    
  35    :  0000_0000  0x00    0    
  36    :  0000_0000  0x00    0    
  37    :  0000_0100  0x04    4    
  38    :  1101_0010  0xD2  210    
  39    :  0000_0000  0x00    0    
  40    :  0000_1000  0x08    8    
  41    :  0000_0101  0x05    5    
  42    :  0110_0111  0x67  103  g  
  43    :  0110_1111  0x6F  111  o  
  44    :  0110_1111  0x6F  111  o  
  45    :  0111_0011  0x73  115  s  
  46    :  0110_0101  0x65  101  e  
  47    :  1100_0000  0xC0  192    
  48    :  0000_1100  0x0C   12    
);
### offset from above = 29
$ancount++;
my $ttl = 1234;
my $rdata = 'goose.foo.bar.com';
($off, @dnptrs) = $put->NS(\$buffer,$off,\@dnptrs,$name,$ttl,$rdata);
#print_buf(\$buffer);
#print_ptrs(@dnptrs);
chk_exp(\$buffer,\$exptext);      

## test 5	add and check A record
$exptext = q(
  0     :  0011_0000  0x30   48  0  
  1     :  0011_1001  0x39   57  9  
  2     :  1000_0001  0x81  129    
  3     :  1000_0000  0x80  128    
  4     :  0000_0000  0x00    0    
  5     :  0000_0001  0x01    1    
  6     :  0000_0000  0x00    0    
  7     :  0000_0000  0x00    0    
  8     :  0000_0000  0x00    0    
  9     :  0000_0000  0x00    0    
  10    :  0000_0000  0x00    0    
  11    :  0000_0000  0x00    0    
  12    :  0000_0011  0x03    3    
  13    :  0110_0110  0x66  102  f  
  14    :  0110_1111  0x6F  111  o  
  15    :  0110_1111  0x6F  111  o  
  16    :  0000_0011  0x03    3    
  17    :  0110_0010  0x62   98  b  
  18    :  0110_0001  0x61   97  a  
  19    :  0111_0010  0x72  114  r  
  20    :  0000_0011  0x03    3    
  21    :  0110_0011  0x63   99  c  
  22    :  0110_1111  0x6F  111  o  
  23    :  0110_1101  0x6D  109  m  
  24    :  0000_0000  0x00    0    
  25    :  0000_0000  0x00    0    
  26    :  0000_0001  0x01    1    
  27    :  0000_0000  0x00    0    
  28    :  0000_0001  0x01    1    
  29    :  1100_0000  0xC0  192    
  30    :  0000_1100  0x0C   12    
  31    :  0000_0000  0x00    0    
  32    :  0000_0010  0x02    2    
  33    :  0000_0000  0x00    0    
  34    :  0000_0001  0x01    1    
  35    :  0000_0000  0x00    0    
  36    :  0000_0000  0x00    0    
  37    :  0000_0100  0x04    4    
  38    :  1101_0010  0xD2  210    
  39    :  0000_0000  0x00    0    
  40    :  0000_1000  0x08    8    
  41    :  0000_0101  0x05    5    
  42    :  0110_0111  0x67  103  g  
  43    :  0110_1111  0x6F  111  o  
  44    :  0110_1111  0x6F  111  o  
  45    :  0111_0011  0x73  115  s  
  46    :  0110_0101  0x65  101  e  
  47    :  1100_0000  0xC0  192    
  48    :  0000_1100  0x0C   12    
  49    :  1100_0000  0xC0  192    
  50    :  0000_1100  0x0C   12    
  51    :  0000_0000  0x00    0    
  52    :  0000_0001  0x01    1    
  53    :  0000_0000  0x00    0    
  54    :  0000_0001  0x01    1    
  55    :  0000_0000  0x00    0    
  56    :  0000_0000  0x00    0    
  57    :  0000_0010  0x02    2    
  58    :  0011_0111  0x37   55  7  
  59    :  0000_0000  0x00    0    
  60    :  0000_0100  0x04    4    
  61    :  0000_1010  0x0A   10    
  62    :  0110_0010  0x62   98  b  
  63    :  0100_1100  0x4C   76  L  
  64    :  0011_0110  0x36   54  6  
);
### offset from above = 49
$ancount++;
$ttl = 567;
$rdata = inet_aton('10.98.76.54');
($off, @dnptrs) = $put->A(\$buffer,$off,\@dnptrs,$name,$ttl,$rdata);
#print_head(\$buffer);
#print_buf(\$buffer);
#print_ptrs(@dnptrs);
chk_exp(\$buffer,\$exptext);      

## test 6       add and check TXT record
$exptext = q(
  0     :  0011_0000  0x30   48  0  
  1     :  0011_1001  0x39   57  9  
  2     :  1000_0001  0x81  129    
  3     :  1000_0000  0x80  128    
  4     :  0000_0000  0x00    0    
  5     :  0000_0001  0x01    1    
  6     :  0000_0000  0x00    0    
  7     :  0000_0000  0x00    0    
  8     :  0000_0000  0x00    0    
  9     :  0000_0000  0x00    0    
  10    :  0000_0000  0x00    0    
  11    :  0000_0000  0x00    0    
  12    :  0000_0011  0x03    3    
  13    :  0110_0110  0x66  102  f  
  14    :  0110_1111  0x6F  111  o  
  15    :  0110_1111  0x6F  111  o  
  16    :  0000_0011  0x03    3    
  17    :  0110_0010  0x62   98  b  
  18    :  0110_0001  0x61   97  a  
  19    :  0111_0010  0x72  114  r  
  20    :  0000_0011  0x03    3    
  21    :  0110_0011  0x63   99  c  
  22    :  0110_1111  0x6F  111  o  
  23    :  0110_1101  0x6D  109  m  
  24    :  0000_0000  0x00    0    
  25    :  0000_0000  0x00    0    
  26    :  0000_0001  0x01    1    
  27    :  0000_0000  0x00    0    
  28    :  0000_0001  0x01    1    
  29    :  1100_0000  0xC0  192    
  30    :  0000_1100  0x0C   12    
  31    :  0000_0000  0x00    0    
  32    :  0000_0010  0x02    2    
  33    :  0000_0000  0x00    0    
  34    :  0000_0001  0x01    1    
  35    :  0000_0000  0x00    0    
  36    :  0000_0000  0x00    0    
  37    :  0000_0100  0x04    4    
  38    :  1101_0010  0xD2  210    
  39    :  0000_0000  0x00    0    
  40    :  0000_1000  0x08    8    
  41    :  0000_0101  0x05    5    
  42    :  0110_0111  0x67  103  g  
  43    :  0110_1111  0x6F  111  o  
  44    :  0110_1111  0x6F  111  o  
  45    :  0111_0011  0x73  115  s  
  46    :  0110_0101  0x65  101  e  
  47    :  1100_0000  0xC0  192    
  48    :  0000_1100  0x0C   12    
  49    :  1100_0000  0xC0  192    
  50    :  0000_1100  0x0C   12    
  51    :  0000_0000  0x00    0    
  52    :  0000_0001  0x01    1    
  53    :  0000_0000  0x00    0    
  54    :  0000_0001  0x01    1    
  55    :  0000_0000  0x00    0    
  56    :  0000_0000  0x00    0    
  57    :  0000_0010  0x02    2    
  58    :  0011_0111  0x37   55  7  
  59    :  0000_0000  0x00    0    
  60    :  0000_0100  0x04    4    
  61    :  0000_1010  0x0A   10    
  62    :  0110_0010  0x62   98  b  
  63    :  0100_1100  0x4C   76  L  
  64    :  0011_0110  0x36   54  6  
  65    :  1100_0000  0xC0  192    
  66    :  0000_1100  0x0C   12    
  67    :  0000_0000  0x00    0    
  68    :  0001_0000  0x10   16    
  69    :  0000_0000  0x00    0    
  70    :  0000_0001  0x01    1    
  71    :  0000_0000  0x00    0    
  72    :  0000_0000  0x00    0    
  73    :  0000_0010  0x02    2    
  74    :  1010_0110  0xA6  166    
  75    :  0000_0000  0x00    0    
  76    :  0010_1101  0x2D   45  -  
  77    :  0010_1100  0x2C   44  ,  
  78    :  0101_0100  0x54   84  T  
  79    :  0110_1000  0x68  104  h  
  80    :  0110_0101  0x65  101  e  
  81    :  0010_0000  0x20   32     
  82    :  0101_0001  0x51   81  Q  
  83    :  0111_0101  0x75  117  u  
  84    :  0110_1001  0x69  105  i  
  85    :  0110_0011  0x63   99  c  
  86    :  0110_1011  0x6B  107  k  
  87    :  0010_0000  0x20   32     
  88    :  0100_0010  0x42   66  B  
  89    :  0111_0010  0x72  114  r  
  90    :  0110_1111  0x6F  111  o  
  91    :  0111_0111  0x77  119  w  
  92    :  0110_1110  0x6E  110  n  
  93    :  0010_0000  0x20   32     
  94    :  0100_0110  0x46   70  F  
  95    :  0110_1111  0x6F  111  o  
  96    :  0111_1000  0x78  120  x  
  97    :  0010_0000  0x20   32     
  98    :  0100_1010  0x4A   74  J  
  99    :  0111_0101  0x75  117  u  
  100   :  0110_1101  0x6D  109  m  
  101   :  0111_0000  0x70  112  p  
  102   :  0110_0101  0x65  101  e  
  103   :  0110_0100  0x64  100  d  
  104   :  0010_0000  0x20   32     
  105   :  0100_1111  0x4F   79  O  
  106   :  0111_0110  0x76  118  v  
  107   :  0110_0101  0x65  101  e  
  108   :  0111_0010  0x72  114  r  
  109   :  0010_0000  0x20   32     
  110   :  0101_0100  0x54   84  T  
  111   :  0110_1000  0x68  104  h  
  112   :  0110_0101  0x65  101  e  
  113   :  0010_0000  0x20   32     
  114   :  0100_1100  0x4C   76  L  
  115   :  0110_0001  0x61   97  a  
  116   :  0111_1010  0x7A  122  z  
  117   :  0111_1001  0x79  121  y  
  118   :  0010_0000  0x20   32     
  119   :  0100_0100  0x44   68  D  
  120   :  0110_1111  0x6F  111  o  
  121   :  0110_0111  0x67  103  g  
);

### offset from above = 65
$ancount++;
$ttl = 678;
$rdata = 'The Quick Brown Fox Jumped Over The Lazy Dog';
($off, @dnptrs) = $put->TXT(\$buffer,$off,\@dnptrs,$name,$ttl,$rdata);
#print_head(\$buffer);
#print_buf(\$buffer); 
#print_ptrs(@dnptrs); 
chk_exp(\$buffer,\$exptext);

## test 7       add and check MX record
$exptext = q(
  0     :  0011_0000  0x30   48  0  
  1     :  0011_1001  0x39   57  9  
  2     :  1000_0001  0x81  129    
  3     :  1000_0000  0x80  128    
  4     :  0000_0000  0x00    0    
  5     :  0000_0001  0x01    1    
  6     :  0000_0000  0x00    0    
  7     :  0000_0000  0x00    0    
  8     :  0000_0000  0x00    0    
  9     :  0000_0000  0x00    0    
  10    :  0000_0000  0x00    0    
  11    :  0000_0000  0x00    0    
  12    :  0000_0011  0x03    3    
  13    :  0110_0110  0x66  102  f  
  14    :  0110_1111  0x6F  111  o  
  15    :  0110_1111  0x6F  111  o  
  16    :  0000_0011  0x03    3    
  17    :  0110_0010  0x62   98  b  
  18    :  0110_0001  0x61   97  a  
  19    :  0111_0010  0x72  114  r  
  20    :  0000_0011  0x03    3    
  21    :  0110_0011  0x63   99  c  
  22    :  0110_1111  0x6F  111  o  
  23    :  0110_1101  0x6D  109  m  
  24    :  0000_0000  0x00    0    
  25    :  0000_0000  0x00    0    
  26    :  0000_0001  0x01    1    
  27    :  0000_0000  0x00    0    
  28    :  0000_0001  0x01    1    
  29    :  1100_0000  0xC0  192    
  30    :  0000_1100  0x0C   12    
  31    :  0000_0000  0x00    0    
  32    :  0000_0010  0x02    2    
  33    :  0000_0000  0x00    0    
  34    :  0000_0001  0x01    1    
  35    :  0000_0000  0x00    0    
  36    :  0000_0000  0x00    0    
  37    :  0000_0100  0x04    4    
  38    :  1101_0010  0xD2  210    
  39    :  0000_0000  0x00    0    
  40    :  0000_1000  0x08    8    
  41    :  0000_0101  0x05    5    
  42    :  0110_0111  0x67  103  g  
  43    :  0110_1111  0x6F  111  o  
  44    :  0110_1111  0x6F  111  o  
  45    :  0111_0011  0x73  115  s  
  46    :  0110_0101  0x65  101  e  
  47    :  1100_0000  0xC0  192    
  48    :  0000_1100  0x0C   12    
  49    :  1100_0000  0xC0  192    
  50    :  0000_1100  0x0C   12    
  51    :  0000_0000  0x00    0    
  52    :  0000_0001  0x01    1    
  53    :  0000_0000  0x00    0    
  54    :  0000_0001  0x01    1    
  55    :  0000_0000  0x00    0    
  56    :  0000_0000  0x00    0    
  57    :  0000_0010  0x02    2    
  58    :  0011_0111  0x37   55  7  
  59    :  0000_0000  0x00    0    
  60    :  0000_0100  0x04    4    
  61    :  0000_1010  0x0A   10    
  62    :  0110_0010  0x62   98  b  
  63    :  0100_1100  0x4C   76  L  
  64    :  0011_0110  0x36   54  6  
  65    :  1100_0000  0xC0  192    
  66    :  0000_1100  0x0C   12    
  67    :  0000_0000  0x00    0    
  68    :  0001_0000  0x10   16    
  69    :  0000_0000  0x00    0    
  70    :  0000_0001  0x01    1    
  71    :  0000_0000  0x00    0    
  72    :  0000_0000  0x00    0    
  73    :  0000_0010  0x02    2    
  74    :  1010_0110  0xA6  166    
  75    :  0000_0000  0x00    0    
  76    :  0010_1101  0x2D   45  -  
  77    :  0010_1100  0x2C   44  ,  
  78    :  0101_0100  0x54   84  T  
  79    :  0110_1000  0x68  104  h  
  80    :  0110_0101  0x65  101  e  
  81    :  0010_0000  0x20   32     
  82    :  0101_0001  0x51   81  Q  
  83    :  0111_0101  0x75  117  u  
  84    :  0110_1001  0x69  105  i  
  85    :  0110_0011  0x63   99  c  
  86    :  0110_1011  0x6B  107  k  
  87    :  0010_0000  0x20   32     
  88    :  0100_0010  0x42   66  B  
  89    :  0111_0010  0x72  114  r  
  90    :  0110_1111  0x6F  111  o  
  91    :  0111_0111  0x77  119  w  
  92    :  0110_1110  0x6E  110  n  
  93    :  0010_0000  0x20   32     
  94    :  0100_0110  0x46   70  F  
  95    :  0110_1111  0x6F  111  o  
  96    :  0111_1000  0x78  120  x  
  97    :  0010_0000  0x20   32     
  98    :  0100_1010  0x4A   74  J  
  99    :  0111_0101  0x75  117  u  
  100   :  0110_1101  0x6D  109  m  
  101   :  0111_0000  0x70  112  p  
  102   :  0110_0101  0x65  101  e  
  103   :  0110_0100  0x64  100  d  
  104   :  0010_0000  0x20   32     
  105   :  0100_1111  0x4F   79  O  
  106   :  0111_0110  0x76  118  v  
  107   :  0110_0101  0x65  101  e  
  108   :  0111_0010  0x72  114  r  
  109   :  0010_0000  0x20   32     
  110   :  0101_0100  0x54   84  T  
  111   :  0110_1000  0x68  104  h  
  112   :  0110_0101  0x65  101  e  
  113   :  0010_0000  0x20   32     
  114   :  0100_1100  0x4C   76  L  
  115   :  0110_0001  0x61   97  a  
  116   :  0111_1010  0x7A  122  z  
  117   :  0111_1001  0x79  121  y  
  118   :  0010_0000  0x20   32     
  119   :  0100_0100  0x44   68  D  
  120   :  0110_1111  0x6F  111  o  
  121   :  0110_0111  0x67  103  g  
  122   :  1100_0000  0xC0  192    
  123   :  0000_1100  0x0C   12    
  124   :  0000_0000  0x00    0    
  125   :  0000_1111  0x0F   15    
  126   :  0000_0000  0x00    0    
  127   :  0000_0001  0x01    1    
  128   :  0000_0000  0x00    0    
  129   :  0000_0000  0x00    0    
  130   :  0000_0011  0x03    3    
  131   :  0001_0101  0x15   21    
  132   :  0000_0000  0x00    0    
  133   :  0000_1111  0x0F   15    
  134   :  0000_0000  0x00    0    
  135   :  0011_0111  0x37   55  7  
  136   :  0000_1010  0x0A   10    
  137   :  0110_1101  0x6D  109  m  
  138   :  0110_0001  0x61   97  a  
  139   :  0110_1001  0x69  105  i  
  140   :  0110_1100  0x6C  108  l  
  141   :  0111_0011  0x73  115  s  
  142   :  0110_0101  0x65  101  e  
  143   :  0111_0010  0x72  114  r  
  144   :  0111_0110  0x76  118  v  
  145   :  0110_0101  0x65  101  e  
  146   :  0111_0010  0x72  114  r  
  147   :  1100_0000  0xC0  192    
  148   :  0001_0000  0x10   16    
);
  
### offset from above = 122
$ancount++;
$ttl = 789;
my @rdata = (55,'mailserver.bar.com');
($off, @dnptrs) = $put->MX(\$buffer,$off,\@dnptrs,$name,$ttl,@rdata);
#print_head(\$buffer);
#print_buf(\$buffer); 
#print_ptrs(@dnptrs); 
chk_exp(\$buffer,\$exptext);

## test 8       add and check SOA record
$exptext = q(
  0     :  0011_0000  0x30   48  0  
  1     :  0011_1001  0x39   57  9  
  2     :  1000_0001  0x81  129    
  3     :  1000_0000  0x80  128    
  4     :  0000_0000  0x00    0    
  5     :  0000_0001  0x01    1    
  6     :  0000_0000  0x00    0    
  7     :  0000_0101  0x05    5    
  8     :  0000_0000  0x00    0    
  9     :  0000_0000  0x00    0    
  10    :  0000_0000  0x00    0    
  11    :  0000_0000  0x00    0    
  12    :  0000_0011  0x03    3    
  13    :  0110_0110  0x66  102  f  
  14    :  0110_1111  0x6F  111  o  
  15    :  0110_1111  0x6F  111  o  
  16    :  0000_0011  0x03    3    
  17    :  0110_0010  0x62   98  b  
  18    :  0110_0001  0x61   97  a  
  19    :  0111_0010  0x72  114  r  
  20    :  0000_0011  0x03    3    
  21    :  0110_0011  0x63   99  c  
  22    :  0110_1111  0x6F  111  o  
  23    :  0110_1101  0x6D  109  m  
  24    :  0000_0000  0x00    0    
  25    :  0000_0000  0x00    0    
  26    :  0000_0001  0x01    1    
  27    :  0000_0000  0x00    0    
  28    :  0000_0001  0x01    1    
  29    :  1100_0000  0xC0  192    
  30    :  0000_1100  0x0C   12    
  31    :  0000_0000  0x00    0    
  32    :  0000_0010  0x02    2    
  33    :  0000_0000  0x00    0    
  34    :  0000_0001  0x01    1    
  35    :  0000_0000  0x00    0    
  36    :  0000_0000  0x00    0    
  37    :  0000_0100  0x04    4    
  38    :  1101_0010  0xD2  210    
  39    :  0000_0000  0x00    0    
  40    :  0000_1000  0x08    8    
  41    :  0000_0101  0x05    5    
  42    :  0110_0111  0x67  103  g  
  43    :  0110_1111  0x6F  111  o  
  44    :  0110_1111  0x6F  111  o  
  45    :  0111_0011  0x73  115  s  
  46    :  0110_0101  0x65  101  e  
  47    :  1100_0000  0xC0  192    
  48    :  0000_1100  0x0C   12    
  49    :  1100_0000  0xC0  192    
  50    :  0000_1100  0x0C   12    
  51    :  0000_0000  0x00    0    
  52    :  0000_0001  0x01    1    
  53    :  0000_0000  0x00    0    
  54    :  0000_0001  0x01    1    
  55    :  0000_0000  0x00    0    
  56    :  0000_0000  0x00    0    
  57    :  0000_0010  0x02    2    
  58    :  0011_0111  0x37   55  7  
  59    :  0000_0000  0x00    0    
  60    :  0000_0100  0x04    4    
  61    :  0000_1010  0x0A   10    
  62    :  0110_0010  0x62   98  b  
  63    :  0100_1100  0x4C   76  L  
  64    :  0011_0110  0x36   54  6  
  65    :  1100_0000  0xC0  192    
  66    :  0000_1100  0x0C   12    
  67    :  0000_0000  0x00    0    
  68    :  0001_0000  0x10   16    
  69    :  0000_0000  0x00    0    
  70    :  0000_0001  0x01    1    
  71    :  0000_0000  0x00    0    
  72    :  0000_0000  0x00    0    
  73    :  0000_0010  0x02    2    
  74    :  1010_0110  0xA6  166    
  75    :  0000_0000  0x00    0    
  76    :  0010_1101  0x2D   45  -  
  77    :  0010_1100  0x2C   44  ,  
  78    :  0101_0100  0x54   84  T  
  79    :  0110_1000  0x68  104  h  
  80    :  0110_0101  0x65  101  e  
  81    :  0010_0000  0x20   32     
  82    :  0101_0001  0x51   81  Q  
  83    :  0111_0101  0x75  117  u  
  84    :  0110_1001  0x69  105  i  
  85    :  0110_0011  0x63   99  c  
  86    :  0110_1011  0x6B  107  k  
  87    :  0010_0000  0x20   32     
  88    :  0100_0010  0x42   66  B  
  89    :  0111_0010  0x72  114  r  
  90    :  0110_1111  0x6F  111  o  
  91    :  0111_0111  0x77  119  w  
  92    :  0110_1110  0x6E  110  n  
  93    :  0010_0000  0x20   32     
  94    :  0100_0110  0x46   70  F  
  95    :  0110_1111  0x6F  111  o  
  96    :  0111_1000  0x78  120  x  
  97    :  0010_0000  0x20   32     
  98    :  0100_1010  0x4A   74  J  
  99    :  0111_0101  0x75  117  u  
  100   :  0110_1101  0x6D  109  m  
  101   :  0111_0000  0x70  112  p  
  102   :  0110_0101  0x65  101  e  
  103   :  0110_0100  0x64  100  d  
  104   :  0010_0000  0x20   32     
  105   :  0100_1111  0x4F   79  O  
  106   :  0111_0110  0x76  118  v  
  107   :  0110_0101  0x65  101  e  
  108   :  0111_0010  0x72  114  r  
  109   :  0010_0000  0x20   32     
  110   :  0101_0100  0x54   84  T  
  111   :  0110_1000  0x68  104  h  
  112   :  0110_0101  0x65  101  e  
  113   :  0010_0000  0x20   32     
  114   :  0100_1100  0x4C   76  L  
  115   :  0110_0001  0x61   97  a  
  116   :  0111_1010  0x7A  122  z  
  117   :  0111_1001  0x79  121  y  
  118   :  0010_0000  0x20   32     
  119   :  0100_0100  0x44   68  D  
  120   :  0110_1111  0x6F  111  o  
  121   :  0110_0111  0x67  103  g  
  122   :  1100_0000  0xC0  192    
  123   :  0000_1100  0x0C   12    
  124   :  0000_0000  0x00    0    
  125   :  0000_1111  0x0F   15    
  126   :  0000_0000  0x00    0    
  127   :  0000_0001  0x01    1    
  128   :  0000_0000  0x00    0    
  129   :  0000_0000  0x00    0    
  130   :  0000_0011  0x03    3    
  131   :  0001_0101  0x15   21    
  132   :  0000_0000  0x00    0    
  133   :  0000_1111  0x0F   15    
  134   :  0000_0000  0x00    0    
  135   :  0011_0111  0x37   55  7  
  136   :  0000_1010  0x0A   10    
  137   :  0110_1101  0x6D  109  m  
  138   :  0110_0001  0x61   97  a  
  139   :  0110_1001  0x69  105  i  
  140   :  0110_1100  0x6C  108  l  
  141   :  0111_0011  0x73  115  s  
  142   :  0110_0101  0x65  101  e  
  143   :  0111_0010  0x72  114  r  
  144   :  0111_0110  0x76  118  v  
  145   :  0110_0101  0x65  101  e  
  146   :  0111_0010  0x72  114  r  
  147   :  1100_0000  0xC0  192    
  148   :  0001_0000  0x10   16    
  149   :  1100_0000  0xC0  192    
  150   :  0000_1100  0x0C   12    
  151   :  0000_0000  0x00    0    
  152   :  0000_0110  0x06    6    
  153   :  0000_0000  0x00    0    
  154   :  0000_0001  0x01    1    
  155   :  0000_0000  0x00    0    
  156   :  0000_0000  0x00    0    
  157   :  0010_0010  0x22   34  "  
  158   :  1100_1110  0xCE  206    
  159   :  0000_0000  0x00    0    
  160   :  0010_0100  0x24   36  $  
  161   :  0000_0101  0x05    5    
  162   :  0110_1101  0x6D  109  m  
  163   :  0110_1110  0x6E  110  n  
  164   :  0110_0001  0x61   97  a  
  165   :  0110_1101  0x6D  109  m  
  166   :  0110_0101  0x65  101  e  
  167   :  1100_0000  0xC0  192    
  168   :  0001_0000  0x10   16    
  169   :  0000_0101  0x05    5    
  170   :  0111_0010  0x72  114  r  
  171   :  0110_1110  0x6E  110  n  
  172   :  0110_0001  0x61   97  a  
  173   :  0110_1101  0x6D  109  m  
  174   :  0110_0101  0x65  101  e  
  175   :  1100_0000  0xC0  192    
  176   :  0001_0000  0x10   16    
  177   :  0000_0111  0x07    7    
  178   :  0101_1011  0x5B   91  [  
  179   :  1100_1101  0xCD  205    
  180   :  0001_0101  0x15   21    
  181   :  0000_0000  0x00    0    
  182   :  0000_0000  0x00    0    
  183   :  0010_0111  0x27   39  '  
  184   :  0001_0000  0x10   16    
  185   :  0000_0000  0x00    0    
  186   :  0000_0000  0x00    0    
  187   :  0000_0001  0x01    1    
  188   :  1001_0000  0x90  144    
  189   :  0000_0000  0x00    0    
  190   :  0000_0011  0x03    3    
  191   :  0000_1101  0x0D   13    
  192   :  0100_0000  0x40   64  @  
  193   :  0000_0000  0x00    0    
  194   :  0000_0000  0x00    0    
  195   :  0000_1110  0x0E   14    
  196   :  0001_0000  0x10   16    
);
  
### offset from above = 149
$ancount++;
$ttl = 8910;
@rdata = ('mname.bar.com','rname.bar.com',123456789,10000,400,200000,3600);
($off, @dnptrs) = $put->SOA(\$buffer,$off,\@dnptrs,$name,$ttl,@rdata);
#print_head(\$buffer);
#print_buf(\$buffer); 
#print_ptrs(@dnptrs); 
put_ancount(\$buffer,$ancount);
chk_exp(\$buffer,\$exptext);


## test 9       check load of internal test buffer
my($answers,$toff) = rblf_load_dnstest($buffer);
my $exp = 5;
print "got: $answers, exp: $exp\nnot "
	unless $answers == $exp;
&ok;

## test 10
$exp = 197;	# final offest
print "got: $toff, exp: $exp\nnot "
	unless $toff == $exp;
&ok;

## test 11	dump and check the internal packet buffer
my($len,$packet) = rblf_dump_packet();
print "got: $len, exp: $exp\nnot "
	unless $len == $exp;
&ok;

## test 12
chk_exp(\$packet,\$exptext);

########## transfer mechanisms tested, internal buffer verified
# check query response for NS A TXT MX SOA, uncompressed
#
## test 13-17	check case out of NS
my($type,$rdl);
($type,$ttl,$rdl,$rdata,$off) = rblf_next_answer();
$exptext = q(
  0     :  0000_0101  0x05    5    
  1     :  0110_0111  0x67  103  g  
  2     :  0110_1111  0x6F  111  o  
  3     :  0110_1111  0x6F  111  o  
  4     :  0111_0011  0x73  115  s  
  5     :  0110_0101  0x65  101  e  
  6     :  0000_0011  0x03    3    
  7     :  0110_0110  0x66  102  f  
  8     :  0110_1111  0x6F  111  o  
  9     :  0110_1111  0x6F  111  o  
  10    :  0000_0011  0x03    3    
  11    :  0110_0010  0x62   98  b  
  12    :  0110_0001  0x61   97  a  
  13    :  0111_0010  0x72  114  r  
  14    :  0000_0011  0x03    3    
  15    :  0110_0011  0x63   99  c  
  16    :  0110_1111  0x6F  111  o  
  17    :  0110_1101  0x6D  109  m  
  18    :  0000_0000  0x00    0    
);
##subtest	type
$exp = 'T_NS';
print 'got: '. TypeTxt->{$type} .", exp: $exp\nnot "
	unless TypeTxt->{$type} eq $exp;
&ok;

##subtest	ttl
$exp = 1234;
print "got: $ttl, exp: $exp\nnot "
	unless $ttl == $exp;
&ok;

##subtest	rdl
$exp = 19;
print "got: $rdl, exp: $exp\nnot "
	unless $rdl == $exp;
&ok;

##subtest	rdata
#print_buf(\$rdata);
chk_exp(\$rdata,\$exptext);

##subtest	offset
$exp = 49;
print "got: $off, exp: $exp\nnot "
	unless $off == $exp;
&ok;

## test 18-22	check case out of A
($type,$ttl,$rdl,$rdata,$off) = rblf_next_answer();
$exptext = q(
  0     :  0000_1010  0x0A   10    
  1     :  0110_0010  0x62   98  b  
  2     :  0100_1100  0x4C   76  L  
  3     :  0011_0110  0x36   54  6  
);
##subtest	type
$exp = 'T_A';
print 'got: '. TypeTxt->{$type} .", exp: $exp\nnot "
	unless TypeTxt->{$type} eq $exp;
&ok;

##subtest	ttl
$exp = 567;
print "got: $ttl, exp: $exp\nnot "
	unless $ttl == $exp;
&ok;

##subtest	rdl
$exp = 4;
print "got: $rdl, exp: $exp\nnot "
	unless $rdl == $exp;
&ok;

##subtest	rdata
#print_buf(\$rdata);
chk_exp(\$rdata,\$exptext);

##subtest	offset
$exp = 65;
print "got: $off, exp: $exp\nnot "
	unless $off == $exp;
&ok;

## test 23-27	check case out of TXT
($type,$ttl,$rdl,$rdata,$off) = rblf_next_answer();
$exptext = q(
  0     :  0010_1100  0x2C   44  ,  
  1     :  0101_0100  0x54   84  T  
  2     :  0110_1000  0x68  104  h  
  3     :  0110_0101  0x65  101  e  
  4     :  0010_0000  0x20   32     
  5     :  0101_0001  0x51   81  Q  
  6     :  0111_0101  0x75  117  u  
  7     :  0110_1001  0x69  105  i  
  8     :  0110_0011  0x63   99  c  
  9     :  0110_1011  0x6B  107  k  
  10    :  0010_0000  0x20   32     
  11    :  0100_0010  0x42   66  B  
  12    :  0111_0010  0x72  114  r  
  13    :  0110_1111  0x6F  111  o  
  14    :  0111_0111  0x77  119  w  
  15    :  0110_1110  0x6E  110  n  
  16    :  0010_0000  0x20   32     
  17    :  0100_0110  0x46   70  F  
  18    :  0110_1111  0x6F  111  o  
  19    :  0111_1000  0x78  120  x  
  20    :  0010_0000  0x20   32     
  21    :  0100_1010  0x4A   74  J  
  22    :  0111_0101  0x75  117  u  
  23    :  0110_1101  0x6D  109  m  
  24    :  0111_0000  0x70  112  p  
  25    :  0110_0101  0x65  101  e  
  26    :  0110_0100  0x64  100  d  
  27    :  0010_0000  0x20   32     
  28    :  0100_1111  0x4F   79  O  
  29    :  0111_0110  0x76  118  v  
  30    :  0110_0101  0x65  101  e  
  31    :  0111_0010  0x72  114  r  
  32    :  0010_0000  0x20   32     
  33    :  0101_0100  0x54   84  T  
  34    :  0110_1000  0x68  104  h  
  35    :  0110_0101  0x65  101  e  
  36    :  0010_0000  0x20   32     
  37    :  0100_1100  0x4C   76  L  
  38    :  0110_0001  0x61   97  a  
  39    :  0111_1010  0x7A  122  z  
  40    :  0111_1001  0x79  121  y  
  41    :  0010_0000  0x20   32     
  42    :  0100_0100  0x44   68  D  
  43    :  0110_1111  0x6F  111  o  
  44    :  0110_0111  0x67  103  g  
);
##subtest	type
$exp = 'T_TXT';
print 'got: '. TypeTxt->{$type} .", exp: $exp\nnot "
	unless TypeTxt->{$type} eq $exp;
&ok;

##subtest	ttl
$exp = 678;
print "got: $ttl, exp: $exp\nnot "
	unless $ttl == $exp;
&ok;

##subtest	rdl
$exp = 45;
print "got: $rdl, exp: $exp\nnot "
	unless $rdl == $exp;
&ok;

##subtest	rdata
#print_buf(\$rdata);
chk_exp(\$rdata,\$exptext);

##subtest	offset
$exp = 122;
print "got: $off, exp: $exp\nnot "
	unless $off == $exp;
&ok;

## test 28-32	check case out of MX
($type,$ttl,$rdl,$rdata,$off) = rblf_next_answer();
$exptext = q(
  0     :  0000_0000  0x00    0    
  1     :  0011_0111  0x37   55  7  
  2     :  0000_1010  0x0A   10    
  3     :  0110_1101  0x6D  109  m  
  4     :  0110_0001  0x61   97  a  
  5     :  0110_1001  0x69  105  i  
  6     :  0110_1100  0x6C  108  l  
  7     :  0111_0011  0x73  115  s  
  8     :  0110_0101  0x65  101  e  
  9     :  0111_0010  0x72  114  r  
  10    :  0111_0110  0x76  118  v  
  11    :  0110_0101  0x65  101  e  
  12    :  0111_0010  0x72  114  r  
  13    :  0000_0011  0x03    3    
  14    :  0110_0010  0x62   98  b  
  15    :  0110_0001  0x61   97  a  
  16    :  0111_0010  0x72  114  r  
  17    :  0000_0011  0x03    3    
  18    :  0110_0011  0x63   99  c  
  19    :  0110_1111  0x6F  111  o  
  20    :  0110_1101  0x6D  109  m  
  21    :  0000_0000  0x00    0    
);
##subtest	type
$exp = 'T_MX';
print 'got: '. TypeTxt->{$type} .", exp: $exp\nnot "
	unless TypeTxt->{$type} eq $exp;
&ok;

##subtest	ttl
$exp = 789;
print "got: $ttl, exp: $exp\nnot "
	unless $ttl == $exp;
&ok;

##subtest	rdl
$exp = 22;
print "got: $rdl, exp: $exp\nnot "
	unless $rdl == $exp;
&ok;

##subtest	rdata
#print_buf(\$rdata);
chk_exp(\$rdata,\$exptext);

##subtest	offset
$exp = 149;
print "got: $off, exp: $exp\nnot "
	unless $off == $exp;
&ok;

## test 33-37	check case out of SOA
($type,$ttl,$rdl,$rdata,$off) = rblf_next_answer();
$exptext = q(
  0     :  0000_0101  0x05    5    
  1     :  0110_1101  0x6D  109  m  
  2     :  0110_1110  0x6E  110  n  
  3     :  0110_0001  0x61   97  a  
  4     :  0110_1101  0x6D  109  m  
  5     :  0110_0101  0x65  101  e  
  6     :  0000_0011  0x03    3    
  7     :  0110_0010  0x62   98  b  
  8     :  0110_0001  0x61   97  a  
  9     :  0111_0010  0x72  114  r  
  10    :  0000_0011  0x03    3    
  11    :  0110_0011  0x63   99  c  
  12    :  0110_1111  0x6F  111  o  
  13    :  0110_1101  0x6D  109  m  
  14    :  0000_0000  0x00    0    
  15    :  0000_0101  0x05    5    
  16    :  0111_0010  0x72  114  r  
  17    :  0110_1110  0x6E  110  n  
  18    :  0110_0001  0x61   97  a  
  19    :  0110_1101  0x6D  109  m  
  20    :  0110_0101  0x65  101  e  
  21    :  0000_0011  0x03    3    
  22    :  0110_0010  0x62   98  b  
  23    :  0110_0001  0x61   97  a  
  24    :  0111_0010  0x72  114  r  
  25    :  0000_0011  0x03    3    
  26    :  0110_0011  0x63   99  c  
  27    :  0110_1111  0x6F  111  o  
  28    :  0110_1101  0x6D  109  m  
  29    :  0000_0000  0x00    0    
  30    :  0000_0111  0x07    7    
  31    :  0101_1011  0x5B   91  [  
  32    :  1100_1101  0xCD  205    
  33    :  0001_0101  0x15   21    
  34    :  0000_0000  0x00    0    
  35    :  0000_0000  0x00    0    
  36    :  0010_0111  0x27   39  '  
  37    :  0001_0000  0x10   16    
  38    :  0000_0000  0x00    0    
  39    :  0000_0000  0x00    0    
  40    :  0000_0001  0x01    1    
  41    :  1001_0000  0x90  144    
  42    :  0000_0000  0x00    0    
  43    :  0000_0011  0x03    3    
  44    :  0000_1101  0x0D   13    
  45    :  0100_0000  0x40   64  @  
  46    :  0000_0000  0x00    0    
  47    :  0000_0000  0x00    0    
  48    :  0000_1110  0x0E   14    
  49    :  0001_0000  0x10   16    
);
##subtest	type
$exp = 'T_SOA';
print 'got: '. TypeTxt->{$type} .", exp: $exp\nnot "
	unless TypeTxt->{$type} eq $exp;
&ok;

##subtest	ttl
$exp = 8910;
print "got: $ttl, exp: $exp\nnot "
	unless $ttl == $exp;
&ok;

##subtest	rdl
$exp = 50;
print "got: $rdl, exp: $exp\nnot "
	unless $rdl == $exp;
&ok;

##subtest	rdata
#print_buf(\$rdata);
chk_exp(\$rdata,\$exptext);

##subtest	offset
$exp = 197;
print "got: $off, exp: $exp\nnot "
	unless $off == $exp;
&ok;