telegraf/plugins/outputs/mongodb/mongodb_test.go

353 lines
9.6 KiB
Go
Raw Normal View History

package mongodb
import (
"testing"
"time"
"github.com/influxdata/telegraf/config"
"github.com/influxdata/telegraf/plugins/common/tls"
"github.com/influxdata/telegraf/testutil"
"github.com/stretchr/testify/require"
)
func TestConnectAndWriteIntegrationNoAuth(t *testing.T) {
if testing.Short() {
t.Skip("Skipping integration test in short mode")
}
plugin := &MongoDB{
Dsn: "mongodb://localhost:27017",
AuthenticationType: "NONE",
MetricDatabase: "telegraf_test",
MetricGranularity: "seconds",
}
// validate config
require.NoError(t, plugin.Init())
require.NoError(t, plugin.Connect())
require.NoError(t, plugin.Write(testutil.MockMetrics()))
require.NoError(t, plugin.Close())
}
func TestConnectAndWriteIntegrationSCRAMAuth(t *testing.T) {
if testing.Short() {
t.Skip("Skipping integration test in short mode")
}
tests := []struct {
name string
plugin *MongoDB
connErrFunc func(t *testing.T, err error)
}{
{
name: "success with scram authentication",
plugin: &MongoDB{
Dsn: "mongodb://localhost:27018/admin",
AuthenticationType: "SCRAM",
Username: "root",
Password: "changeme",
MetricDatabase: "telegraf_test",
MetricGranularity: "seconds",
},
connErrFunc: func(t *testing.T, err error) {
require.NoError(t, err)
},
},
{
name: "fail with scram authentication bad password",
plugin: &MongoDB{
Dsn: "mongodb://localhost:27018/admin",
AuthenticationType: "SCRAM",
Username: "root",
Password: "root",
MetricDatabase: "telegraf_test",
MetricGranularity: "seconds",
ServerSelectTimeout: config.Duration(time.Duration(5) * time.Second),
},
connErrFunc: func(t *testing.T, err error) {
require.Error(t, err)
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// validate config
err := tt.plugin.Init()
require.NoError(t, err)
if err == nil {
// connect
err = tt.plugin.Connect()
tt.connErrFunc(t, err)
if err == nil {
// insert mock metrics
err = tt.plugin.Write(testutil.MockMetrics())
require.NoError(t, err)
// cleanup
err = tt.plugin.Close()
require.NoError(t, err)
}
}
})
}
}
func TestConnectAndWriteIntegrationX509Auth(t *testing.T) {
if testing.Short() {
t.Skip("Skipping integration test in short mode")
}
tests := []struct {
name string
plugin *MongoDB
connErrFunc func(t *testing.T, err error)
}{
{
name: "success with x509 authentication",
plugin: &MongoDB{
Dsn: "mongodb://localhost:27019",
AuthenticationType: "X509",
MetricDatabase: "telegraf_test",
MetricGranularity: "seconds",
ServerSelectTimeout: config.Duration(time.Duration(5) * time.Second),
TTL: config.Duration(time.Duration(5) * time.Minute),
ClientConfig: tls.ClientConfig{
TLSCA: "dev/cacert.pem",
TLSKey: "dev/client.pem",
InsecureSkipVerify: false,
},
},
connErrFunc: func(t *testing.T, err error) {
require.NoError(t, err)
},
},
{
name: "success with x509 authentication using encrypted key file",
plugin: &MongoDB{
Dsn: "mongodb://localhost:27019",
AuthenticationType: "X509",
MetricDatabase: "telegraf_test",
MetricGranularity: "seconds",
ServerSelectTimeout: config.Duration(time.Duration(5) * time.Second),
TTL: config.Duration(time.Duration(5) * time.Minute),
ClientConfig: tls.ClientConfig{
TLSCA: "dev/cacert.pem",
TLSKey: "dev/clientenc.pem",
TLSKeyPwd: "changeme",
InsecureSkipVerify: false,
},
},
connErrFunc: func(t *testing.T, err error) {
require.NoError(t, err)
},
},
{
name: "success with x509 authentication missing ca and using insceure tls",
plugin: &MongoDB{
Dsn: "mongodb://localhost:27019",
AuthenticationType: "X509",
MetricDatabase: "telegraf_test",
MetricGranularity: "seconds",
ServerSelectTimeout: config.Duration(time.Duration(5) * time.Second),
TTL: config.Duration(time.Duration(5) * time.Minute),
ClientConfig: tls.ClientConfig{
TLSKey: "dev/client.pem",
InsecureSkipVerify: true,
},
},
connErrFunc: func(t *testing.T, err error) {
require.NoError(t, err)
},
},
{
name: "fail with x509 authentication missing ca",
plugin: &MongoDB{
Dsn: "mongodb://localhost:27019",
AuthenticationType: "X509",
MetricDatabase: "telegraf_test",
MetricGranularity: "seconds",
ServerSelectTimeout: config.Duration(time.Duration(5) * time.Second),
TTL: config.Duration(time.Duration(5) * time.Minute),
ClientConfig: tls.ClientConfig{
TLSKey: "dev/client.pem",
InsecureSkipVerify: false,
},
},
connErrFunc: func(t *testing.T, err error) {
require.Error(t, err)
},
},
{
name: "fail with x509 authentication using encrypted key file",
plugin: &MongoDB{
Dsn: "mongodb://localhost:27019",
AuthenticationType: "X509",
MetricDatabase: "telegraf_test",
MetricGranularity: "seconds",
ServerSelectTimeout: config.Duration(time.Duration(5) * time.Second),
TTL: config.Duration(time.Duration(5) * time.Minute),
ClientConfig: tls.ClientConfig{
TLSCA: "dev/cacert.pem",
TLSKey: "dev/clientenc.pem",
TLSKeyPwd: "badpassword",
InsecureSkipVerify: false,
},
},
connErrFunc: func(t *testing.T, err error) {
require.Error(t, err)
},
},
{
name: "fail with x509 authentication using invalid ca",
plugin: &MongoDB{
Dsn: "mongodb://localhost:27019",
AuthenticationType: "X509",
MetricDatabase: "telegraf_test",
MetricGranularity: "seconds",
ServerSelectTimeout: config.Duration(time.Duration(5) * time.Second),
TTL: config.Duration(time.Duration(5) * time.Minute),
ClientConfig: tls.ClientConfig{
TLSCA: "dev/client.pem",
TLSKey: "dev/client.pem",
InsecureSkipVerify: false,
},
},
connErrFunc: func(t *testing.T, err error) {
require.Error(t, err)
},
},
{
name: "fail with x509 authentication using invalid key",
plugin: &MongoDB{
Dsn: "mongodb://localhost:27019",
AuthenticationType: "X509",
MetricDatabase: "telegraf_test",
MetricGranularity: "seconds",
ServerSelectTimeout: config.Duration(time.Duration(5) * time.Second),
TTL: config.Duration(time.Duration(5) * time.Minute),
ClientConfig: tls.ClientConfig{
TLSCA: "dev/cacert.pem",
TLSKey: "dev/cacert.pem",
InsecureSkipVerify: false,
},
},
connErrFunc: func(t *testing.T, err error) {
require.Error(t, err)
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// validate config
err := tt.plugin.Init()
require.NoError(t, err)
if err == nil {
// connect
err = tt.plugin.Connect()
tt.connErrFunc(t, err)
if err == nil {
// insert mock metrics
err = tt.plugin.Write(testutil.MockMetrics())
require.NoError(t, err)
// cleanup
err = tt.plugin.Close()
require.NoError(t, err)
}
}
})
}
}
func TestConfiguration(t *testing.T) {
tests := []struct {
name string
plugin *MongoDB
errFunc func(t *testing.T, err error)
}{
{
name: "fail with invalid connection string",
plugin: &MongoDB{
Dsn: "asdf1234",
AuthenticationType: "NONE",
MetricDatabase: "telegraf_test",
MetricGranularity: "seconds",
TTL: config.Duration(time.Duration(5) * time.Minute),
},
},
{
name: "fail with invalid metric granularity",
plugin: &MongoDB{
Dsn: "mongodb://localhost:27017",
AuthenticationType: "NONE",
MetricDatabase: "telegraf_test",
MetricGranularity: "somerandomgranularitythatdoesntwork",
},
},
{
name: "fail with scram authentication missing username field",
plugin: &MongoDB{
Dsn: "mongodb://localhost:27017",
AuthenticationType: "SCRAM",
Password: "somerandompasswordthatwontwork",
MetricDatabase: "telegraf_test",
MetricGranularity: "seconds",
},
},
{
name: "fail with scram authentication missing password field",
plugin: &MongoDB{
Dsn: "mongodb://localhost:27017",
AuthenticationType: "SCRAM",
Username: "somerandomusernamethatwontwork",
MetricDatabase: "telegraf_test",
MetricGranularity: "seconds",
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// validate config
err := tt.plugin.Init()
require.Error(t, err)
})
}
tests = []struct {
name string
plugin *MongoDB
errFunc func(t *testing.T, err error)
}{
{
name: "success init with missing metric database",
plugin: &MongoDB{
Dsn: "mongodb://localhost:27017",
AuthenticationType: "NONE",
MetricGranularity: "seconds",
},
},
{
name: "success init missing metric granularity",
plugin: &MongoDB{
Dsn: "mongodb://localhost:27017",
AuthenticationType: "NONE",
MetricDatabase: "telegraf_test",
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// validate config
err := tt.plugin.Init()
require.NoError(t, err)
})
}
}