bulkwalk.t
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:9k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. #!./perl
  2. #
  3. # $Id: bulkwalk.t,v 5.8.2.1 2005/10/11 09:27:27 dts12 Exp $
  4. #
  5. # Test bulkwalk functionality.
  6. use Data::Dumper;
  7. BEGIN {
  8.     unless(grep /blib/, @INC) {
  9.         chdir 't' if -d 't';
  10.         @INC = '../lib' if -d '../lib';
  11.     }
  12. }
  13. use Test;
  14. BEGIN { $num = 62; plan test => $num; }
  15. use SNMP;
  16. require "t/startagent.pl";
  17. use vars qw($agent_port $comm2 $agent_host);
  18. $SNMP::debugging = 0;
  19. $SNMP::verbose = 0;
  20. #print "1..$numn";
  21. ######################################################################
  22. # Fire up a session.
  23. $s1 = new SNMP::Session(
  24.     'DestHost'   => $agent_host,
  25.     'Community'  => $comm2,
  26.     'RemotePort' => $agent_port,
  27.     'Version'    => '2c',
  28.     'UseNumeric' => 1,
  29.     'UseEnum'    => 0,
  30.     'UseLongNames' => 1
  31. );
  32. ok(defined($s1));
  33. ######################################################################
  34. # Attempt to use the bulkwalk method to get a few variables from the
  35. # SNMP agent.
  36. # test 1
  37. $vars = new SNMP::VarList ( ['sysUpTime'], ['ifNumber'], # NON-repeaters
  38.     ['ifSpeed'], ['ifDescr']);  # Repeated variables.
  39. $expect = scalar @$vars;
  40. @list = $s1->bulkwalk(2, 16, $vars);
  41. ok($s1->{ErrorNum} == 0);
  42. # Did we get back the list of references to returned values?
  43. #
  44. ok(scalar @list == $expect);
  45. if (defined($list[0][0])) {
  46.   # Sanity check the returned values.  list[0] is sysUptime nonrepeater.
  47.   ok($list[0][0]->tag eq ".1.3.6.1.2.1.1.3"); # check system.sysUptime OID
  48.   ok($list[0][0]->iid eq "0"); # check system.sysUptime.0 IID
  49.   ok($list[0][0]->val =~ m/^d+$/); # Uptime is numeric 
  50.   ok($list[0][0]->type eq "TICKS"); # Uptime should be in ticks.
  51. }
  52. else {
  53.   ok(0);
  54.   ok(0);
  55.   ok(0);
  56.   ok(0);
  57. }
  58. if (defined($list[1][0])) {
  59.   # Find out how many interfaces to expect.  list[1] is ifNumber nonrepeater.
  60.   ok($list[1][0]->tag eq ".1.3.6.1.2.1.2.1"); # Should be system.ifNumber OID.
  61.   ok($list[1][0]->iid eq "0"); # system.ifNumber.0 IID.
  62.   ok($list[1][0]->val =~ m/^d+$/); # Number is all numeric 
  63.   #XXX: test fails due SMIv1 codes being returned intstead of SMIv2...
  64.   #ok($list[1][0]->type eq "INTEGER32"); # Number should be integer.
  65.   $ifaces = $list[1][0]->val;
  66. }
  67. else {
  68.   ok(0);
  69.   ok(0);
  70.   ok(0);
  71. }
  72.     
  73. # Make sure we got an ifSpeed for each interface.  list[2] is ifSpeed repeater.
  74. ok(scalar @{$list[2]} == $ifaces);
  75. # Make sure we got an ifDescr for each interface.  list[3] is ifDescr repeater.
  76. ok(scalar @{$list[3]} == $ifaces);
  77. if (defined($list[2][0])) {
  78.   # Test for reasonable values from the agent.
  79.   ok($list[2][0]->tag eq ".1.3.6.1.2.1.2.2.1.5"); # Should be system.ifSpeed OID.
  80.   ok($list[2][0]->iid eq "1"); # Instance should be 1.
  81.   ok($list[2][0]->val =~ m/^d+$/); # Number is all numeric 
  82.   ok($list[2][0]->type eq "GAUGE"); # Number should be a gauge.
  83. }
  84. else {
  85.   ok(0);
  86.   ok(0);
  87.   ok(0);
  88.   ok(0);
  89. }
  90. if (defined($list[3][0])) {
  91.   ok($list[3][0]->tag eq ".1.3.6.1.2.1.2.2.1.2"); # Should be system.ifDescr OID.
  92.   ok($list[3][0]->iid eq "1"); # Instance should be 1.
  93.   # The first interface is probably loopback.  Check this.
  94.   ok($list[3][0]->type eq "OCTETSTR"); # Description is a string.
  95.   # This might fail for some weird (Windows?) systems.  Can be safely ignored.
  96.   $loopback = $list[3][0]->val;
  97.   if ($^O =~ /win32/i) {
  98.     ok(($loopback =~ /loopback/i));  
  99.   }
  100.   else {
  101.     ok(($loopback =~ /^lo/));
  102.   }
  103. }
  104. else {
  105.   ok(0);
  106.   ok(0);
  107.   ok(0);
  108.   ok(0);
  109. }
  110.   
  111. ###############################################################################
  112. # Attempt to use the bulkwalk method to get only non-repeaters
  113. # test 2
  114. $vars = new SNMP::VarList ( ['sysUpTime'], ['ifNumber'] ); # NON-repeaters
  115. $expect = scalar @$vars;
  116. @list = $s1->bulkwalk(2, 0, $vars);
  117. #@list = $s1->bulkwalk(2, 16, $vars);
  118. ok($s1->{ErrorNum} == 0);
  119. # Did we get back the list of references to returned values?
  120. #
  121. ok(scalar @list == $expect);
  122. if (defined($list[0][0])) {
  123.   # Sanity check the returned values.  list[0] is sysUptime nonrepeater.
  124.   ok($list[0][0]->tag eq ".1.3.6.1.2.1.1.3"); # check system.sysUptime OID
  125.   ok($list[0][0]->iid eq "0"); # check system.sysUptime.0 IID
  126.   ok($list[0][0]->val =~ m/^d+$/); # Uptime is numeric 
  127.   ok($list[0][0]->type eq "TICKS"); # Uptime should be in ticks.
  128. }
  129. else {
  130.   ok(0);
  131.   ok(0);
  132.   ok(0);
  133.   ok(0);
  134. }
  135. if (defined($list[1][0])) {
  136.   # Find out how many interfaces to expect.  list[1] is ifNumber nonrepeater.
  137.   ok($list[1][0]->tag eq ".1.3.6.1.2.1.2.1"); # Should be system.ifNumber OID.
  138.   ok($list[1][0]->iid eq "0"); # system.ifNumber.0 IID.
  139.   ok($list[1][0]->val =~ m/^d+$/); # Number is all numeric 
  140.   #XXX: test fails due SMIv1 codes being returned intstead of SMIv2...
  141.   #ok($list[1][0]->type eq "INTEGER32"); # Number should be integer.
  142.   $ifaces = $list[1][0]->val;
  143. }
  144. else {
  145.   ok(0);
  146.   ok(0);
  147.   ok(0);
  148. }
  149. ###############################################################################
  150. # Attempt to use the bulkwalk method to get only repeated variables
  151. # test 3
  152. $vars = new SNMP::VarList ( ['ifIndex'], ['ifSpeed'] ); # repeaters
  153. $expect = scalar @$vars;
  154. @list = $s1->bulkwalk(0, 16, $vars);
  155. ok($s1->{ErrorNum} == 0);
  156. # Did we get back the list of references to returned values?
  157. #
  158. ok(scalar @list == $expect);
  159. # Make sure we got an ifIndex for each interface.  list[0] is ifIndex repeater.
  160. ok(scalar @{$list[0]} == $ifaces);
  161. # Make sure we got an ifSpeed for each interface.  list[0] is ifSpeed repeater.
  162. ok(scalar @{$list[1]} == $ifaces);
  163. if (defined($list[0][0])) {
  164.   # Test for reasonable values from the agent.
  165.   ok($list[0][0]->tag eq ".1.3.6.1.2.1.2.2.1.1"); # Should be system.ifIndex OID.
  166.   ok($list[0][0]->iid eq "1"); # Instance should be 1.
  167.   ok($list[0][0]->val =~ m/^d+$/); # Number is all numeric 
  168.   #XXX: test fails due SMIv1 codes being returned intstead of SMIv2...
  169.   #ok($list[0][0]->type eq "INTEGER32"); # Number should be an integer.
  170. }
  171. else {
  172.   ok(0);
  173.   ok(0);
  174.   ok(0);
  175. }
  176. if (defined($list[1][0])) {
  177.   ok($list[1][0]->tag eq ".1.3.6.1.2.1.2.2.1.5"); # Should be system.ifSpeed OID.
  178.   ok($list[1][0]->iid eq "1"); # Instance should be 1.
  179.   ok($list[1][0]->val =~ m/^d+$/); # Number is all numeric 
  180.   ok($list[1][0]->type eq "GAUGE"); # Number should be a gauge.
  181. }
  182. else {
  183.   ok(0);
  184.   ok(0);
  185.   ok(0);
  186.   ok(0);
  187. }
  188. ######################################################################
  189. #  Asynchronous Bulkwalk Methods
  190. ######################################################################
  191. # Attempt to use the bulkwalk method to get a few variables from the
  192. # SNMP agent.
  193. # test 4
  194. sub async_cb1 {
  195.     my ($vars, $list) = @_;
  196.     ok(defined $list && ref($list) =~ m/ARRAY/);
  197.     ok(defined $vars && ref($vars) =~ m/SNMP::VarList/);
  198.     ok(scalar @$list == scalar @$vars);
  199.     my $vbr;
  200.     if (defined($list->[0][0])) {
  201.       # Sanity check the returned values.  First is sysUptime nonrepeater.
  202.       $vbr = $list->[0][0];
  203.       ok($vbr->tag eq ".1.3.6.1.2.1.1.3"); # check system.sysUptime OID
  204.       ok($vbr->iid eq "0"); # check system.sysUptime.0 IID
  205.       ok($vbr->val =~ m/^d+$/); # Uptime is numeric 
  206.       ok($vbr->type eq "TICKS"); # Uptime should be in ticks.
  207.     }
  208.     else {
  209.       ok(0);
  210.       ok(0);
  211.       ok(0);
  212.       ok(0);
  213.     }
  214.     if (defined($list->[1][0])) {
  215.       # Find out how many interfaces to expect.  Next is ifNumber nonrepeater.
  216.       $vbr = $list->[1][0];
  217.       ok($vbr->tag eq ".1.3.6.1.2.1.2.1"); # Should be system.ifNumber OID.
  218.       ok($vbr->iid eq "0"); # system.ifNumber.0 IID.
  219.       ok($vbr->val =~ m/^d+$/); # Number is all numeric 
  220.       #XXX: test fails due SMIv1 codes being returned intstead of SMIv2...
  221.       #    ok($vbr->type eq "INTEGER32"); # Number should be integer.
  222.       $ifaces = $vbr->[2];
  223.     }
  224.     else {
  225.       ok(0);
  226.       ok(0);
  227.       ok(0);
  228.     }
  229.     # Test for reasonable values from the agent.
  230.     ok(scalar @{$list->[2]} == $ifaces);
  231.     
  232.     if (defined($list->[2][0])) {
  233.       $vbr = $list->[2][0];
  234.       ok($vbr->tag eq ".1.3.6.1.2.1.2.2.1.5"); # Should be ifSpeed OID
  235.       ok($vbr->iid eq "1"); # Instance should be 1.
  236.       ok($vbr->val =~ m/^d+$/); # Number is all numeric 
  237.       ok($vbr->type eq "GAUGE"); # Should be a gauge.
  238.       ok(scalar @{$list->[3]} == $ifaces);
  239.     }
  240.     else {
  241.       ok(0);
  242.       ok(0);
  243.       ok(0);
  244.       ok(0);
  245.       ok(0);
  246.     }
  247.   
  248.     if (defined($list->[3][0])) {
  249.       $vbr = $list->[3][0];
  250.       ok($vbr->tag eq ".1.3.6.1.2.1.2.2.1.2"); # Should be ifDescr OID
  251.       ok($vbr->iid eq "1"); # Instance should be 1.
  252.       # The first interface is probably loopback.  Check this.
  253.       ok($vbr->type eq "OCTETSTR");
  254.       # This might fail for some weird (Windows?) systems.  Can be safely ignored.
  255.       ok(($vbr->val =~ /^lo/));
  256.     }
  257.     else {
  258.       ok(0);
  259.       ok(0);
  260.       ok(0);
  261.       ok(0);
  262.     }
  263.     SNMP::finish();
  264. }
  265. $vars = new SNMP::VarList ( ['sysUpTime'], ['ifNumber'], # NON-repeaters
  266.     ['ifSpeed'], ['ifDescr']);  # Repeated variables.
  267. if ($^O =~ /win32/i) {
  268.   warn "Win32 detected - skipping and failing async callsn";
  269.   for (my $i=1;$i <= 21; $i++) {
  270.     ok(0);
  271.   }
  272. }
  273. else {
  274.   @list = $s1->bulkwalk(2, 16, $vars, [ &async_cb1, $vars ] );
  275.   ok($s1->{ErrorNum} == 0);
  276.   SNMP::MainLoop();
  277. }
  278. ok(1);
  279. snmptest_cleanup();