summaryrefslogtreecommitdiffstats
path: root/src/go/collectors/go.d.plugin/modules/openvpn_status_log/openvpn_test.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/go/collectors/go.d.plugin/modules/openvpn_status_log/openvpn_test.go362
1 files changed, 362 insertions, 0 deletions
diff --git a/src/go/collectors/go.d.plugin/modules/openvpn_status_log/openvpn_test.go b/src/go/collectors/go.d.plugin/modules/openvpn_status_log/openvpn_test.go
new file mode 100644
index 000000000..1e6071e01
--- /dev/null
+++ b/src/go/collectors/go.d.plugin/modules/openvpn_status_log/openvpn_test.go
@@ -0,0 +1,362 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package openvpn_status_log
+
+import (
+ "os"
+ "strings"
+ "testing"
+
+ "github.com/netdata/netdata/go/go.d.plugin/agent/module"
+ "github.com/netdata/netdata/go/go.d.plugin/pkg/matcher"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+const (
+ pathNonExistentFile = "testdata/v2.5.1/non-existent.txt"
+ pathEmptyFile = "testdata/v2.5.1/empty.txt"
+ pathStaticKey = "testdata/v2.5.1/static-key.txt"
+ pathStatusVersion1 = "testdata/v2.5.1/version1.txt"
+ pathStatusVersion1NoClients = "testdata/v2.5.1/version1-no-clients.txt"
+ pathStatusVersion2 = "testdata/v2.5.1/version2.txt"
+ pathStatusVersion2NoClients = "testdata/v2.5.1/version2-no-clients.txt"
+ pathStatusVersion3 = "testdata/v2.5.1/version3.txt"
+ pathStatusVersion3NoClients = "testdata/v2.5.1/version3-no-clients.txt"
+)
+
+var (
+ dataConfigJSON, _ = os.ReadFile("testdata/config.json")
+ dataConfigYAML, _ = os.ReadFile("testdata/config.yaml")
+)
+
+func Test_testDataIsValid(t *testing.T) {
+ for name, data := range map[string][]byte{
+ "dataConfigJSON": dataConfigJSON,
+ "dataConfigYAML": dataConfigYAML,
+ } {
+ require.NotNil(t, data, name)
+ }
+}
+
+func TestOpenVPNStatusLog_ConfigurationSerialize(t *testing.T) {
+ module.TestConfigurationSerialize(t, &OpenVPNStatusLog{}, dataConfigJSON, dataConfigYAML)
+}
+
+func TestOpenVPNStatusLog_Init(t *testing.T) {
+ tests := map[string]struct {
+ config Config
+ wantFail bool
+ }{
+ "default config": {
+ config: New().Config,
+ },
+ "unset 'log_path'": {
+ wantFail: true,
+ config: Config{
+ LogPath: "",
+ },
+ },
+ }
+
+ for name, test := range tests {
+ t.Run(name, func(t *testing.T) {
+ ovpn := New()
+ ovpn.Config = test.config
+
+ if test.wantFail {
+ assert.Error(t, ovpn.Init())
+ } else {
+ assert.NoError(t, ovpn.Init())
+ }
+ })
+ }
+}
+
+func TestOpenVPNStatusLog_Check(t *testing.T) {
+ tests := map[string]struct {
+ prepare func() *OpenVPNStatusLog
+ wantFail bool
+ }{
+ "status version 1": {prepare: prepareCaseStatusVersion1},
+ "status version 1 with no clients": {prepare: prepareCaseStatusVersion1NoClients},
+ "status version 2": {prepare: prepareCaseStatusVersion2},
+ "status version 2 with no clients": {prepare: prepareCaseStatusVersion2NoClients},
+ "status version 3": {prepare: prepareCaseStatusVersion3},
+ "status version 3 with no clients": {prepare: prepareCaseStatusVersion3NoClients},
+ "empty file": {prepare: prepareCaseEmptyFile, wantFail: true},
+ "non-existent file": {prepare: prepareCaseNonExistentFile, wantFail: true},
+ }
+
+ for name, test := range tests {
+ t.Run(name, func(t *testing.T) {
+ ovpn := test.prepare()
+
+ require.NoError(t, ovpn.Init())
+
+ if test.wantFail {
+ assert.Error(t, ovpn.Check())
+ } else {
+ assert.NoError(t, ovpn.Check())
+ }
+ })
+ }
+}
+
+func TestOpenVPNStatusLog_Charts(t *testing.T) {
+ tests := map[string]struct {
+ prepare func() *OpenVPNStatusLog
+ wantNumCharts int
+ }{
+ "status version 1 with user stats": {
+ prepare: prepareCaseStatusVersion1WithUserStats,
+ wantNumCharts: len(charts) + len(userCharts)*2,
+ },
+ "status version 2 with user stats": {
+ prepare: prepareCaseStatusVersion2WithUserStats,
+ wantNumCharts: len(charts) + len(userCharts)*2,
+ },
+ "status version 3 with user stats": {
+ prepare: prepareCaseStatusVersion2WithUserStats,
+ wantNumCharts: len(charts) + len(userCharts)*2,
+ },
+ "status version with static key": {
+ prepare: prepareCaseStatusStaticKey,
+ wantNumCharts: len(charts),
+ },
+ }
+
+ for name, test := range tests {
+ t.Run(name, func(t *testing.T) {
+ ovpn := test.prepare()
+
+ require.NoError(t, ovpn.Init())
+ _ = ovpn.Check()
+ _ = ovpn.Collect()
+
+ assert.Equal(t, test.wantNumCharts, len(*ovpn.Charts()))
+ })
+ }
+}
+
+func TestOpenVPNStatusLog_Collect(t *testing.T) {
+ tests := map[string]struct {
+ prepare func() *OpenVPNStatusLog
+ expected map[string]int64
+ }{
+ "status version 1": {
+ prepare: prepareCaseStatusVersion1,
+ expected: map[string]int64{
+ "bytes_in": 6168,
+ "bytes_out": 6369,
+ "clients": 2,
+ },
+ },
+ "status version 1 with user stats": {
+ prepare: prepareCaseStatusVersion1WithUserStats,
+ expected: map[string]int64{
+ "bytes_in": 6168,
+ "bytes_out": 6369,
+ "clients": 2,
+ "vpnclient2_bytes_in": 3084,
+ "vpnclient2_bytes_out": 3184,
+ "vpnclient2_connection_time": 63793143069,
+ "vpnclient_bytes_in": 3084,
+ "vpnclient_bytes_out": 3185,
+ "vpnclient_connection_time": 63793143069,
+ },
+ },
+ "status version 1 with no clients": {
+ prepare: prepareCaseStatusVersion1NoClients,
+ expected: map[string]int64{
+ "bytes_in": 0,
+ "bytes_out": 0,
+ "clients": 0,
+ },
+ },
+ "status version 2": {
+ prepare: prepareCaseStatusVersion2,
+ expected: map[string]int64{
+ "bytes_in": 6241,
+ "bytes_out": 6369,
+ "clients": 2,
+ },
+ },
+ "status version 2 with user stats": {
+ prepare: prepareCaseStatusVersion2WithUserStats,
+ expected: map[string]int64{
+ "bytes_in": 6241,
+ "bytes_out": 6369,
+ "clients": 2,
+ "vpnclient2_bytes_in": 3157,
+ "vpnclient2_bytes_out": 3184,
+ "vpnclient2_connection_time": 264610,
+ "vpnclient_bytes_in": 3084,
+ "vpnclient_bytes_out": 3185,
+ "vpnclient_connection_time": 264609,
+ },
+ },
+ "status version 2 with no clients": {
+ prepare: prepareCaseStatusVersion2NoClients,
+ expected: map[string]int64{
+ "bytes_in": 0,
+ "bytes_out": 0,
+ "clients": 0,
+ },
+ },
+ "status version 3": {
+ prepare: prepareCaseStatusVersion3,
+ expected: map[string]int64{
+ "bytes_in": 7308,
+ "bytes_out": 7235,
+ "clients": 2,
+ },
+ },
+ "status version 3 with user stats": {
+ prepare: prepareCaseStatusVersion3WithUserStats,
+ expected: map[string]int64{
+ "bytes_in": 7308,
+ "bytes_out": 7235,
+ "clients": 2,
+ "vpnclient2_bytes_in": 3654,
+ "vpnclient2_bytes_out": 3617,
+ "vpnclient2_connection_time": 265498,
+ "vpnclient_bytes_in": 3654,
+ "vpnclient_bytes_out": 3618,
+ "vpnclient_connection_time": 265496,
+ },
+ },
+ "status version 3 with no clients": {
+ prepare: prepareCaseStatusVersion3NoClients,
+ expected: map[string]int64{
+ "bytes_in": 0,
+ "bytes_out": 0,
+ "clients": 0,
+ },
+ },
+ "status with static key": {
+ prepare: prepareCaseStatusStaticKey,
+ expected: map[string]int64{
+ "bytes_in": 19265,
+ "bytes_out": 261631,
+ "clients": 0,
+ },
+ },
+ "empty file": {
+ prepare: prepareCaseEmptyFile,
+ expected: nil,
+ },
+ "non-existent file": {
+ prepare: prepareCaseNonExistentFile,
+ expected: nil,
+ },
+ }
+
+ for name, test := range tests {
+ t.Run(name, func(t *testing.T) {
+ ovpn := test.prepare()
+
+ require.NoError(t, ovpn.Init())
+ _ = ovpn.Check()
+
+ collected := ovpn.Collect()
+
+ copyConnTime(collected, test.expected)
+ assert.Equal(t, test.expected, collected)
+ })
+ }
+}
+
+func prepareCaseStatusVersion1() *OpenVPNStatusLog {
+ ovpn := New()
+ ovpn.LogPath = pathStatusVersion1
+ return ovpn
+}
+
+func prepareCaseStatusVersion1WithUserStats() *OpenVPNStatusLog {
+ ovpn := New()
+ ovpn.LogPath = pathStatusVersion1
+ ovpn.PerUserStats = matcher.SimpleExpr{
+ Includes: []string{"* *"},
+ }
+ return ovpn
+}
+
+func prepareCaseStatusVersion1NoClients() *OpenVPNStatusLog {
+ ovpn := New()
+ ovpn.LogPath = pathStatusVersion1NoClients
+ return ovpn
+}
+
+func prepareCaseStatusVersion2() *OpenVPNStatusLog {
+ ovpn := New()
+ ovpn.LogPath = pathStatusVersion2
+ return ovpn
+}
+
+func prepareCaseStatusVersion2WithUserStats() *OpenVPNStatusLog {
+ ovpn := New()
+ ovpn.LogPath = pathStatusVersion2
+ ovpn.PerUserStats = matcher.SimpleExpr{
+ Includes: []string{"* *"},
+ }
+ return ovpn
+}
+
+func prepareCaseStatusVersion2NoClients() *OpenVPNStatusLog {
+ ovpn := New()
+ ovpn.LogPath = pathStatusVersion2NoClients
+ return ovpn
+}
+
+func prepareCaseStatusVersion3() *OpenVPNStatusLog {
+ ovpn := New()
+ ovpn.LogPath = pathStatusVersion3
+ return ovpn
+}
+
+func prepareCaseStatusVersion3WithUserStats() *OpenVPNStatusLog {
+ ovpn := New()
+ ovpn.LogPath = pathStatusVersion3
+ ovpn.PerUserStats = matcher.SimpleExpr{
+ Includes: []string{"* *"},
+ }
+ return ovpn
+}
+
+func prepareCaseStatusVersion3NoClients() *OpenVPNStatusLog {
+ ovpn := New()
+ ovpn.LogPath = pathStatusVersion3NoClients
+ return ovpn
+}
+
+func prepareCaseStatusStaticKey() *OpenVPNStatusLog {
+ ovpn := New()
+ ovpn.LogPath = pathStaticKey
+ return ovpn
+}
+
+func prepareCaseEmptyFile() *OpenVPNStatusLog {
+ ovpn := New()
+ ovpn.LogPath = pathEmptyFile
+ return ovpn
+}
+
+func prepareCaseNonExistentFile() *OpenVPNStatusLog {
+ ovpn := New()
+ ovpn.LogPath = pathNonExistentFile
+ return ovpn
+}
+
+func copyConnTime(dst, src map[string]int64) {
+ for k, v := range src {
+ if !strings.HasSuffix(k, "connection_time") {
+ continue
+ }
+ if _, ok := dst[k]; !ok {
+ continue
+ }
+ dst[k] = v
+ }
+}