1#!./perl
2
3use strict;
4use warnings;
5
6BEGIN {
7    eval "use Cwd qw(abs_path)";
8}
9
10use Test;
11BEGIN {plan tests => ($^O =~ /win32/i) ? 0 : 20}
12use SNMP;
13
14if ($^O =~ /win32/i) {
15  warn "Win32/Win64 detected - skipping async calls\n";
16  exit;
17}
18
19require "t/startagent.pl";
20use vars qw($agent_host $agent_port $comm);
21
22
23sub cb1; # forward reference
24sub cb2;
25sub cb3;
26sub cb4;
27sub cb5;
28sub cb6;
29sub cb7;
30sub cbDummy;
31
32$SNMP::verbose = 0;
33$SNMP::dump_packet = 0;
34
35my $sess = new SNMP::Session(DestHost => $agent_host,
36			  Version => 1,
37			  Community => $comm,
38			  RemotePort => $agent_port);
39
40# try getting unregistered OID.
41my $result = $sess->get([["HooHaaHooHaa","0"]], [\&cbDummy, $sess]);
42ok(!defined($result));
43
44# this get should work
45$result = $sess->get([["sysDescr","0"]], [\&cb1, $sess]);
46ok($result);
47
48SNMP::MainLoop();
49
50snmptest_cleanup();
51
52exit 0;
53
54sub cb1{
55    my $sess = shift;
56    my $vlist = shift;
57
58    ok(defined($vlist));
59    my $tag = $vlist->[0]->tag;
60    ok($tag eq 'sysDescr');
61    my $val = $vlist->[0]->val;
62    ok(defined $val);
63    my $iid = $vlist->[0]->iid;
64    my $type = $vlist->[0]->type;
65    ok($type eq 'OCTETSTR');
66    my $res = $sess->getnext([["sysDescr",0]], [\&cb2, $sess]);
67    ok ($res);
68} # end of cb1
69
70sub cb2{
71    my $sess = shift;
72    my $vlist = shift;
73
74    ok(defined($vlist));
75    ok(ref($vlist->[0]) =~ /Varbind/);
76    ok($vlist->[0][0] eq 'sysObjectID');
77    my $res = $sess->get([[".1.3.6.1.2.1.1.1.0"]], [\&cb3, $sess]);
78    ok($res);
79} # end of cb2
80
81sub cb3{
82    my $sess = shift;
83    my $vlist = shift;
84
85    ok(defined($vlist));
86
87    ok($vlist->[0][0] eq 'sysDescr');
88
89    my $res = $sess->getnext([["sysDescr",0]], [\&cb4, $sess]);
90    ok($res);
91} # end of cb3
92
93sub cb4{
94    my $sess = shift;
95    my $vlist = shift;
96
97    ok(defined $vlist);
98    my $res = $sess->set("sysDescr.0", "hahaha", [\&cb5, $sess]);
99} # end of cb4
100
101sub cb5{
102    my $sess = shift;
103    my $vlist = shift;
104
105    ok(defined($vlist));
106
107    my $res = $sess->set("sysORID.1", ".1.3.6.1.2.1.1.1", [\&cb6, $sess]);
108    ok(defined $res);
109} # end of cb5
110
111sub cb6{
112    my $sess = shift;
113    my $vlist = shift;
114    my $tag = $vlist->[0]->tag;
115    my $val = $vlist->[0]->val;
116
117    ok($tag =~ /^sysORID/);
118# create list of varbinds for GETS, val field can be null or omitted
119    my $vars =
120	new SNMP::VarList (
121			   ['sysDescr', '0', ''],
122			   ['sysObjectID', '0'],
123			   ['sysUpTime', '0'],
124			   ['sysContact', '0'],
125			   ['sysName', '0'],
126			   ['sysLocation', '0'],
127			   ['sysServices', '0'],
128			   ['ifNumber', '0'],
129			   ['ifDescr', '1'],
130			   ['ifSpeed', '1'],
131			   ['snmpInPkts', '0'],
132			   ['snmpInBadVersions', '0'],
133			   ['snmpInBadCommunityNames', '0'],
134			   ['snmpInBadCommunityUses', '0'],
135			   ['snmpInASNParseErrs', '0'],
136			   ['snmpEnableAuthenTraps', '0'],
137			   ['sysORID', '1'],
138			   ['sysORDescr', '1'],
139			   ['sysORUpTime', '1'],
140			   ['sysORLastChange', '0'],
141			   ['ipInHdrErrors', '0'],
142			   ['ipDefaultTTL', '0'],
143			   ['ipInHdrErrors', '0'],
144			   );
145    my $res = $sess->get($vars, [\&cb7, $sess]);
146    ok(defined $res);
147} # end of cb6
148
149sub cb7{
150    my $sess = shift;
151    my $vlist = shift;
152
153
154    my $tag = $vlist->[0]->tag;
155    my $val = $vlist->[0]->val;
156
157    ok(@{$vlist} == 23);
158
159    SNMP::finish();
160} # end of cb7
161
162sub cbDummy {
163    warn("error: this should not get called");
164}
165
166