252 lines
5.6 KiB
Go
252 lines
5.6 KiB
Go
package snmp
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/gosnmp/gosnmp"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestConvertDefault(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
ent gosnmp.SnmpPDU
|
|
expected interface{}
|
|
errmsg string
|
|
}{
|
|
{
|
|
name: "integer",
|
|
ent: gosnmp.SnmpPDU{
|
|
Type: gosnmp.Integer,
|
|
Value: int(2),
|
|
},
|
|
expected: 2,
|
|
},
|
|
{
|
|
name: "octet string with valid bytes",
|
|
ent: gosnmp.SnmpPDU{
|
|
Type: gosnmp.OctetString,
|
|
Value: []byte{0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64},
|
|
},
|
|
expected: "Hello world",
|
|
},
|
|
{
|
|
name: "octet string with invalid bytes",
|
|
ent: gosnmp.SnmpPDU{
|
|
Type: gosnmp.OctetString,
|
|
Value: []byte{0x84, 0xc8, 0x7, 0xff, 0xfd, 0x38, 0x54, 0xc1},
|
|
},
|
|
expected: "84c807fffd3854c1",
|
|
},
|
|
}
|
|
|
|
f := Field{}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
actual, err := f.Convert(tt.ent)
|
|
|
|
if tt.errmsg != "" {
|
|
require.ErrorContains(t, err, tt.errmsg)
|
|
} else {
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
require.Equal(t, tt.expected, actual)
|
|
})
|
|
}
|
|
|
|
t.Run("invalid", func(t *testing.T) {
|
|
f.Conversion = "invalid"
|
|
actual, err := f.Convert(gosnmp.SnmpPDU{})
|
|
|
|
require.Nil(t, actual)
|
|
require.ErrorContains(t, err, "invalid conversion type")
|
|
})
|
|
}
|
|
|
|
func TestConvertHex(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
ent gosnmp.SnmpPDU
|
|
expected interface{}
|
|
errmsg string
|
|
}{
|
|
{
|
|
name: "octet string with valid bytes",
|
|
ent: gosnmp.SnmpPDU{
|
|
Type: gosnmp.OctetString,
|
|
Value: []byte{0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64},
|
|
},
|
|
expected: "48656c6c6f20776f726c64",
|
|
},
|
|
{
|
|
name: "octet string with invalid bytes",
|
|
ent: gosnmp.SnmpPDU{
|
|
Type: gosnmp.OctetString,
|
|
Value: []byte{0x84, 0xc8, 0x7, 0xff, 0xfd, 0x38, 0x54, 0xc1},
|
|
},
|
|
expected: "84c807fffd3854c1",
|
|
},
|
|
{
|
|
name: "IPv4",
|
|
ent: gosnmp.SnmpPDU{
|
|
Type: gosnmp.IPAddress,
|
|
Value: "192.0.2.1",
|
|
},
|
|
expected: "c0000201",
|
|
},
|
|
{
|
|
name: "IPv6",
|
|
ent: gosnmp.SnmpPDU{
|
|
Type: gosnmp.IPAddress,
|
|
Value: "2001:db8::1",
|
|
},
|
|
expected: "20010db8000000000000000000000001",
|
|
},
|
|
{
|
|
name: "oid",
|
|
ent: gosnmp.SnmpPDU{
|
|
Type: gosnmp.ObjectIdentifier,
|
|
Value: ".1.2.3",
|
|
},
|
|
errmsg: "unsupported Asn1BER (0x6) for hex conversion",
|
|
},
|
|
{
|
|
name: "integer",
|
|
ent: gosnmp.SnmpPDU{
|
|
Type: gosnmp.Integer,
|
|
Value: int(2),
|
|
},
|
|
errmsg: "unsupported type (int) for hex conversion",
|
|
},
|
|
}
|
|
|
|
f := Field{Conversion: "hex"}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
actual, err := f.Convert(tt.ent)
|
|
|
|
if tt.errmsg != "" {
|
|
require.ErrorContains(t, err, tt.errmsg)
|
|
} else {
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
require.Equal(t, tt.expected, actual)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestConvertHextoint(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
conversion string
|
|
ent gosnmp.SnmpPDU
|
|
expected interface{}
|
|
errmsg string
|
|
}{
|
|
{
|
|
name: "empty",
|
|
conversion: "hextoint:BigEndian:uint64",
|
|
ent: gosnmp.SnmpPDU{},
|
|
expected: nil,
|
|
},
|
|
{
|
|
name: "big endian uint64",
|
|
conversion: "hextoint:BigEndian:uint64",
|
|
ent: gosnmp.SnmpPDU{
|
|
Type: gosnmp.OctetString,
|
|
Value: []byte{0x84, 0xc8, 0x7, 0xff, 0xfd, 0x38, 0x54, 0xc1},
|
|
},
|
|
expected: uint64(0x84c807fffd3854c1),
|
|
},
|
|
{
|
|
name: "big endian uint32",
|
|
conversion: "hextoint:BigEndian:uint32",
|
|
ent: gosnmp.SnmpPDU{
|
|
Type: gosnmp.OctetString,
|
|
Value: []byte{0x84, 0xc8, 0x7, 0xff},
|
|
},
|
|
expected: uint32(0x84c807ff),
|
|
},
|
|
{
|
|
name: "big endian uint16",
|
|
conversion: "hextoint:BigEndian:uint16",
|
|
ent: gosnmp.SnmpPDU{
|
|
Type: gosnmp.OctetString,
|
|
Value: []byte{0x84, 0xc8},
|
|
},
|
|
expected: uint16(0x84c8),
|
|
},
|
|
{
|
|
name: "big endian invalid",
|
|
conversion: "hextoint:BigEndian:invalid",
|
|
ent: gosnmp.SnmpPDU{Type: gosnmp.OctetString, Value: make([]uint8, 0)},
|
|
errmsg: "invalid bit value",
|
|
},
|
|
{
|
|
name: "little endian uint64",
|
|
conversion: "hextoint:LittleEndian:uint64",
|
|
ent: gosnmp.SnmpPDU{
|
|
Type: gosnmp.OctetString,
|
|
Value: []byte{0x84, 0xc8, 0x7, 0xff, 0xfd, 0x38, 0x54, 0xc1},
|
|
},
|
|
expected: uint64(0xc15438fdff07c884),
|
|
},
|
|
{
|
|
name: "little endian uint32",
|
|
conversion: "hextoint:LittleEndian:uint32",
|
|
ent: gosnmp.SnmpPDU{
|
|
Type: gosnmp.OctetString,
|
|
Value: []byte{0x84, 0xc8, 0x7, 0xff},
|
|
},
|
|
expected: uint32(0xff07c884),
|
|
},
|
|
{
|
|
name: "little endian uint16",
|
|
conversion: "hextoint:LittleEndian:uint16",
|
|
ent: gosnmp.SnmpPDU{
|
|
Type: gosnmp.OctetString,
|
|
Value: []byte{0x84, 0xc8},
|
|
},
|
|
expected: uint16(0xc884),
|
|
},
|
|
{
|
|
name: "little endian single byte",
|
|
conversion: "hextoint:LittleEndian:uint16",
|
|
ent: gosnmp.SnmpPDU{
|
|
Type: gosnmp.OctetString,
|
|
Value: []byte{0x84},
|
|
},
|
|
expected: uint16(0x84),
|
|
},
|
|
{
|
|
name: "little endian invalid",
|
|
conversion: "hextoint:LittleEndian:invalid",
|
|
ent: gosnmp.SnmpPDU{Type: gosnmp.OctetString, Value: make([]byte, 0)},
|
|
errmsg: "invalid bit value",
|
|
},
|
|
{
|
|
name: "invalid",
|
|
conversion: "hextoint:invalid:uint64",
|
|
ent: gosnmp.SnmpPDU{Type: gosnmp.OctetString, Value: make([]byte, 0)},
|
|
errmsg: "invalid Endian value",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
f := Field{Conversion: tt.conversion}
|
|
|
|
actual, err := f.Convert(tt.ent)
|
|
|
|
if tt.errmsg != "" {
|
|
require.ErrorContains(t, err, tt.errmsg)
|
|
} else {
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
require.Equal(t, tt.expected, actual)
|
|
})
|
|
}
|
|
}
|