summaryrefslogtreecommitdiffstats
path: root/src/go/collectors/go.d.plugin/modules/openvpn/client/client_test.go
blob: c10673ed54bc32817d39332ec14b59103ddedc74 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// SPDX-License-Identifier: GPL-3.0-or-later

package client

import (
	"bufio"
	"bytes"
	"fmt"
	"os"
	"strings"
	"testing"

	"github.com/netdata/netdata/go/go.d.plugin/pkg/socket"
	"github.com/stretchr/testify/assert"
)

var (
	testLoadStatsData, _     = os.ReadFile("testdata/load-stats.txt")
	testVersionData, _       = os.ReadFile("testdata/version.txt")
	testStatus3Data, _       = os.ReadFile("testdata/status3.txt")
	testMaxLinesExceededData = strings.Repeat(">CLIENT:ESTABLISHED,0\n", 501)
)

func TestNew(t *testing.T) { assert.IsType(t, (*Client)(nil), New(socket.Config{})) }

func TestClient_GetVersion(t *testing.T) {
	client := Client{Client: &mockSocketClient{}}
	ver, err := client.Version()
	assert.NoError(t, err)
	expected := &Version{Major: 2, Minor: 3, Patch: 4, Management: 1}
	assert.Equal(t, expected, ver)
}

func TestClient_GetLoadStats(t *testing.T) {
	client := Client{Client: &mockSocketClient{}}
	stats, err := client.LoadStats()
	assert.NoError(t, err)
	expected := &LoadStats{NumOfClients: 1, BytesIn: 7811, BytesOut: 7667}
	assert.Equal(t, expected, stats)
}

func TestClient_GetUsers(t *testing.T) {
	client := Client{
		Client: &mockSocketClient{},
	}
	users, err := client.Users()
	assert.NoError(t, err)
	expected := Users{{
		CommonName:     "pepehome",
		RealAddress:    "1.2.3.4:44347",
		VirtualAddress: "10.9.0.5",
		BytesReceived:  6043,
		BytesSent:      5661,
		ConnectedSince: 1555439465,
		Username:       "pepe",
	}}
	assert.Equal(t, expected, users)
}

func TestClient_MaxLineExceeded(t *testing.T) {
	client := Client{
		Client: &mockSocketClient{maxLineExceeded: true},
	}
	_, err := client.Users()
	assert.Error(t, err)
}

type mockSocketClient struct {
	maxLineExceeded bool
}

func (m *mockSocketClient) Connect() error { return nil }

func (m *mockSocketClient) Disconnect() error { return nil }

func (m *mockSocketClient) Command(command string, process socket.Processor) error {
	var s *bufio.Scanner
	switch command {
	default:
		return fmt.Errorf("unknown command : %s", command)
	case commandExit:
	case commandVersion:
		s = bufio.NewScanner(bytes.NewReader(testVersionData))
	case commandStatus3:
		if m.maxLineExceeded {
			s = bufio.NewScanner(strings.NewReader(testMaxLinesExceededData))
			break
		}
		s = bufio.NewScanner(bytes.NewReader(testStatus3Data))
	case commandLoadStats:
		s = bufio.NewScanner(bytes.NewReader(testLoadStatsData))
	}

	for s.Scan() {
		process(s.Bytes())
	}
	return nil
}