Add Windows Services input plugin (#3023)
This commit is contained in:
committed by
Daniel Nelson
parent
795f02ab88
commit
e21f2de8b8
115
plugins/inputs/win_services/win_services_integration_test.go
Normal file
115
plugins/inputs/win_services/win_services_integration_test.go
Normal file
@@ -0,0 +1,115 @@
|
||||
// +build windows
|
||||
|
||||
//these tests must be run under administrator account
|
||||
package win_services
|
||||
|
||||
import (
|
||||
"github.com/influxdata/telegraf/testutil"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"golang.org/x/sys/windows/svc/mgr"
|
||||
"testing"
|
||||
)
|
||||
|
||||
var InvalidServices = []string{"XYZ1@", "ZYZ@", "SDF_@#"}
|
||||
var KnownServices = []string{"LanmanServer", "TermService"}
|
||||
|
||||
func TestList(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("Skipping integration test in short mode")
|
||||
}
|
||||
services, err := listServices(&MgProvider{}, KnownServices)
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, services, 2, "Different number of services")
|
||||
assert.Equal(t, services[0].ServiceName, KnownServices[0])
|
||||
assert.Nil(t, services[0].Error)
|
||||
assert.Equal(t, services[1].ServiceName, KnownServices[1])
|
||||
assert.Nil(t, services[1].Error)
|
||||
}
|
||||
|
||||
func TestEmptyList(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("Skipping integration test in short mode")
|
||||
}
|
||||
services, err := listServices(&MgProvider{}, []string{})
|
||||
require.NoError(t, err)
|
||||
assert.Condition(t, func() bool { return len(services) > 20 }, "Too few service")
|
||||
}
|
||||
|
||||
func TestListEr(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("Skipping integration test in short mode")
|
||||
}
|
||||
services, err := listServices(&MgProvider{}, InvalidServices)
|
||||
require.NoError(t, err)
|
||||
assert.Len(t, services, 3, "Different number of services")
|
||||
for i := 0; i < 3; i++ {
|
||||
assert.Equal(t, services[i].ServiceName, InvalidServices[i])
|
||||
assert.NotNil(t, services[i].Error)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGather(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("Skipping integration test in short mode")
|
||||
}
|
||||
ws := &WinServices{KnownServices, &MgProvider{}}
|
||||
assert.Len(t, ws.ServiceNames, 2, "Different number of services")
|
||||
var acc testutil.Accumulator
|
||||
require.NoError(t, ws.Gather(&acc))
|
||||
assert.Len(t, acc.Errors, 0, "There should be no errors after gather")
|
||||
|
||||
for i := 0; i < 2; i++ {
|
||||
fields := make(map[string]interface{})
|
||||
tags := make(map[string]string)
|
||||
si := getServiceInfo(KnownServices[i])
|
||||
fields["state"] = int(si.State)
|
||||
fields["startup_mode"] = int(si.StartUpMode)
|
||||
tags["service_name"] = si.ServiceName
|
||||
tags["display_name"] = si.DisplayName
|
||||
acc.AssertContainsTaggedFields(t, "win_services", fields, tags)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGatherErrors(t *testing.T) {
|
||||
if testing.Short() {
|
||||
t.Skip("Skipping integration test in short mode")
|
||||
}
|
||||
ws := &WinServices{InvalidServices, &MgProvider{}}
|
||||
assert.Len(t, ws.ServiceNames, 3, "Different number of services")
|
||||
var acc testutil.Accumulator
|
||||
require.NoError(t, ws.Gather(&acc))
|
||||
assert.Len(t, acc.Errors, 3, "There should be 3 errors after gather")
|
||||
}
|
||||
|
||||
func getServiceInfo(srvName string) *ServiceInfo {
|
||||
|
||||
scmgr, err := mgr.Connect()
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
defer scmgr.Disconnect()
|
||||
|
||||
srv, err := scmgr.OpenService(srvName)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
var si ServiceInfo
|
||||
si.ServiceName = srvName
|
||||
srvStatus, err := srv.Query()
|
||||
if err == nil {
|
||||
si.State = int(srvStatus.State)
|
||||
} else {
|
||||
si.Error = err
|
||||
}
|
||||
|
||||
srvCfg, err := srv.Config()
|
||||
if err == nil {
|
||||
si.DisplayName = srvCfg.DisplayName
|
||||
si.StartUpMode = int(srvCfg.StartType)
|
||||
} else {
|
||||
si.Error = err
|
||||
}
|
||||
srv.Close()
|
||||
return &si
|
||||
}
|
||||
Reference in New Issue
Block a user