1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
|
require 'snmp'
require 'test/unit'
require 'yaml'
include SNMP
##
# Accept get and get-next requests, returning the data from the
# provided YAML data file. The file contains a list of OID, value, and
# value type.
#
class YamlDataTransport
def self.load_data(yaml_file)
values = YAML.load(File.new(yaml_file))
@@get_map = {}
@@get_next_map = {}
values.each_index do |i|
name, value, klass = values[i]
if i < values.length - 1
next_name, next_value, next_klass = values[i + 1]
else
next_value = SNMP::EndOfMibView
next_klass = SNMP::EndOfMibView
end
@@get_map[name] = [name, value, klass]
@@get_next_map[name] = [next_name, next_value, next_klass]
end
end
def initialize
@responses = []
end
def close
end
def send(data, host, port)
msg = Message.decode(data)
req_class = msg.pdu.class
if req_class == SNMP::GetRequest
oid_map = @@get_map
elsif req_class == SNMP::GetNextRequest
oid_map = @@get_next_map
else
raise "request not supported: " + req_class
end
resp = msg.response
resp.pdu.vb_list.each do |vb|
name, value, klass = oid_map[vb.name.to_s]
vb.name = ObjectId.new(name)
if klass == "SNMP::NoSuchObject" or klass == "SNMP::NoSuchInstance"
vb.value = eval(klass)
elsif value
vb.value = eval("#{klass}.new(value)")
else
vb.value = SNMP::NoSuchInstance
end
end
@responses << resp.encode
end
def recv(max_bytes)
@responses.shift
end
end
class TestTransport < Test::Unit::TestCase
def test_get
YamlDataTransport.load_data(File.dirname(__FILE__) + "/if_table6.yaml")
SNMP::Manager.open(:Transport => YamlDataTransport) do |snmp|
value = snmp.get_value("ifDescr.1")
assert_equal("lo0", value)
end
end
def test_get_next
YamlDataTransport.load_data(File.dirname(__FILE__) + "/if_table6.yaml")
SNMP::Manager.open(:Transport => YamlDataTransport) do |snmp|
vb = snmp.get_next("ifDescr.1")
assert_equal("gif0", vb.vb_list.first.value)
end
end
end
class TestWalk < Test::Unit::TestCase
##
# A single string or single ObjectId can be passed to walk()
#
def test_single_object
list = []
ifTable6_manager.walk("ifDescr") do |vb|
assert(vb.kind_of?(VarBind), "Expected a VarBind")
list << vb
end
assert_equal(6, list.length)
list = []
ifTable6_manager.walk(ObjectId.new("1.3.6.1.2.1.2.2.1.2")) do |vb|
assert(vb.kind_of?(VarBind), "Expected a VarBind")
list << vb
end
assert_equal(6, list.length)
end
##
# If a list of one element is passed to walk() then a list of
# one element is passed as the block parameter.
#
def test_single_object_list
executed_block = false
ifTable6_manager.walk(["1.3.6.1.2.1.2.2.1.2"]) do |vb_list|
executed_block = true
assert_equal(1, vb_list.length)
assert_equal("1.3.6.1.2.1.2.2.1.2.1", vb_list.first.name.to_s)
break
end
assert(executed_block, "Did not execute block")
end
##
# If a list of multiple items are passed to walk() then
# multiple items are passed to the block.
#
def test_object_list
list1 = []
list2 = []
ifTable6_manager.walk(["ifIndex", "ifDescr"]) do |vb1, vb2|
list1 << vb1
list2 << vb2
end
assert_equal(6, list1.length)
assert_equal(6, list2.length)
list1 = []
list2 = []
ifTable6_manager.walk(["ifIndex", "ifDescr"], 1) do |vb1, vb2|
list1 << vb1
list2 << vb2
end
assert_equal(6, list1.length)
assert_equal(6, list2.length)
end
def test_empty
ifTable6_manager.walk("1.3.6.1.2.1.2.2.1.2.1") do |vb|
fail("Expected block to not be executed")
end
end
def test_one
list = []
ifTable1_manager.walk(["1.3.6.1.2.1.2.2.1.1", "1.3.6.1.2.1.2.2.1.2"]) do |vb|
assert_equal("1.3.6.1.2.1.2.2.1.1.1", vb[0].name.to_s)
assert_equal("1.3.6.1.2.1.2.2.1.2.1", vb[1].name.to_s)
list << vb
end
assert_equal(1, list.length)
end
def test_hole_in_one
list = []
ifTable1_manager.walk(["ifIndex", "ifDescr", "ifType"]) do |vb|
assert_equal("1.3.6.1.2.1.2.2.1.1.1", vb[0].name.to_s)
assert_equal(1, vb[0].value)
assert_equal("1.3.6.1.2.1.2.2.1.2.1", vb[1].name.to_s)
assert_equal("lo0", vb[1].value)
assert_equal("1.3.6.1.2.1.2.2.1.3.1", vb[2].name.to_s)
assert_equal(NoSuchInstance, vb[2].value)
list << vb
break
end
assert_equal(1, list.length)
end
private
def ifTable1_manager
YamlDataTransport.load_data(File.dirname(__FILE__) + "/if_table1.yaml")
Manager.new(:Transport => YamlDataTransport)
end
def ifTable6_manager
YamlDataTransport.load_data(File.dirname(__FILE__) + "/if_table6.yaml")
Manager.new(:Transport => YamlDataTransport)
end
end
|