telegraf/plugins/inputs/fritzbox/fritzbox_test.go

149 lines
4.8 KiB
Go

package fritzbox
import (
"os"
"path/filepath"
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/tdrn-org/go-tr064/mock"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/config"
"github.com/influxdata/telegraf/plugins/inputs"
"github.com/influxdata/telegraf/plugins/parsers/influx"
"github.com/influxdata/telegraf/testutil"
)
func TestValidDefaultConfig(t *testing.T) {
// Verify plugin can be loaded from config
conf := config.NewConfig()
require.NoError(t, conf.LoadConfig("sample.conf"))
require.Len(t, conf.Inputs, 1)
f, ok := conf.Inputs[0].Input.(*Fritzbox)
require.True(t, ok)
// Verify successful Init
require.NoError(t, f.Init())
// Verify everything is setup according to plugin defaults
require.ElementsMatch(t, []string{"http://user:password@fritz.box:49000/"}, f.URLs)
require.Equal(t, []string{"device", "wan", "ppp", "dsl", "wlan"}, f.Collect)
require.Equal(t, config.Duration(10*time.Second), f.Timeout)
require.Empty(t, f.TLSKeyPwd)
require.False(t, f.InsecureSkipVerify)
}
func TestValidCustomConfig(t *testing.T) {
// Verify plugin can be loaded from config
conf := config.NewConfig()
require.NoError(t, conf.LoadConfig("testdata/conf/valid.conf"))
require.Len(t, conf.Inputs, 1)
f, ok := conf.Inputs[0].Input.(*Fritzbox)
require.True(t, ok)
// Verify successful Init
require.NoError(t, f.Init())
// Verify everything is setup according to the config file
require.ElementsMatch(t, []string{"http://boxuser:boxpassword@fritz.box:49000/", "http://:repeaterpassword@fritz.repeater:49000/"}, f.URLs)
require.Equal(t, []string{"device", "wan", "ppp", "dsl", "wlan", "hosts"}, f.Collect)
require.Equal(t, config.Duration(60*time.Second), f.Timeout)
require.Equal(t, "secret", f.TLSKeyPwd)
require.True(t, f.InsecureSkipVerify)
}
func TestInvalidURLsConfig(t *testing.T) {
// Verify plugin can be loaded from config
conf := config.NewConfig()
require.NoError(t, conf.LoadConfig("testdata/conf/invalid_urls.conf"))
require.Len(t, conf.Inputs, 1)
f, ok := conf.Inputs[0].Input.(*Fritzbox)
require.True(t, ok)
// Verify Init failure
require.EqualError(t, f.Init(), `parsing device URL "::" failed: parse "::": missing protocol scheme`)
}
func TestInvalidCollectConfig(t *testing.T) {
// Verify plugin can be loaded from config
conf := config.NewConfig()
require.NoError(t, conf.LoadConfig("testdata/conf/invalid_collect.conf"))
require.Len(t, conf.Inputs, 1)
f, ok := conf.Inputs[0].Input.(*Fritzbox)
require.True(t, ok)
// Verify Init failure
require.EqualError(t, f.Init(), `invalid service "undefined" in collect parameter`)
}
func TestCases(t *testing.T) {
// Get all testcase directories
testcases, err := os.ReadDir("testdata/testcases")
require.NoError(t, err)
// Register the plugin
inputs.Add("fritzbox", func() telegraf.Input {
return &Fritzbox{Timeout: config.Duration(10 * time.Second)}
})
for _, testcase := range testcases {
// Only handle folders
if !testcase.IsDir() {
continue
}
t.Run(testcase.Name(), func(t *testing.T) {
testcaseDir := filepath.Join("testdata", "testcases", testcase.Name())
configFile := filepath.Join(testcaseDir, "telegraf.conf")
mockDir := filepath.Join(testcaseDir, "mock")
expectedMetricsFile := filepath.Join(testcaseDir, "expected.out")
// Setup the services to mock (one per sub-folder of mockDir)
services, err := os.ReadDir(mockDir)
require.NoError(t, err)
serviceMocks := make([]*mock.ServiceMock, 0, len(services))
for _, service := range services {
// Ignore the mock files
if !testcase.IsDir() {
continue
}
serviceMock := mock.ServiceMockFromFile("/"+service.Name(), filepath.Join(mockDir, service.Name(), "response.xml"))
serviceMocks = append(serviceMocks, serviceMock)
}
// Start testcase mock server
tr064Server := mock.Start(mockDir, serviceMocks...)
defer tr064Server.Shutdown()
// Load plugin from config
conf := config.NewConfig()
require.NoError(t, conf.LoadConfig(configFile))
require.Len(t, conf.Inputs, 1)
f, ok := conf.Inputs[0].Input.(*Fritzbox)
require.True(t, ok)
// Target plugin at mock server
f.URLs = []string{tr064Server.Server().String()}
f.Log = &testutil.Logger{Name: "fritzbox"}
// Verify successful Init
require.NoError(t, f.Init())
// Verify successfull Gather
acc := &testutil.Accumulator{}
require.NoError(t, acc.GatherError(f.Gather))
// Load expexected metrics
parser := &influx.Parser{}
require.NoError(t, parser.Init())
expectedMetrics, err := testutil.ParseMetricsFromFile(expectedMetricsFile, parser)
require.NoError(t, err)
// Verify metrics are as expected
testutil.RequireMetricsEqual(t, expectedMetrics, acc.GetTelegrafMetrics(), testutil.IgnoreTime(), testutil.IgnoreType(), testutil.SortMetrics())
})
}
}