172 lines
5.1 KiB
Go
172 lines
5.1 KiB
Go
|
package supervisor
|
||
|
|
||
|
import (
|
||
|
"path/filepath"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/docker/go-connections/nat"
|
||
|
"github.com/stretchr/testify/require"
|
||
|
"github.com/testcontainers/testcontainers-go/wait"
|
||
|
|
||
|
"github.com/influxdata/telegraf/testutil"
|
||
|
)
|
||
|
|
||
|
func TestShort_SampleData(t *testing.T) {
|
||
|
testCases := []struct {
|
||
|
desc string
|
||
|
supervisorData supervisorInfo
|
||
|
sampleProcInfo []processInfo
|
||
|
expProcessFields []map[string]interface{}
|
||
|
expProcessTags []map[string]string
|
||
|
expInstanceFields map[string]interface{}
|
||
|
expInstancesTags map[string]string
|
||
|
}{
|
||
|
{
|
||
|
desc: "Case 1",
|
||
|
sampleProcInfo: []processInfo{
|
||
|
{
|
||
|
Name: "Process0",
|
||
|
Group: "ProcessGroup0",
|
||
|
Description: "pid 112 uptime 0:12:11",
|
||
|
Start: 1615632853,
|
||
|
Stop: 0,
|
||
|
Now: 1615632853 + 731,
|
||
|
State: 20,
|
||
|
Statename: "RUNNING",
|
||
|
StdoutLogfile: "/var/log/supervisor/process0-stdout.log",
|
||
|
StderrLogfile: "/var/log/supervisor/process0-stdout.log",
|
||
|
SpawnErr: "",
|
||
|
ExitStatus: 0,
|
||
|
Pid: 112,
|
||
|
},
|
||
|
{
|
||
|
Name: "Process1",
|
||
|
Group: "ProcessGroup1",
|
||
|
Description: "pid 113 uptime 0:12:11",
|
||
|
Start: 1615632853,
|
||
|
Stop: 0,
|
||
|
Now: 1615632853 + 731,
|
||
|
State: 20,
|
||
|
Statename: "RUNNING",
|
||
|
StdoutLogfile: "/var/log/supervisor/process1-stdout.log",
|
||
|
StderrLogfile: "/var/log/supervisor/process1-stderr.log",
|
||
|
SpawnErr: "",
|
||
|
ExitStatus: 0,
|
||
|
Pid: 113,
|
||
|
},
|
||
|
},
|
||
|
supervisorData: supervisorInfo{
|
||
|
StateCode: int8(1),
|
||
|
StateName: "RUNNING",
|
||
|
Ident: "supervisor",
|
||
|
},
|
||
|
expProcessFields: []map[string]interface{}{
|
||
|
{
|
||
|
"uptime": int32(731),
|
||
|
"state": int16(20),
|
||
|
"pid": int32(112),
|
||
|
"exitCode": int8(0),
|
||
|
},
|
||
|
{
|
||
|
"uptime": int32(731),
|
||
|
"state": int16(20),
|
||
|
"pid": int32(113),
|
||
|
"exitCode": int8(0),
|
||
|
},
|
||
|
},
|
||
|
expProcessTags: []map[string]string{
|
||
|
{
|
||
|
"process": "Process0",
|
||
|
"group": "ProcessGroup0",
|
||
|
"source": "example.org",
|
||
|
"port": "9001",
|
||
|
"id": "supervisor",
|
||
|
},
|
||
|
{
|
||
|
"process": "Process1",
|
||
|
"group": "ProcessGroup1",
|
||
|
"source": "example.org",
|
||
|
"port": "9001",
|
||
|
"id": "supervisor",
|
||
|
},
|
||
|
},
|
||
|
expInstanceFields: map[string]interface{}{
|
||
|
"state": int8(1),
|
||
|
},
|
||
|
expInstancesTags: map[string]string{
|
||
|
"source": "example.org",
|
||
|
"port": "9001",
|
||
|
"id": "supervisor",
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
for _, tC := range testCases {
|
||
|
t.Run(tC.desc, func(t *testing.T) {
|
||
|
s := &Supervisor{
|
||
|
Server: "http://example.org:9001/RPC2",
|
||
|
}
|
||
|
status := supervisorInfo{
|
||
|
StateCode: tC.supervisorData.StateCode,
|
||
|
StateName: tC.supervisorData.StateName,
|
||
|
Ident: tC.supervisorData.Ident,
|
||
|
}
|
||
|
err := s.Init()
|
||
|
if err != nil {
|
||
|
t.Errorf("failed to run Init function: %v", err)
|
||
|
}
|
||
|
for k, v := range tC.sampleProcInfo {
|
||
|
processTags, processFields, err := s.parseProcessData(v, status)
|
||
|
require.NoError(t, err)
|
||
|
require.Equal(t, tC.expProcessFields[k], processFields)
|
||
|
require.Equal(t, tC.expProcessTags[k], processTags)
|
||
|
}
|
||
|
instanceTags, instanceFields, err := s.parseInstanceData(status)
|
||
|
require.NoError(t, err)
|
||
|
require.Equal(t, tC.expInstancesTags, instanceTags)
|
||
|
require.Equal(t, tC.expInstanceFields, instanceFields)
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestIntegration_BasicGathering(t *testing.T) {
|
||
|
if testing.Short() {
|
||
|
t.Skip("Skipping integration test in short mode")
|
||
|
}
|
||
|
const supervisorPort = "9001"
|
||
|
supervisorConfig, err := filepath.Abs("testdata/supervisord.conf")
|
||
|
require.NoError(t, err, "Failed to get absolute path of supervisord config")
|
||
|
ctr := testutil.Container{
|
||
|
Image: "niasar/supervisor:stretch-3.3",
|
||
|
ExposedPorts: []string{supervisorPort},
|
||
|
Files: map[string]string{
|
||
|
"/etc/supervisor/supervisord.conf": supervisorConfig,
|
||
|
},
|
||
|
WaitingFor: wait.ForAll(
|
||
|
wait.ForLog("entered RUNNING state").WithOccurrence(6),
|
||
|
wait.ForListeningPort(nat.Port(supervisorPort)),
|
||
|
),
|
||
|
}
|
||
|
err = ctr.Start()
|
||
|
require.NoError(t, err, "failed to start container")
|
||
|
defer ctr.Terminate()
|
||
|
s := &Supervisor{
|
||
|
Server: "http://login:pass@" + testutil.GetLocalHost() + ":" + ctr.Ports[supervisorPort] + "/RPC2",
|
||
|
}
|
||
|
err = s.Init()
|
||
|
require.NoError(t, err, "failed to run Init function")
|
||
|
var acc testutil.Accumulator
|
||
|
err = acc.GatherError(s.Gather)
|
||
|
require.NoError(t, err)
|
||
|
require.True(t, acc.HasField("supervisor_processes", "uptime"))
|
||
|
require.True(t, acc.HasField("supervisor_processes", "state"))
|
||
|
require.True(t, acc.HasField("supervisor_processes", "pid"))
|
||
|
require.True(t, acc.HasField("supervisor_processes", "exitCode"))
|
||
|
require.True(t, acc.HasField("supervisor_instance", "state"))
|
||
|
require.True(t, acc.HasTag("supervisor_processes", "id"))
|
||
|
require.True(t, acc.HasTag("supervisor_processes", "source"))
|
||
|
require.True(t, acc.HasTag("supervisor_processes", "port"))
|
||
|
require.True(t, acc.HasTag("supervisor_instance", "id"))
|
||
|
require.True(t, acc.HasTag("supervisor_instance", "source"))
|
||
|
require.True(t, acc.HasTag("supervisor_instance", "port"))
|
||
|
}
|