func TestCounter64(t *testing.T) { expInt := uint64(18446744073709551615) expStr := "18446744073709551615" expBuf := []byte{0x46, 0x09, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} var v snmpgo.Variable = snmpgo.NewCounter64(expInt) big, err := v.BigInt() if err != nil { t.Errorf("Failed to call BigInt(): %v", err) } if expInt != big.Uint64() { t.Errorf("BigInt() - expected [%d], actual [%d]", expInt, big.Int64()) } if expStr != v.String() { t.Errorf("String() - expected [%s], actual [%s]", expStr, v.String()) } buf, err := v.Marshal() if err != nil { t.Errorf("Marshal(): %v", err) } if !bytes.Equal(expBuf, buf) { t.Errorf("Marshal() - expected [%s], actual [%s]", snmpgo.ToHexStr(expBuf, " "), snmpgo.ToHexStr(buf, " ")) } var w snmpgo.Counter64 rest, err := (&w).Unmarshal(buf) if len(rest) != 0 || err != nil { t.Errorf("Unmarshal() - len[%d] err[%v]", len(rest), err) } if expStr != w.String() { t.Errorf("Unmarshal() - expected [%s], actual [%s]", expStr, w.String()) } buf = append(buf, 0x00) rest, err = (&w).Unmarshal(buf) if len(rest) != 1 || err != nil { t.Errorf("Unmarshal() with rest - len[%d] err[%v]", len(rest), err) } if expStr != w.String() { t.Errorf("Unmarshal() with rest - expected [%s], actual [%s]", expStr, w.String()) } }
func TestVarBind(t *testing.T) { var v snmpgo.VarBind oid, _ := snmpgo.NewOid("1.3.6.1.2.1.1.1.0") v = snmpgo.VarBind{Oid: oid} v.Variable = snmpgo.NewInteger(-2147483648) testVarBind(t, &v, `{"Oid": "1.3.6.1.2.1.1.1.0", "Variable": {"Type": "Integer", "Value": "-2147483648"}}`) v.Variable = snmpgo.NewOctetString([]byte("MyHost")) testVarBind(t, &v, `{"Oid": "1.3.6.1.2.1.1.1.0", "Variable": {"Type": "OctetString", "Value": "MyHost"}}`) v.Variable = snmpgo.NewNull() testVarBind(t, &v, `{"Oid": "1.3.6.1.2.1.1.1.0", "Variable": {"Type": "Null", "Value": ""}}`) v.Variable = snmpgo.NewCounter32(uint32(4294967295)) testVarBind(t, &v, `{"Oid": "1.3.6.1.2.1.1.1.0", "Variable": {"Type": "Counter32", "Value": "4294967295"}}`) v.Variable = snmpgo.NewCounter64(uint64(18446744073709551615)) testVarBind(t, &v, `{"Oid": "1.3.6.1.2.1.1.1.0", `+ `"Variable": {"Type": "Counter64", "Value": "18446744073709551615"}}`) expBuf := []byte{0x30, 0x00} v = snmpgo.VarBind{} buf, err := v.Marshal() if err != nil { t.Errorf("Marshal() : %v", err) } if !bytes.Equal(expBuf, buf) { t.Errorf("Marshal() - expected [%s], actual [%s]", snmpgo.ToHexStr(expBuf, " "), snmpgo.ToHexStr(buf, " ")) } buf = []byte{0x00, 0x00} _, err = (&v).Unmarshal(buf) if err == nil { t.Errorf("Unmarshal() : can not validation") } }
func buildVariable(kind string, value string) (val snmpgo.Variable, err error) { switch kind { case "i": var num int64 if num, err = strconv.ParseInt(value, 10, 32); err == nil { val = snmpgo.NewInteger(int32(num)) } case "u": var num uint64 if num, err = strconv.ParseUint(value, 10, 32); err == nil { val = snmpgo.NewGauge32(uint32(num)) } case "c": var num uint64 if num, err = strconv.ParseUint(value, 10, 32); err == nil { val = snmpgo.NewCounter32(uint32(num)) } case "C": var num uint64 if num, err = strconv.ParseUint(value, 10, 64); err == nil { val = snmpgo.NewCounter64(num) } case "t": var num uint64 if num, err = strconv.ParseUint(value, 10, 32); err == nil { val = snmpgo.NewTimeTicks(uint32(num)) } case "a": if ip := net.ParseIP(value); ip != nil && len(ip) == 4 { val = snmpgo.NewIpaddress(ip[0], ip[1], ip[2], ip[3]) } else { return nil, fmt.Errorf("%s: no valid IP Address", value) } case "o": val, err = snmpgo.ParseOidFromString(value) case "n": val = snmpgo.NewNull() case "s": val = snmpgo.NewOctetString([]byte(value)) case "x": var b []byte hx := hexPrefix.ReplaceAllString(value, "") if b, err = hex.DecodeString(hx); err == nil { val = snmpgo.NewOctetString(b) } else { return nil, fmt.Errorf("%s: no valid Hex String", value) } case "d": s := strings.Split(value, ".") b := make([]byte, len(s)) for i, piece := range s { var num int if num, err = strconv.Atoi(piece); err != nil || num > 0xff { return nil, fmt.Errorf("%s: no valid Decimal String", value) } b[i] = byte(num) } val = snmpgo.NewOctetString(b) default: return nil, fmt.Errorf("%s: unknown TYPE", kind) } return }