telegraf/plugins/processors/ifname/ifname_test.go

143 lines
3.0 KiB
Go

package ifname
import (
"sync"
"sync/atomic"
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/influxdata/telegraf/config"
"github.com/influxdata/telegraf/internal/snmp"
si "github.com/influxdata/telegraf/plugins/inputs/snmp"
"github.com/influxdata/telegraf/testutil"
)
func TestTable(t *testing.T) {
t.Skip("Skipping test due to connect failures")
d := IfName{}
err := d.Init()
require.NoError(t, err)
tab, err := d.makeTable("1.3.6.1.2.1.2.2.1.2")
require.NoError(t, err)
clientConfig := snmp.ClientConfig{
Version: 2,
Timeout: config.Duration(5 * time.Second), // Doesn't work with 0 timeout
}
gs, err := snmp.NewWrapper(clientConfig)
require.NoError(t, err)
err = gs.SetAgent("127.0.0.1")
require.NoError(t, err)
err = gs.Connect()
require.NoError(t, err)
// Could use ifIndex but oid index is always the same
m, err := d.buildMap(gs, tab)
require.NoError(t, err)
require.NotEmpty(t, m)
}
func TestIfNameIntegration(t *testing.T) {
t.Skip("Skipping test due to connect failures")
d := IfName{
SourceTag: "ifIndex",
DestTag: "ifName",
AgentTag: "agent",
CacheSize: 1000,
ClientConfig: snmp.ClientConfig{
Version: 2,
Timeout: config.Duration(5 * time.Second), // Doesn't work with 0 timeout
},
}
err := d.Init()
require.NoError(t, err)
acc := testutil.Accumulator{}
err = d.Start(&acc)
require.NoError(t, err)
m := testutil.MustMetric(
"cpu",
map[string]string{
"ifIndex": "1",
"agent": "127.0.0.1",
},
map[string]interface{}{},
time.Unix(0, 0),
)
expected := testutil.MustMetric(
"cpu",
map[string]string{
"ifIndex": "1",
"agent": "127.0.0.1",
"ifName": "lo",
},
map[string]interface{}{},
time.Unix(0, 0),
)
err = d.addTag(m)
require.NoError(t, err)
testutil.RequireMetricEqual(t, expected, m)
}
func TestGetMap(t *testing.T) {
d := IfName{
CacheSize: 1000,
CacheTTL: config.Duration(10 * time.Second),
}
// Don't run net-snmp commands to look up table names.
d.makeTable = func(agent string) (*si.Table, error) {
return &si.Table{}, nil
}
err := d.Init()
require.NoError(t, err)
expected := nameMap{
1: "ifname1",
2: "ifname2",
}
var remoteCalls int32
// Mock the snmp transaction
d.getMapRemote = func(agent string) (nameMap, error) {
atomic.AddInt32(&remoteCalls, 1)
return expected, nil
}
m, age, err := d.getMap("agent")
require.NoError(t, err)
require.Zero(t, age) // Age is zero when map comes from getMapRemote
require.Equal(t, expected, m)
// Remote call should happen the first time getMap runs
require.Equal(t, int32(1), remoteCalls)
var wg sync.WaitGroup
const thMax = 3
for th := 0; th < thMax; th++ {
wg.Add(1)
go func() {
defer wg.Done()
m, age, err := d.getMap("agent")
require.NoError(t, err)
require.NotZero(t, age) // Age is nonzero when map comes from cache
require.Equal(t, expected, m)
}()
}
wg.Wait()
// Remote call should not happen subsequent times getMap runs
require.Equal(t, int32(1), remoteCalls)
}