test/test_ber.rb in snmp-1.0.3 vs test/test_ber.rb in snmp-1.0.4
- old
+ new
@@ -2,239 +2,238 @@
require 'snmp/varbind'
require 'snmp/ber'
class ASN1_Test < Test::Unit::TestCase
- include SNMP::BER
+ include SNMP::BER
- def test_decode_tlv_empty
- tag, value, data = decode_tlv("\001\000")
- assert_equal(1, tag)
- assert_equal("", value)
- assert_equal("", data)
+ def test_decode_tlv_empty
+ tag, value, data = decode_tlv("\001\000")
+ assert_equal(1, tag)
+ assert_equal("", value)
+ assert_equal("", data)
- tag, value, data = decode_tlv("\001\000\111")
- assert_equal(1, tag)
- assert_equal("", value)
- assert_equal("\111", data)
- end
-
- # Decode TLV data with the short-format length field.
- def test_decode_tlv_short
- tag, value, data = decode_tlv("\001\002\023\044")
- assert_equal(1, tag)
- assert_equal("\023\044", value)
- assert_equal("", data)
- end
-
- # Extra bytes of data are returned.
- def test_decode_tlv_short_extra
- tag, value, data = decode_tlv("\001\002\023\044\000")
- assert_equal(1, tag)
- assert_equal("\023\044", value)
- assert_equal("\000", data)
- end
+ tag, value, data = decode_tlv("\001\000\111")
+ assert_equal(1, tag)
+ assert_equal("", value)
+ assert_equal("\111", data)
+ end
- # Decode TLV data with long-format length field
- def test_decode_tlv_long
- long_data = ""; 128.times { |i| long_data << i.chr }
- tag, value, data = decode_tlv("\001\201\200" + long_data)
- assert_equal(1, tag)
- assert_equal(long_data, value)
- assert_equal("", data)
- end
-
- # Long format with extra bytes - use four bytes for length
- def test_decode_tlv_long_extra
- long_data = ""; 129.times { |i| long_data << i.chr }
- tag, value, data = decode_tlv("\001\204\000\000\000\201" + long_data + "\123\123\123")
- assert_equal(1, tag)
- assert_equal(long_data, value)
- assert_equal("\123\123\123", data)
- end
+ # Decode TLV data with the short-format length field.
+ def test_decode_tlv_short
+ tag, value, data = decode_tlv("\001\002\023\044")
+ assert_equal(1, tag)
+ assert_equal("\023\044", value)
+ assert_equal("", data)
+ end
- # Check invalid length - ASN.1 says that first length octet can't be 255.
- def test_bad_length
- assert_raise(InvalidLength) {
- decode_tlv("\001\377\001")
- }
- end
-
- # Check if input data is too short
- def test_out_of_data
- assert_raise(OutOfData) {
- decode_tlv("\001\001")
- }
- assert_raise(OutOfData) {
- decode_tlv("\001")
- }
- assert_raise(OutOfData) {
- decode_tlv("")
- }
- end
-
- # Decode single-octet ASN.1 integer.
- # Number is negative (2's complement) if high order bit is 1.
- def test_decode_integer_octet
- i, data = decode_integer("\002\001\042")
- assert_equal(34, i)
- assert_equal("", data)
- i, data = decode_integer("\002\001\377")
- assert_equal(-1, i)
- assert_equal("", data)
- end
+ # Extra bytes of data are returned.
+ def test_decode_tlv_short_extra
+ tag, value, data = decode_tlv("\001\002\023\044\000")
+ assert_equal(1, tag)
+ assert_equal("\023\044", value)
+ assert_equal("\000", data)
+ end
- # Decode multi-octet ASN.1 integer.
- def test_decode_integer
- i, data = decode_integer("\002\004\001\002\003\004")
- assert_equal(16909060, i)
- assert_equal("", data)
+ # Decode TLV data with long-format length field
+ def test_decode_tlv_long
+ long_data = ""; 128.times { |i| long_data << i.chr }
+ tag, value, data = decode_tlv("\001\201\200" + long_data)
+ assert_equal(1, tag)
+ assert_equal(long_data, value)
+ assert_equal("", data)
+ end
- i, data = decode_integer("\002\004\377\377\377\376")
- assert_equal(-2, i)
- assert_equal("", data)
+ # Long format with extra bytes - use four bytes for length
+ def test_decode_tlv_long_extra
+ long_data = ""; 129.times { |i| long_data << i.chr }
+ tag, value, data = decode_tlv("\001\204\000\000\000\201" + long_data + "\123\123\123")
+ assert_equal(1, tag)
+ assert_equal(long_data, value)
+ assert_equal("\123\123\123", data)
+ end
- i, data = decode_integer("\002\003\000\377\376")
- assert_equal(65534, i)
- assert_equal("", data)
-
- i, data = decode_integer("\002\002\000\377")
- assert_equal(255, i)
- assert_equal("", data)
+ # Check invalid length - ASN.1 says that first length octet can't be 255.
+ def test_bad_length
+ assert_raise(InvalidLength) {
+ decode_tlv("\001\377\001")
+ }
+ end
- assert_raise(InvalidTag) {
- decode_integer("\001\004\001\002\003\004")
- }
- end
+ # Check if input data is too short
+ def test_out_of_data
+ assert_raise(OutOfData) {
+ decode_tlv("\001\001")
+ }
+ assert_raise(OutOfData) {
+ decode_tlv("\001")
+ }
+ assert_raise(OutOfData) {
+ decode_tlv("")
+ }
+ end
- def test_decode_timeticks
- i, data = decode_timeticks("\103\004\001\002\003\004")
- assert_equal(16909060, i)
- assert_equal("", data)
-
- assert_raise(InvalidTag) {
- decode_timeticks("\002\004\001\002\003\004")
- }
- end
-
- # Decode ASN.1 octet string
- def test_decode_octet_string
- s, data = decode_octet_string("\004\202\000\005hello")
- assert_equal("hello",s)
- assert_raise(InvalidTag) {
- decode_octet_string("\005\202\000\005hello")
- }
- end
-
- def test_decode_ip_address
- ip, data = decode_ip_address("@\004\001\002\003\004")
- assert_equal(ip, "\001\002\003\004")
- assert_raise(InvalidTag) {
- decode_ip_address("\004\004\001\002\003\004")
- }
- assert_raise(InvalidLength) {
- decode_ip_address("@\005\001\002\003\004\005")
- }
- end
-
- # Decode ASN.1 sequence
- def test_decode_sequence
- seq, data = decode_sequence("\060\003\002\001\077")
- assert_equal("\002\001\077", seq)
- assert_equal("", data)
-
- seq, data = decode_sequence("\060\003\002\001\077\002\001\001")
- assert_equal("\002\001\077", seq)
- assert_equal("\002\001\001", data)
-
- assert_raise(InvalidTag) {
- decode_sequence("\061\003\002\001\077")
- }
- end
-
- def test_decode_object_id
- # Handle an empty object identifier because net-snmp does it and
- # they probably had a good reason.
- object_id, remainder = decode_object_id("\006\000")
- assert_equal([], object_id)
- assert_equal("", remainder)
-
- object_id, remainder = decode_object_id("\006\001+")
- assert_equal([1,3], object_id);
- assert_equal("", remainder)
+ # Decode single-octet ASN.1 integer.
+ # Number is negative (2's complement) if high order bit is 1.
+ def test_decode_integer_octet
+ i, data = decode_integer("\002\001\042")
+ assert_equal(34, i)
+ assert_equal("", data)
+ i, data = decode_integer("\002\001\377")
+ assert_equal(-1, i)
+ assert_equal("", data)
+ end
- object_id, remainder = decode_object_id("\006\002+\006")
- assert_equal([1,3,6], object_id);
- assert_equal("", remainder)
+ # Decode multi-octet ASN.1 integer.
+ def test_decode_integer
+ i, data = decode_integer("\002\004\001\002\003\004")
+ assert_equal(16909060, i)
+ assert_equal("", data)
- object_id, remainder = decode_object_id("\006\003+\202\001")
- assert_equal([1,3,257], object_id);
- assert_equal("", remainder)
+ i, data = decode_integer("\002\004\377\377\377\376")
+ assert_equal(-2, i)
+ assert_equal("", data)
- object_id, remainder = decode_object_id("\006\003S\202\001")
- assert_equal([2,3,257], object_id);
- assert_equal("", remainder)
+ i, data = decode_integer("\002\003\000\377\376")
+ assert_equal(65534, i)
+ assert_equal("", data)
- object_id, remainder = decode_object_id("\006\001\000")
- assert_equal([0,0], object_id);
- assert_equal("", remainder)
+ i, data = decode_integer("\002\002\000\377")
+ assert_equal(255, i)
+ assert_equal("", data)
- assert_raise(InvalidTag) do
- decode_object_id("\007\001+")
- end
+ assert_raise(InvalidTag) {
+ decode_integer("\001\004\001\002\003\004")
+ }
+ end
+
+ def test_decode_timeticks
+ i, data = decode_timeticks("\103\004\001\002\003\004")
+ assert_equal(16909060, i)
+ assert_equal("", data)
+
+ assert_raise(InvalidTag) {
+ decode_timeticks("\002\004\001\002\003\004")
+ }
+ end
+
+ # Decode ASN.1 octet string
+ def test_decode_octet_string
+ s, data = decode_octet_string("\004\202\000\005hello")
+ assert_equal("hello",s)
+ assert_raise(InvalidTag) {
+ decode_octet_string("\005\202\000\005hello")
+ }
+ end
+
+ def test_decode_ip_address
+ ip, data = decode_ip_address("@\004\001\002\003\004")
+ assert_equal(ip, "\001\002\003\004")
+ assert_raise(InvalidTag) {
+ decode_ip_address("\004\004\001\002\003\004")
+ }
+ assert_raise(InvalidLength) {
+ decode_ip_address("@\005\001\002\003\004\005")
+ }
+ end
+
+ # Decode ASN.1 sequence
+ def test_decode_sequence
+ seq, data = decode_sequence("\060\003\002\001\077")
+ assert_equal("\002\001\077", seq)
+ assert_equal("", data)
+
+ seq, data = decode_sequence("\060\003\002\001\077\002\001\001")
+ assert_equal("\002\001\077", seq)
+ assert_equal("\002\001\001", data)
+
+ assert_raise(InvalidTag) {
+ decode_sequence("\061\003\002\001\077")
+ }
+ end
+
+ def test_decode_object_id
+ # Handle an empty object identifier because net-snmp does it and
+ # they probably had a good reason.
+ object_id, remainder = decode_object_id("\006\000")
+ assert_equal([], object_id)
+ assert_equal("", remainder)
+
+ object_id, remainder = decode_object_id("\006\001+")
+ assert_equal([1,3], object_id);
+ assert_equal("", remainder)
+
+ object_id, remainder = decode_object_id("\006\002+\006")
+ assert_equal([1,3,6], object_id);
+ assert_equal("", remainder)
+
+ object_id, remainder = decode_object_id("\006\003+\202\001")
+ assert_equal([1,3,257], object_id);
+ assert_equal("", remainder)
+
+ object_id, remainder = decode_object_id("\006\003S\202\001")
+ assert_equal([2,3,257], object_id);
+ assert_equal("", remainder)
+
+ object_id, remainder = decode_object_id("\006\001\000")
+ assert_equal([0,0], object_id);
+ assert_equal("", remainder)
+
+ assert_raise(InvalidTag) do
+ decode_object_id("\007\001+")
end
-
- def test_encode_length
- assert_equal("\000", encode_length(0))
- assert_equal("\001", encode_length(1))
- assert_equal("\177", encode_length(127))
- assert_equal("\201\200", encode_length(128))
- assert_equal("\202\002\001", encode_length(513))
- assert_raise(InvalidLength) { encode_length(-1) }
- end
-
- def test_encode_integer
- assert_equal("\002\001\000", encode_integer(0))
- assert_equal("\002\001\001", encode_integer(1))
- assert_equal("\002\001\177", encode_integer(127))
- assert_equal("\002\002\000\200", encode_integer(128))
- assert_equal("\002\002\000\377", encode_integer(255))
- assert_equal("\002\002\001\000", encode_integer(256))
-
- assert_equal("\002\001\377", encode_integer(-1))
- assert_equal("\002\001\200", encode_integer(-128))
- assert_equal("\002\002\377\177", encode_integer(-129))
- end
-
- def test_encode_octet_string
- assert_equal("\004\015Dave was here", encode_octet_string("Dave was here"))
- assert_equal("\004\000", encode_octet_string(""))
- end
-
- def test_encode_sequence
- assert_equal("0\015Dave was here", encode_sequence("Dave was here"))
- assert_equal("0\000", encode_sequence(""))
- end
-
- def test_encode_null
- assert_equal("\005\000", encode_null)
- end
-
- def test_encode_exception
- assert_equal("\200\000", encode_exception(0x80))
- end
-
- def test_encode_object_id
- assert_equal("\006\001" << 80.chr, encode_object_id([2]))
- assert_equal("\006\001\000", encode_object_id([0,0]))
- assert_equal("\006\001+", encode_object_id([1,3]))
- assert_equal("\006\002+\006", encode_object_id([1,3,6]))
- assert_equal("\006\003+\202\001", encode_object_id([1,3,257]))
- assert_equal("\006\003" << 82.chr << "\202\001", encode_object_id([2,2,257]))
- assert_raise(InvalidObjectId) { encode_object_id([3,2,257]) }
- assert_raise(InvalidObjectId) { encode_object_id([]) }
-
- assert_equal("\006\a+\203\377\177\203\377\177",
- encode_object_id(SNMP::ObjectId.new("1.3.65535.65535")))
- end
-end
+ end
+ def test_encode_length
+ assert_equal("\000", encode_length(0))
+ assert_equal("\001", encode_length(1))
+ assert_equal("\177", encode_length(127))
+ assert_equal("\201\200", encode_length(128))
+ assert_equal("\202\002\001", encode_length(513))
+ assert_raise(InvalidLength) { encode_length(-1) }
+ end
+
+ def test_encode_integer
+ assert_equal("\002\001\000", encode_integer(0))
+ assert_equal("\002\001\001", encode_integer(1))
+ assert_equal("\002\001\177", encode_integer(127))
+ assert_equal("\002\002\000\200", encode_integer(128))
+ assert_equal("\002\002\000\377", encode_integer(255))
+ assert_equal("\002\002\001\000", encode_integer(256))
+
+ assert_equal("\002\001\377", encode_integer(-1))
+ assert_equal("\002\001\200", encode_integer(-128))
+ assert_equal("\002\002\377\177", encode_integer(-129))
+ end
+
+ def test_encode_octet_string
+ assert_equal("\004\015Dave was here", encode_octet_string("Dave was here"))
+ assert_equal("\004\000", encode_octet_string(""))
+ end
+
+ def test_encode_sequence
+ assert_equal("0\015Dave was here", encode_sequence("Dave was here"))
+ assert_equal("0\000", encode_sequence(""))
+ end
+
+ def test_encode_null
+ assert_equal("\005\000", encode_null)
+ end
+
+ def test_encode_exception
+ assert_equal("\200\000", encode_exception(0x80))
+ end
+
+ def test_encode_object_id
+ assert_equal("\006\001" << 80.chr, encode_object_id([2]))
+ assert_equal("\006\001\000", encode_object_id([0,0]))
+ assert_equal("\006\001+", encode_object_id([1,3]))
+ assert_equal("\006\002+\006", encode_object_id([1,3,6]))
+ assert_equal("\006\003+\202\001", encode_object_id([1,3,257]))
+ assert_equal("\006\003" << 82.chr << "\202\001", encode_object_id([2,2,257]))
+ assert_raise(InvalidObjectId) { encode_object_id([3,2,257]) }
+ assert_raise(InvalidObjectId) { encode_object_id([]) }
+
+ assert_equal("\006\a+\203\377\177\203\377\177",
+ encode_object_id(SNMP::ObjectId.new("1.3.65535.65535")))
+ end
+end