1
0
Fork 0
telegraf/plugins/inputs/xtremio/xtremio_test.go

226 lines
5.5 KiB
Go
Raw Permalink Normal View History

package xtremio
import (
"fmt"
"net/http"
"net/http/httptest"
"os"
"path/filepath"
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/testutil"
)
var testdataDir = getTestdataDir()
func TestInitDefault(t *testing.T) {
// This test should succeed with the default initialization.
plugin := &XtremIO{
Username: "testuser",
Password: "testpass",
URL: "http://example.com",
Log: testutil.Logger{},
}
// Test the initialization succeeds
require.NoError(t, plugin.Init())
// Also test that default values are set correctly
require.Equal(t, "testuser", plugin.Username)
require.Equal(t, "testpass", plugin.Password)
require.Equal(t, "http://example.com", plugin.URL)
}
func TestInitFail(t *testing.T) {
tests := []struct {
name string
plugin *XtremIO
expected string
}{
{
name: "all empty",
plugin: &XtremIO{},
expected: "username cannot be empty",
},
{
name: "no username",
plugin: &XtremIO{Password: "testpass", URL: "http://example.com"},
expected: "username cannot be empty",
},
{
name: "no password",
plugin: &XtremIO{Username: "testuser", URL: "http://example.com"},
expected: "password cannot be empty",
},
{
name: "no url",
plugin: &XtremIO{Username: "testuser", Password: "testpass"},
expected: "url cannot be empty",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
tt.plugin.Log = testutil.Logger{}
err := tt.plugin.Init()
require.Error(t, err)
require.EqualError(t, err, tt.expected)
})
}
}
func TestFixedValue(t *testing.T) {
ts := httptest.NewServer(
http.HandlerFunc(
func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/api/json/v3/commands/login" {
cookie := &http.Cookie{Name: "sessid", Value: "cookie:123456789"}
http.SetCookie(w, cookie)
if _, err := fmt.Fprintln(w, "authentication succeeded"); err != nil {
w.WriteHeader(http.StatusInternalServerError)
t.Error(err)
return
}
w.WriteHeader(http.StatusOK)
} else if r.URL.Path == "/api/json/v3/types/bbus" {
sampleGetBBUsResponse, err := os.ReadFile(filepath.Join(testdataDir, "sample_get_bbu_response.json"))
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
t.Error(err)
return
}
if _, err = fmt.Fprintln(w, string(sampleGetBBUsResponse)); err != nil {
w.WriteHeader(http.StatusInternalServerError)
t.Error(err)
return
}
w.WriteHeader(http.StatusOK)
} else if r.URL.Path == "/api/json/v3/types/bbus/987654321abcdef" {
sampleBBUResponseOne, err := os.ReadFile(filepath.Join(testdataDir, "sample_bbu_response.json"))
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
t.Error(err)
return
}
if _, err = fmt.Fprintln(w, string(sampleBBUResponseOne)); err != nil {
w.WriteHeader(http.StatusInternalServerError)
t.Error(err)
return
}
w.WriteHeader(http.StatusOK)
}
},
),
)
defer ts.Close()
tests := []struct {
name string
plugin *XtremIO
expected []telegraf.Metric
}{
{
name: "gather bbus only",
plugin: &XtremIO{
Username: "testuser",
Password: "testpass",
URL: ts.URL,
Collectors: []string{"bbus"},
},
expected: []telegraf.Metric{
testutil.MustMetric(
"xio",
map[string]string{
"serial_number": "A123B45678",
"guid": "987654321abcdef",
"power_feed": "PWR-A",
"name": "X1-BBU",
"model_name": "Eaton Model Name",
},
map[string]interface{}{
"bbus_power": 244,
"bbus_average_daily_temp": 23,
"bbus_enabled": true,
"bbus_ups_need_battery_replacement": false,
"bbus_ups_low_battery_no_input": false,
},
time.Unix(0, 0),
),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var acc testutil.Accumulator
tt.plugin.Log = testutil.Logger{}
require.NoError(t, tt.plugin.Init())
require.NoError(t, tt.plugin.Gather(&acc))
require.Empty(t, acc.Errors, "found errors accumulated by acc.AddError()")
acc.Wait(len(tt.expected))
testutil.RequireMetricsEqual(t, tt.expected, acc.GetTelegrafMetrics(), testutil.IgnoreTime())
})
}
}
func TestAuthenticationFailed(t *testing.T) {
ts := httptest.NewServer(
http.HandlerFunc(
func(w http.ResponseWriter, _ *http.Request) {
if _, err := fmt.Fprintln(w, "bad request"); err != nil {
w.WriteHeader(http.StatusInternalServerError)
t.Error(err)
return
}
w.WriteHeader(http.StatusBadRequest)
},
),
)
defer ts.Close()
tests := []struct {
name string
plugin *XtremIO
expected string
}{
{
name: "authentication failed",
plugin: &XtremIO{
Username: "usertest",
Password: "userpass",
URL: ts.URL,
},
expected: "no authentication cookie set",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var acc testutil.Accumulator
tt.plugin.Log = testutil.Logger{}
require.NoError(t, tt.plugin.Init())
err := tt.plugin.Gather(&acc)
require.Error(t, err)
require.EqualError(t, err, tt.expected)
})
}
}
func getTestdataDir() string {
dir, err := os.Getwd()
if err != nil {
// if we cannot even establish the test directory, further progress is meaningless
panic(err)
}
return filepath.Join(dir, "testdata")
}