telegraf/plugins/outputs/groundwork/groundwork_test.go

141 lines
3.7 KiB
Go

package groundwork
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/http/httptest"
"testing"
"github.com/gwos/tcg/sdk/clients"
"github.com/stretchr/testify/require"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/testutil"
)
const (
defaultTestAgentID = "ec1676cc-583d-48ee-b035-7fb5ed0fcf88"
defaultHost = "telegraf"
)
func TestWriteWithDefaults(t *testing.T) {
// Generate test metric with default name to test Write logic
intMetric := testutil.TestMetric(42, "IntMetric")
// Simulate Groundwork server that should receive custom metrics
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
body, err := ioutil.ReadAll(r.Body)
require.NoError(t, err)
// Decode body to use in assertions below
var obj groundworkObject
err = json.Unmarshal(body, &obj)
require.NoError(t, err)
// Check if server gets valid metrics object
require.Equal(t, defaultTestAgentID, obj.Context.AgentID)
require.Equal(t, defaultHost, obj.Resources[0].Name)
require.Equal(t, "IntMetric", obj.Resources[0].Services[0].Name)
require.Equal(t, int64(42), obj.Resources[0].Services[0].Metrics[0].Value.IntegerValue)
require.Equal(t, 0, len(obj.Groups))
_, err = fmt.Fprintln(w, `OK`)
require.NoError(t, err)
}))
i := Groundwork{
Server: server.URL,
AgentID: defaultTestAgentID,
DefaultHost: defaultHost,
client: clients.GWClient{
AppName: "telegraf",
AppType: "TELEGRAF",
GWConnection: &clients.GWConnection{
HostName: server.URL,
},
},
}
err := i.Write([]telegraf.Metric{intMetric})
require.NoError(t, err)
defer server.Close()
}
func TestWriteWithTags(t *testing.T) {
// Generate test metric with tags to test Write logic
floatMetric := testutil.TestMetric(1.0, "FloatMetric")
floatMetric.AddTag("host", "Host01")
floatMetric.AddTag("group", "Group01")
// Simulate Groundwork server that should receive custom metrics
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
body, err := ioutil.ReadAll(r.Body)
require.NoError(t, err)
// Decode body to use in assertions below
var obj groundworkObject
err = json.Unmarshal(body, &obj)
require.NoError(t, err)
// Check if server gets valid metrics object
require.Equal(t, defaultTestAgentID, obj.Context.AgentID)
require.Equal(t, "Host01", obj.Resources[0].Name)
require.Equal(t, "FloatMetric", obj.Resources[0].Services[0].Name)
require.Equal(t, 1.0, obj.Resources[0].Services[0].Metrics[0].Value.DoubleValue)
require.Equal(t, "Group01", obj.Groups[0].GroupName)
require.Equal(t, "Host01", obj.Groups[0].Resources[0].Name)
_, err = fmt.Fprintln(w, `OK`)
require.NoError(t, err)
}))
i := Groundwork{
Server: server.URL,
AgentID: defaultTestAgentID,
DefaultHost: defaultHost,
GroupTag: "group",
ResourceTag: "host",
client: clients.GWClient{
AppName: "telegraf",
AppType: "TELEGRAF",
GWConnection: &clients.GWConnection{
HostName: server.URL,
},
},
}
err := i.Write([]telegraf.Metric{floatMetric})
require.NoError(t, err)
defer server.Close()
}
type groundworkObject struct {
Context struct {
AgentID string `json:"agentId"`
} `json:"context"`
Resources []struct {
Name string `json:"name"`
Services []struct {
Name string `json:"name"`
Metrics []struct {
Value struct {
DoubleValue float64 `json:"doubleValue"`
IntegerValue int64 `json:"integerValue"`
} `json:"value"`
}
} `json:"services"`
} `json:"resources"`
Groups []struct {
Type string `json:"type"`
GroupName string `json:"groupName"`
Resources []struct {
Name string `json:"name"`
Type string `json:"type"`
} `json:"resources"`
} `json:"groups"`
}