Blame perl/SNMP/t/bulkwalk.t

Packit fcad23
#!./perl
Packit fcad23
#
Packit fcad23
# $Id$
Packit fcad23
#
Packit fcad23
# Test bulkwalk functionality.
Packit fcad23
Packit fcad23
BEGIN {
Packit fcad23
    unless(grep /blib/, @INC) {
Packit fcad23
        chdir 't' if -d 't';
Packit fcad23
        @INC = '../lib' if -d '../lib';
Packit fcad23
    }
Packit fcad23
    eval "use Cwd qw(abs_path)";
Packit fcad23
    $ENV{'SNMPCONFPATH'} = 'nopath';
Packit fcad23
    $ENV{'MIBDIRS'} = '+' . abs_path("../../mibs");
Packit fcad23
    $skipped_tests = ($^O =~ /win32/i) ? 21 : 0;
Packit fcad23
}
Packit fcad23
use Test;
Packit fcad23
BEGIN { $num = 62 - $skipped_tests; plan test => $num; }
Packit fcad23
Packit fcad23
use SNMP;
Packit fcad23
Packit fcad23
require "t/startagent.pl";
Packit fcad23
Packit fcad23
use vars qw($agent_port $comm2 $agent_host);
Packit fcad23
Packit fcad23
$SNMP::debugging = 0;
Packit fcad23
$SNMP::verbose = 0;
Packit fcad23
Packit fcad23
#print "1..$num\n";
Packit fcad23
Packit fcad23
######################################################################
Packit fcad23
# Fire up a session.
Packit fcad23
$s1 = new SNMP::Session(
Packit fcad23
    'DestHost'   => $agent_host,
Packit fcad23
    'Community'  => $comm2,
Packit fcad23
    'RemotePort' => $agent_port,
Packit fcad23
    'Version'    => '2c',
Packit fcad23
    'UseNumeric' => 1,
Packit fcad23
    'UseEnum'    => 0,
Packit fcad23
    'UseLongNames' => 1
Packit fcad23
);
Packit fcad23
ok(defined($s1));
Packit fcad23
Packit fcad23
######################################################################
Packit fcad23
# 
Packit fcad23
# Attempt to use the bulkwalk method to get a few variables from the
Packit fcad23
# SNMP agent.
Packit fcad23
# test 1
Packit fcad23
$vars = new SNMP::VarList ( ['sysUpTime'], ['ifNumber'], # NON-repeaters
Packit fcad23
			    ['ifSpeed'], ['ifDescr']);	 # Repeated variables.
Packit fcad23
Packit fcad23
$expect = scalar @$vars;
Packit fcad23
@list = $s1->bulkwalk(2, 16, $vars);
Packit fcad23
Packit fcad23
ok($s1->{ErrorNum} == 0);
Packit fcad23
Packit fcad23
# Did we get back the list of references to returned values?
Packit fcad23
#
Packit fcad23
ok(scalar @list == $expect);
Packit fcad23
if (defined($list[0][0])) {
Packit fcad23
  # Sanity check the returned values.  list[0] is sysUptime nonrepeater.
Packit fcad23
  ok($list[0][0]->tag eq ".1.3.6.1.2.1.1.3");	# check system.sysUptime OID
Packit fcad23
  ok($list[0][0]->iid eq "0");			# check system.sysUptime.0 IID
Packit fcad23
  ok($list[0][0]->val =~ m/^\d+$/);		# Uptime is numeric 
Packit fcad23
  ok($list[0][0]->type eq "TICKS");		# Uptime should be in ticks.
Packit fcad23
}
Packit fcad23
else {
Packit fcad23
  ok(0);
Packit fcad23
  ok(0);
Packit fcad23
  ok(0);
Packit fcad23
  ok(0);
Packit fcad23
}
Packit fcad23
if (defined($list[1][0])) {
Packit fcad23
  # Find out how many interfaces to expect.  list[1] is ifNumber nonrepeater.
Packit fcad23
  ok($list[1][0]->tag eq ".1.3.6.1.2.1.2.1");	# Should be system.ifNumber OID.
Packit fcad23
  ok($list[1][0]->iid eq "0");			# system.ifNumber.0 IID.
Packit fcad23
  ok($list[1][0]->val =~ m/^\d+$/);		# Number is all numeric 
Packit fcad23
  #XXX: test fails due SMIv1 codes being returned intstead of SMIv2...
Packit fcad23
  #ok($list[1][0]->type eq "INTEGER32");		# Number should be integer.
Packit fcad23
Packit fcad23
  $ifaces = $list[1][0]->val;
Packit fcad23
}
Packit fcad23
else {
Packit fcad23
  ok(0);
Packit fcad23
  ok(0);
Packit fcad23
  ok(0);
Packit fcad23
}
Packit fcad23
    
Packit fcad23
# Make sure we got an ifSpeed for each interface.  list[2] is ifSpeed repeater.
Packit fcad23
ok(scalar @{$list[2]} == $ifaces);
Packit fcad23
# Make sure we got an ifDescr for each interface.  list[3] is ifDescr repeater.
Packit fcad23
ok(scalar @{$list[3]} == $ifaces);
Packit fcad23
Packit fcad23
if (defined($list[2][0])) {
Packit fcad23
  # Test for reasonable values from the agent.
Packit fcad23
  ok($list[2][0]->tag eq ".1.3.6.1.2.1.2.2.1.5");	# Should be system.ifSpeed OID.
Packit fcad23
  ok($list[2][0]->iid eq "1");			# Instance should be 1.
Packit fcad23
  ok($list[2][0]->val =~ m/^\d+$/);		# Number is all numeric 
Packit fcad23
  ok($list[2][0]->type eq "GAUGE");		# Number should be a gauge.
Packit fcad23
}
Packit fcad23
else {
Packit fcad23
  ok(0);
Packit fcad23
  ok(0);
Packit fcad23
  ok(0);
Packit fcad23
  ok(0);
Packit fcad23
}
Packit fcad23
Packit fcad23
if (defined($list[3][0])) {
Packit fcad23
  ok($list[3][0]->tag eq ".1.3.6.1.2.1.2.2.1.2");	# Should be system.ifDescr OID.
Packit fcad23
  ok($list[3][0]->iid eq "1");			# Instance should be 1.
Packit fcad23
Packit fcad23
  # The first interface is probably loopback.  Check this.
Packit fcad23
  ok($list[3][0]->type eq "OCTETSTR");		# Description is a string.
Packit fcad23
Packit fcad23
  # This might fail on systems that don't have lo0/loopback as their first
Packit fcad23
  # interface. Please adjust accordingly.
Packit fcad23
  $loopback = $list[3][0]->val;
Packit fcad23
  if ($^O =~ /win32/i) {
Packit fcad23
    ok(($loopback =~ /loopback/i));
Packit fcad23
  } elsif ($^O =~ /(irix|hpux)/i) {
Packit fcad23
    # IRIX/HP-UX may have lo0 at the *end* of the interface list,
Packit fcad23
    # so just check for a non-empty string
Packit fcad23
    ok(($loopback ne ''));
Packit fcad23
  } elsif ($^O eq 'freebsd') {
Packit fcad23
    $loopback = $list[3][-1]->val;
Packit fcad23
    ok(($loopback =~ /^lo/));
Packit fcad23
  } else {
Packit fcad23
    ok(($loopback =~ /^lo/));
Packit fcad23
  }
Packit fcad23
}
Packit fcad23
else {
Packit fcad23
  ok(0);
Packit fcad23
  ok(0);
Packit fcad23
  ok(0);
Packit fcad23
  ok(0);
Packit fcad23
}
Packit fcad23
  
Packit fcad23
###############################################################################
Packit fcad23
# Attempt to use the bulkwalk method to get only non-repeaters
Packit fcad23
# test 2
Packit fcad23
$vars = new SNMP::VarList ( ['sysUpTime'], ['ifNumber'] ); # NON-repeaters
Packit fcad23
Packit fcad23
$expect = scalar @$vars;
Packit fcad23
@list = $s1->bulkwalk(2, 0, $vars);
Packit fcad23
#@list = $s1->bulkwalk(2, 16, $vars);
Packit fcad23
ok($s1->{ErrorNum} == 0);
Packit fcad23
Packit fcad23
# Did we get back the list of references to returned values?
Packit fcad23
#
Packit fcad23
ok(scalar @list == $expect);
Packit fcad23
Packit fcad23
if (defined($list[0][0])) {
Packit fcad23
  # Sanity check the returned values.  list[0] is sysUptime nonrepeater.
Packit fcad23
  ok($list[0][0]->tag eq ".1.3.6.1.2.1.1.3");	# check system.sysUptime OID
Packit fcad23
  ok($list[0][0]->iid eq "0");			# check system.sysUptime.0 IID
Packit fcad23
  ok($list[0][0]->val =~ m/^\d+$/);		# Uptime is numeric 
Packit fcad23
  ok($list[0][0]->type eq "TICKS");		# Uptime should be in ticks.
Packit fcad23
}
Packit fcad23
else {
Packit fcad23
  ok(0);
Packit fcad23
  ok(0);
Packit fcad23
  ok(0);
Packit fcad23
  ok(0);
Packit fcad23
}
Packit fcad23
Packit fcad23
if (defined($list[1][0])) {
Packit fcad23
  # Find out how many interfaces to expect.  list[1] is ifNumber nonrepeater.
Packit fcad23
  ok($list[1][0]->tag eq ".1.3.6.1.2.1.2.1");	# Should be system.ifNumber OID.
Packit fcad23
  ok($list[1][0]->iid eq "0");			# system.ifNumber.0 IID.
Packit fcad23
  ok($list[1][0]->val =~ m/^\d+$/);		# Number is all numeric 
Packit fcad23
  #XXX: test fails due SMIv1 codes being returned intstead of SMIv2...
Packit fcad23
  #ok($list[1][0]->type eq "INTEGER32");		# Number should be integer.
Packit fcad23
  $ifaces = $list[1][0]->val;
Packit fcad23
}
Packit fcad23
else {
Packit fcad23
  ok(0);
Packit fcad23
  ok(0);
Packit fcad23
  ok(0);
Packit fcad23
}
Packit fcad23
Packit fcad23
###############################################################################
Packit fcad23
# Attempt to use the bulkwalk method to get only repeated variables
Packit fcad23
# test 3
Packit fcad23
$vars = new SNMP::VarList ( ['ifIndex'], ['ifSpeed'] ); # repeaters
Packit fcad23
Packit fcad23
$expect = scalar @$vars;
Packit fcad23
@list = $s1->bulkwalk(0, 16, $vars);
Packit fcad23
ok($s1->{ErrorNum} == 0);
Packit fcad23
Packit fcad23
# Did we get back the list of references to returned values?
Packit fcad23
#
Packit fcad23
ok(scalar @list == $expect);
Packit fcad23
Packit fcad23
# Make sure we got an ifIndex for each interface.  list[0] is ifIndex repeater.
Packit fcad23
ok(scalar @{$list[0]} == $ifaces);
Packit fcad23
Packit fcad23
# Make sure we got an ifSpeed for each interface.  list[0] is ifSpeed repeater.
Packit fcad23
ok(scalar @{$list[1]} == $ifaces);
Packit fcad23
Packit fcad23
if (defined($list[0][0])) {
Packit fcad23
  # Test for reasonable values from the agent.
Packit fcad23
  ok($list[0][0]->tag eq ".1.3.6.1.2.1.2.2.1.1");	# Should be system.ifIndex OID.
Packit fcad23
  ok($list[0][0]->iid eq "1");			# Instance should be 1.
Packit fcad23
  ok($list[0][0]->val =~ m/^\d+$/);		# Number is all numeric 
Packit fcad23
  #XXX: test fails due SMIv1 codes being returned intstead of SMIv2...
Packit fcad23
  #ok($list[0][0]->type eq "INTEGER32");		# Number should be an integer.
Packit fcad23
}
Packit fcad23
else {
Packit fcad23
  ok(0);
Packit fcad23
  ok(0);
Packit fcad23
  ok(0);
Packit fcad23
}
Packit fcad23
Packit fcad23
if (defined($list[1][0])) {
Packit fcad23
  ok($list[1][0]->tag eq ".1.3.6.1.2.1.2.2.1.5");	# Should be system.ifSpeed OID.
Packit fcad23
  ok($list[1][0]->iid eq "1");			# Instance should be 1.
Packit fcad23
  ok($list[1][0]->val =~ m/^\d+$/);		# Number is all numeric 
Packit fcad23
  ok($list[1][0]->type eq "GAUGE");		# Number should be a gauge.
Packit fcad23
}
Packit fcad23
else {
Packit fcad23
  ok(0);
Packit fcad23
  ok(0);
Packit fcad23
  ok(0);
Packit fcad23
  ok(0);
Packit fcad23
}
Packit fcad23
Packit fcad23
######################################################################
Packit fcad23
#  Asynchronous Bulkwalk Methods
Packit fcad23
######################################################################
Packit fcad23
# 
Packit fcad23
# Attempt to use the bulkwalk method to get a few variables from the
Packit fcad23
# SNMP agent.
Packit fcad23
# test 4
Packit fcad23
sub async_cb1 {
Packit fcad23
    my ($vars, $list) = @_;
Packit fcad23
    ok(defined $list && ref($list) =~ m/ARRAY/);
Packit fcad23
    ok(defined $vars && ref($vars) =~ m/SNMP::VarList/);
Packit fcad23
Packit fcad23
    ok(scalar @$list == scalar @$vars);
Packit fcad23
Packit fcad23
    my $vbr;
Packit fcad23
Packit fcad23
    if (defined($list->[0][0])) {
Packit fcad23
      # Sanity check the returned values.  First is sysUptime nonrepeater.
Packit fcad23
      $vbr = $list->[0][0];
Packit fcad23
      ok($vbr->tag eq ".1.3.6.1.2.1.1.3");	# check system.sysUptime OID
Packit fcad23
      ok($vbr->iid eq "0");			# check system.sysUptime.0 IID
Packit fcad23
      ok($vbr->val =~ m/^\d+$/);			# Uptime is numeric 
Packit fcad23
      ok($vbr->type eq "TICKS");			# Uptime should be in ticks.
Packit fcad23
    }
Packit fcad23
    else {
Packit fcad23
      ok(0);
Packit fcad23
      ok(0);
Packit fcad23
      ok(0);
Packit fcad23
      ok(0);
Packit fcad23
    }
Packit fcad23
Packit fcad23
    if (defined($list->[1][0])) {
Packit fcad23
      # Find out how many interfaces to expect.  Next is ifNumber nonrepeater.
Packit fcad23
      $vbr = $list->[1][0];
Packit fcad23
      ok($vbr->tag eq ".1.3.6.1.2.1.2.1");	# Should be system.ifNumber OID.
Packit fcad23
      ok($vbr->iid eq "0");			# system.ifNumber.0 IID.
Packit fcad23
      ok($vbr->val =~ m/^\d+$/);			# Number is all numeric 
Packit fcad23
      #XXX: test fails due SMIv1 codes being returned intstead of SMIv2...
Packit fcad23
      #    ok($vbr->type eq "INTEGER32");		# Number should be integer.
Packit fcad23
      $ifaces = $vbr->[2];
Packit fcad23
    }
Packit fcad23
    else {
Packit fcad23
      ok(0);
Packit fcad23
      ok(0);
Packit fcad23
      ok(0);
Packit fcad23
    }
Packit fcad23
Packit fcad23
    # Test for reasonable values from the agent.
Packit fcad23
    ok(scalar @{$list->[2]} == $ifaces);
Packit fcad23
    
Packit fcad23
    if (defined($list->[2][0])) {
Packit fcad23
      $vbr = $list->[2][0];
Packit fcad23
      ok($vbr->tag eq ".1.3.6.1.2.1.2.2.1.5");	# Should be ifSpeed OID
Packit fcad23
      ok($vbr->iid eq "1");			# Instance should be 1.
Packit fcad23
      ok($vbr->val =~ m/^\d+$/);			# Number is all numeric 
Packit fcad23
      ok($vbr->type eq "GAUGE");			# Should be a gauge.
Packit fcad23
Packit fcad23
      ok(scalar @{$list->[3]} == $ifaces);
Packit fcad23
    }
Packit fcad23
    else {
Packit fcad23
      ok(0);
Packit fcad23
      ok(0);
Packit fcad23
      ok(0);
Packit fcad23
      ok(0);
Packit fcad23
      ok(0);
Packit fcad23
    }
Packit fcad23
  
Packit fcad23
    if (defined($list->[3][0])) {
Packit fcad23
      $vbr = $list->[3][0];
Packit fcad23
      ok($vbr->tag eq ".1.3.6.1.2.1.2.2.1.2");	# Should be ifDescr OID
Packit fcad23
      ok($vbr->iid eq "1");			# Instance should be 1.
Packit fcad23
Packit fcad23
      # The first interface is probably loopback.  Check this.
Packit fcad23
      ok($vbr->type eq "OCTETSTR");
Packit fcad23
Packit fcad23
      # This might fail on systems that don't have lo0/loopback as their first
Packit fcad23
      # interface. Please adjust accordingly.
Packit fcad23
      if ($^O =~ /(irix|hpux)/i) {
Packit fcad23
        # IRIX/HP-UX may have lo0 at the *end* of the interface list,
Packit fcad23
        # so just check for a non-empty string
Packit fcad23
        ok(($vbr->val ne ''));
Packit fcad23
      } elsif ($^O eq 'freebsd') {
Packit fcad23
        $vbr = $list->[3][-1];
Packit fcad23
        ok(($vbr->val =~ /^lo/));
Packit fcad23
      } else {
Packit fcad23
        ok(($vbr->val =~ /^lo/));
Packit fcad23
      }
Packit fcad23
    }
Packit fcad23
    else {
Packit fcad23
      ok(0);
Packit fcad23
      ok(0);
Packit fcad23
      ok(0);
Packit fcad23
      ok(0);
Packit fcad23
    }
Packit fcad23
Packit fcad23
    SNMP::finish();
Packit fcad23
}
Packit fcad23
Packit fcad23
$vars = new SNMP::VarList ( ['sysUpTime'], ['ifNumber'], # NON-repeaters
Packit fcad23
			    ['ifSpeed'], ['ifDescr']);	 # Repeated variables.
Packit fcad23
Packit fcad23
if ($^O =~ /win32/i) {
Packit fcad23
  warn "Win32/Win64 detected - skipping async calls\n";
Packit fcad23
}
Packit fcad23
else {
Packit fcad23
  @list = $s1->bulkwalk(2, 16, $vars, [ \&async_cb1, $vars ] );
Packit fcad23
  ok($s1->{ErrorNum} == 0);
Packit fcad23
  SNMP::MainLoop();
Packit fcad23
}
Packit fcad23
ok(1);
Packit fcad23
Packit fcad23
snmptest_cleanup();
Packit fcad23