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