149 lines
4.8 KiB
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())
|
|
})
|
|
}
|
|
}
|