176 lines
4.6 KiB
Go
176 lines
4.6 KiB
Go
|
//go:build linux
|
||
|
|
||
|
package systemd
|
||
|
|
||
|
import (
|
||
|
"testing"
|
||
|
|
||
|
"github.com/stretchr/testify/require"
|
||
|
|
||
|
"github.com/influxdata/telegraf/testutil"
|
||
|
)
|
||
|
|
||
|
func getSystemdVersionMin() (int, error) {
|
||
|
return systemdMinimumVersion, nil
|
||
|
}
|
||
|
|
||
|
func TestSampleConfig(t *testing.T) {
|
||
|
plugin := &Systemd{}
|
||
|
require.NotEmpty(t, plugin.SampleConfig())
|
||
|
}
|
||
|
|
||
|
func TestMinimumVersion(t *testing.T) {
|
||
|
getSystemdVersion = func() (int, error) { return 123, nil }
|
||
|
|
||
|
plugin := &Systemd{Log: testutil.Logger{}}
|
||
|
require.ErrorContains(t, plugin.Init(), "below minimum version")
|
||
|
}
|
||
|
|
||
|
func TestEmptyPath(t *testing.T) {
|
||
|
getSystemdVersion = getSystemdVersionMin
|
||
|
|
||
|
plugin := &Systemd{Log: testutil.Logger{}}
|
||
|
require.ErrorContains(t, plugin.Init(), "'path' required without CREDENTIALS_DIRECTORY")
|
||
|
}
|
||
|
|
||
|
func TestEmptyCredentialsDirectoryWarning(t *testing.T) {
|
||
|
getSystemdVersion = getSystemdVersionMin
|
||
|
|
||
|
logger := &testutil.CaptureLogger{}
|
||
|
plugin := &Systemd{
|
||
|
Path: "testdata",
|
||
|
Log: logger}
|
||
|
require.NoError(t, plugin.Init())
|
||
|
|
||
|
actual := logger.Warnings()
|
||
|
require.Len(t, actual, 1)
|
||
|
require.Contains(t, actual[0], "CREDENTIALS_DIRECTORY environment variable undefined")
|
||
|
}
|
||
|
|
||
|
func TestPathNonExistentExplicit(t *testing.T) {
|
||
|
getSystemdVersion = getSystemdVersionMin
|
||
|
t.Setenv("CREDENTIALS_DIRECTORY", "testdata")
|
||
|
|
||
|
plugin := &Systemd{
|
||
|
Path: "non/existent/path",
|
||
|
Log: testutil.Logger{},
|
||
|
}
|
||
|
require.ErrorContains(t, plugin.Init(), "accessing credentials directory")
|
||
|
}
|
||
|
|
||
|
func TestPathNonExistentImplicit(t *testing.T) {
|
||
|
getSystemdVersion = getSystemdVersionMin
|
||
|
t.Setenv("CREDENTIALS_DIRECTORY", "non/existent/path")
|
||
|
|
||
|
plugin := &Systemd{
|
||
|
Log: testutil.Logger{},
|
||
|
}
|
||
|
require.ErrorContains(t, plugin.Init(), "accessing credentials directory")
|
||
|
}
|
||
|
|
||
|
func TestInit(t *testing.T) {
|
||
|
getSystemdVersion = getSystemdVersionMin
|
||
|
t.Setenv("CREDENTIALS_DIRECTORY", "testdata")
|
||
|
|
||
|
plugin := &Systemd{Log: testutil.Logger{}}
|
||
|
require.NoError(t, plugin.Init())
|
||
|
}
|
||
|
|
||
|
func TestSetNotAvailable(t *testing.T) {
|
||
|
getSystemdVersion = getSystemdVersionMin
|
||
|
t.Setenv("CREDENTIALS_DIRECTORY", "testdata")
|
||
|
|
||
|
plugin := &Systemd{Log: testutil.Logger{}}
|
||
|
require.NoError(t, plugin.Init())
|
||
|
|
||
|
// Try to Store the secrets, which this plugin should not let
|
||
|
require.ErrorContains(t, plugin.Set("foo", "bar"), "secret-store does not support creating secrets")
|
||
|
}
|
||
|
|
||
|
func TestListGet(t *testing.T) {
|
||
|
getSystemdVersion = getSystemdVersionMin
|
||
|
t.Setenv("CREDENTIALS_DIRECTORY", "testdata")
|
||
|
|
||
|
// secret files name and their content to compare under the `testdata` directory
|
||
|
secrets := map[string]string{
|
||
|
"secret-file-1": "IWontTell",
|
||
|
"secret_file_2": "SuperDuperSecret!23",
|
||
|
"secretFile": "foobar",
|
||
|
}
|
||
|
|
||
|
// Initialize the plugin
|
||
|
plugin := &Systemd{Log: testutil.Logger{}}
|
||
|
require.NoError(t, plugin.Init())
|
||
|
|
||
|
// List the Secrets
|
||
|
keys, err := plugin.List()
|
||
|
require.NoError(t, err)
|
||
|
require.Len(t, keys, len(secrets))
|
||
|
// check if the returned array from List() is the same
|
||
|
// as the name of secret files
|
||
|
for secretFileName := range secrets {
|
||
|
require.Contains(t, keys, secretFileName)
|
||
|
}
|
||
|
|
||
|
// Get the secrets
|
||
|
for _, k := range keys {
|
||
|
value, err := plugin.Get(k)
|
||
|
require.NoError(t, err)
|
||
|
v, found := secrets[k]
|
||
|
require.Truef(t, found, "unexpected secret requested that was not found: %q", k)
|
||
|
require.Equal(t, v, string(value))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestResolver(t *testing.T) {
|
||
|
getSystemdVersion = getSystemdVersionMin
|
||
|
t.Setenv("CREDENTIALS_DIRECTORY", "testdata")
|
||
|
|
||
|
// Secret Value Name to Resolve
|
||
|
secretFileName := "secret-file-1"
|
||
|
// Secret Value to Resolve To
|
||
|
secretVal := "IWontTell"
|
||
|
|
||
|
// Initialize the plugin
|
||
|
plugin := &Systemd{Log: testutil.Logger{}}
|
||
|
require.NoError(t, plugin.Init())
|
||
|
|
||
|
// Get the resolver
|
||
|
resolver, err := plugin.GetResolver(secretFileName)
|
||
|
require.NoError(t, err)
|
||
|
require.NotNil(t, resolver)
|
||
|
s, dynamic, err := resolver()
|
||
|
require.NoError(t, err)
|
||
|
require.False(t, dynamic)
|
||
|
require.Equal(t, secretVal, string(s))
|
||
|
}
|
||
|
|
||
|
func TestResolverInvalid(t *testing.T) {
|
||
|
getSystemdVersion = getSystemdVersionMin
|
||
|
t.Setenv("CREDENTIALS_DIRECTORY", "testdata")
|
||
|
|
||
|
// Initialize the plugin
|
||
|
plugin := &Systemd{Log: testutil.Logger{}}
|
||
|
require.NoError(t, plugin.Init())
|
||
|
|
||
|
// Get the resolver
|
||
|
resolver, err := plugin.GetResolver("foo")
|
||
|
require.NoError(t, err)
|
||
|
require.NotNil(t, resolver)
|
||
|
_, _, err = resolver()
|
||
|
require.ErrorContains(t, err, "cannot read the secret's value:")
|
||
|
}
|
||
|
|
||
|
func TestGetNonExistent(t *testing.T) {
|
||
|
getSystemdVersion = getSystemdVersionMin
|
||
|
t.Setenv("CREDENTIALS_DIRECTORY", "testdata")
|
||
|
|
||
|
// Initialize the plugin
|
||
|
plugin := &Systemd{Log: testutil.Logger{}}
|
||
|
require.NoError(t, plugin.Init())
|
||
|
|
||
|
// Get the resolver
|
||
|
_, err := plugin.Get("foo")
|
||
|
require.ErrorContains(t, err, "cannot read the secret's value:")
|
||
|
}
|