telegraf/plugins/inputs/sflow/decoder/ops_test.go

384 lines
9.8 KiB
Go

package decoder
import (
"bytes"
"encoding/binary"
"fmt"
"testing"
"time"
"github.com/stretchr/testify/require"
)
func Test_U64AsF(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
ddo := AsF("out")
in := uint64(5)
require.NoError(t, ddo.process(dc, &in))
m := dc.currentMetric()
require.Equal(t, in, getField(m, "out"))
}
func Test_U32AsF(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
ddo := AsF("out")
in := uint32(5)
require.NoError(t, ddo.process(dc, &in))
m := dc.currentMetric()
require.Equal(t, uint64(in), getField(m, "out"))
}
func Test_U16PtrAsF(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
ddo := AsF("out")
in := uint16(5)
require.NoError(t, ddo.process(dc, &in))
m := dc.currentMetric()
require.Equal(t, uint64(in), getField(m, "out"))
}
func Test_U16AsF(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
ddo := AsF("out")
in := uint16(5)
require.NoError(t, ddo.process(dc, in))
m := dc.currentMetric()
require.Equal(t, uint64(in), getField(m, "out"))
}
func Test_U8AsF(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
ddo := AsF("out")
in := uint8(5)
require.NoError(t, ddo.process(dc, in))
m := dc.currentMetric()
require.Equal(t, uint64(in), getField(m, "out"))
}
func Test_U8PtrAsF(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
ddo := AsF("out")
in := uint8(5)
require.NoError(t, ddo.process(dc, &in))
m := dc.currentMetric()
require.Equal(t, uint64(in), getField(m, "out"))
}
func Test_U32AsT(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
ddo := AsT("out")
in := uint32(5)
require.NoError(t, ddo.process(dc, in))
m := dc.currentMetric()
require.Equal(t, fmt.Sprintf("%d", in), getTag(m, "out"))
}
func Test_U32PtrAsT(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
ddo := AsT("out")
in := uint32(5)
require.NoError(t, ddo.process(dc, &in))
m := dc.currentMetric()
require.Equal(t, fmt.Sprintf("%d", in), getTag(m, "out"))
}
func Test_U16AsT(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
ddo := AsT("out")
in := uint16(5)
require.NoError(t, ddo.process(dc, in))
m := dc.currentMetric()
require.Equal(t, fmt.Sprintf("%d", in), getTag(m, "out"))
}
func Test_U16PtrAsT(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
ddo := AsT("out")
in := uint16(5)
require.NoError(t, ddo.process(dc, &in))
m := dc.currentMetric()
require.Equal(t, fmt.Sprintf("%d", in), getTag(m, "out"))
}
func Test_U8AsT(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
ddo := AsT("out")
in := uint8(5)
require.NoError(t, ddo.process(dc, in))
m := dc.currentMetric()
require.Equal(t, fmt.Sprintf("%d", in), getTag(m, "out"))
}
func Test_U8PtrAsT(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
ddo := AsT("out")
in := uint8(5)
require.NoError(t, ddo.process(dc, &in))
m := dc.currentMetric()
require.Equal(t, fmt.Sprintf("%d", in), getTag(m, "out"))
}
func Test_U32ToU32AsF(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
ddo := U32ToU32(func(i uint32) uint32 { return i * 2 })
ddo2 := ddo.AsF("out")
require.Equal(t, ddo, ddo2.prev())
in := uint32(5)
require.NoError(t, ddo.process(dc, &in))
m := dc.currentMetric()
require.Equal(t, uint64(in*2), getField(m, "out"))
}
func Test_U16ToU16AsF(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
ddo := U16ToU16(func(i uint16) uint16 { return i * 2 })
ddo2 := ddo.AsF("out")
require.Equal(t, ddo, ddo2.prev())
in := uint16(5)
require.NoError(t, ddo.process(dc, &in))
m := dc.currentMetric()
require.Equal(t, uint64(in*2), getField(m, "out"))
}
func Test_U32ToStrAsT(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
ddo := U32ToStr(func(i uint32) string { return fmt.Sprintf("%d", i*2) })
ddo2 := ddo.AsT("out")
require.Equal(t, ddo, ddo2.prev())
in := uint32(5)
require.NoError(t, ddo.process(dc, &in))
m := dc.currentMetric()
require.Equal(t, fmt.Sprintf("%d", (in*2)), getTag(m, "out"))
}
func Test_U16ToStrAsT(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
ddo := U16ToStr(func(i uint16) string { return fmt.Sprintf("%d", i*2) })
ddo2 := ddo.AsT("out")
require.Equal(t, ddo, ddo2.prev())
in := uint16(5)
require.NoError(t, ddo.process(dc, &in))
m := dc.currentMetric()
require.Equal(t, fmt.Sprintf("%d", (in*2)), getTag(m, "out"))
}
func Test_MapU32ToStrAsT(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
myMap := map[uint32]string{5: "five"}
ddo := MapU32ToStr(myMap)
ddo2 := ddo.AsT("out")
require.Equal(t, ddo, ddo2.prev())
in := uint32(5)
require.NoError(t, ddo.process(dc, &in))
m := dc.currentMetric()
require.Equal(t, "five", getTag(m, "out"))
}
func Test_MapU16ToStrAsT(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
myMap := map[uint16]string{5: "five"}
ddo := MapU16ToStr(myMap)
ddo2 := ddo.AsT("out")
require.Equal(t, ddo, ddo2.prev())
in := uint16(5)
require.NoError(t, ddo.process(dc, &in))
m := dc.currentMetric()
require.Equal(t, "five", getTag(m, "out"))
}
func Test_DecDir_ToU32(t *testing.T) {
u := U32().
Do(U32ToU32(func(in uint32) uint32 { return in >> 2 }).AsF("out1")).
Do(U32ToU32(func(in uint32) uint32 { return in * 2 }).AsF("out2"))
dd := Seq(OpenMetric(""), u, CloseMetric())
value := uint32(1001)
var buffer bytes.Buffer
require.NoError(t, binary.Write(&buffer, binary.BigEndian, &value))
dc := NewDecodeContext()
require.NoError(t, dc.Decode(dd, &buffer))
x, _ := u.(*valueDirective)
require.Equal(t, &value, x.value)
// require field ejected
require.Equal(t, 1, len(dc.GetMetrics()))
m := dc.GetMetrics()
require.Equal(t, uint64(value>>2), getField(m[0], "out1"))
require.Equal(t, uint64(value*2), getField(m[0], "out2"))
}
func Test_BytesToStrAsT(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
f := func(b []byte) string { return fmt.Sprintf("%d:%d", b[0], b[1]) }
ddo := BytesToStr(2, f)
ddo2 := ddo.AsT("out")
require.Equal(t, ddo, ddo2.prev())
in := []byte{0x01, 0x02}
require.NoError(t, ddo.process(dc, in))
m := dc.currentMetric()
require.Equal(t, fmt.Sprintf("%d:%d", in[0], in[1]), getTag(m, "out"))
}
func Test_BytesToAsT(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
f := func(b []byte) interface{} { return fmt.Sprintf("%d:%d", b[0], b[1]) }
ddo := BytesTo(2, f)
ddo2 := ddo.AsT("out")
require.Equal(t, ddo, ddo2.prev())
in := []byte{0x01, 0x02}
require.NoError(t, ddo.process(dc, in))
m := dc.currentMetric()
require.Equal(t, fmt.Sprintf("%d:%d", in[0], in[1]), getTag(m, "out"))
}
func Test_BytesToU32AsF(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
f := func(b []byte) uint32 { return uint32(b[0] * b[1]) }
ddo := BytesToU32(2, f)
ddo2 := ddo.AsF("out")
require.Equal(t, ddo, ddo2.prev())
in := []byte{0x01, 0x02}
require.NoError(t, ddo.process(dc, in))
m := dc.currentMetric()
require.Equal(t, uint64(in[0]*in[1]), getField(m, "out"))
}
func Test_U32require(t *testing.T) {
dc := NewDecodeContext()
ddo := U32Assert(func(in uint32) bool { return false }, "bad")
in := uint32(5)
require.Error(t, ddo.process(dc, &in))
}
func Test_U16require(t *testing.T) {
dc := NewDecodeContext()
ddo := U16Assert(func(in uint16) bool { return false }, "bad")
in := uint16(5)
require.Error(t, ddo.process(dc, &in))
}
func Test_Set(t *testing.T) {
dc := NewDecodeContext()
ptr := new(uint32)
ddo := Set(ptr)
in := uint32(5)
require.NoError(t, ddo.process(dc, &in))
require.Equal(t, *ptr, in)
}
func Test_U16Set(t *testing.T) {
dc := NewDecodeContext()
ptr := new(uint16)
ddo := Set(ptr)
in := uint16(5)
require.NoError(t, ddo.process(dc, in))
require.Equal(t, *ptr, in)
}
func Test_U16PtrSet(t *testing.T) {
dc := NewDecodeContext()
ptr := new(uint16)
ddo := Set(ptr)
in := uint16(5)
require.NoError(t, ddo.process(dc, &in))
require.Equal(t, *ptr, in)
}
func Test_U32toU32Set(t *testing.T) {
dc := NewDecodeContext()
ptr := new(uint32)
ddo := U32ToU32(func(in uint32) uint32 { return in * 2 }).Set(ptr).prev()
in := uint32(5)
require.NoError(t, ddo.process(dc, &in))
require.Equal(t, *ptr, in*2)
}
func Test_U32toU32toString(t *testing.T) {
dc := NewDecodeContext()
ptr := new(string)
ddo := U32ToU32(func(in uint32) uint32 { return in * 2 }).ToString(func(in uint32) string { return fmt.Sprintf("%d", in*2) }).Set(ptr).prev().prev()
in := uint32(2)
require.NoError(t, ddo.process(dc, &in))
require.Equal(t, "8", *ptr)
}
func Test_U32toU32toStringBreakIf(t *testing.T) {
dc := NewDecodeContext()
ptr := new(string)
ddo := U32ToU32(func(in uint32) uint32 { return in * 2 }).ToString(func(in uint32) string { return fmt.Sprintf("%d", in*2) }).BreakIf("8").Set(ptr).prev().prev().prev()
in := uint32(2)
require.NoError(t, ddo.process(dc, &in))
require.Equal(t, "", *ptr)
in = uint32(1)
require.NoError(t, ddo.process(dc, &in))
require.Equal(t, "4", *ptr)
}
func Test_notify(t *testing.T) {
value := uint32(1001)
var buffer bytes.Buffer
require.NoError(t, binary.Write(&buffer, binary.BigEndian, &value))
ptr := new(uint32)
*ptr = uint32(2002)
var notificationOne uint32
var notificationTwo uint32
dd := Seq(
Notify(func() { notificationOne = *ptr }),
U32().Do(Set(ptr)),
Notify(func() { notificationTwo = *ptr }),
)
require.NoError(t, Execute(dd, &buffer))
require.Equal(t, uint32(2002), notificationOne)
require.Equal(t, uint32(1001), notificationTwo)
}
func Test_nop(t *testing.T) {
value := uint32(1001)
var buffer bytes.Buffer
require.NoError(t, binary.Write(&buffer, binary.BigEndian, &value))
originalLen := buffer.Len()
dd := Seq(
Nop(),
)
require.NoError(t, Execute(dd, &buffer))
require.Equal(t, originalLen, buffer.Len())
}
func Test_AsTimestamp(t *testing.T) {
dc := NewDecodeContext()
dc.openMetric("")
ddo := AsTimestamp()
now := time.Now()
in := uint32(now.Unix()) // only handles as uin32 (not uint64)
require.NoError(t, ddo.process(dc, &in))
m := dc.currentMetric()
require.Equal(t, now.Unix(), m.Time().Unix())
}