github.com/netdata/go.d.plugin@v0.58.1/modules/openvpn/client/client_test.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package client
     4  
     5  import (
     6  	"bufio"
     7  	"bytes"
     8  	"fmt"
     9  	"os"
    10  	"strings"
    11  	"testing"
    12  
    13  	"github.com/netdata/go.d.plugin/pkg/socket"
    14  	"github.com/stretchr/testify/assert"
    15  )
    16  
    17  var (
    18  	testLoadStatsData, _     = os.ReadFile("testdata/load-stats.txt")
    19  	testVersionData, _       = os.ReadFile("testdata/version.txt")
    20  	testStatus3Data, _       = os.ReadFile("testdata/status3.txt")
    21  	testMaxLinesExceededData = strings.Repeat(">CLIENT:ESTABLISHED,0\n", 501)
    22  )
    23  
    24  func TestNew(t *testing.T) { assert.IsType(t, (*Client)(nil), New(socket.Config{})) }
    25  
    26  func TestClient_GetVersion(t *testing.T) {
    27  	client := Client{Client: &mockSocketClient{}}
    28  	ver, err := client.Version()
    29  	assert.NoError(t, err)
    30  	expected := &Version{Major: 2, Minor: 3, Patch: 4, Management: 1}
    31  	assert.Equal(t, expected, ver)
    32  }
    33  
    34  func TestClient_GetLoadStats(t *testing.T) {
    35  	client := Client{Client: &mockSocketClient{}}
    36  	stats, err := client.LoadStats()
    37  	assert.NoError(t, err)
    38  	expected := &LoadStats{NumOfClients: 1, BytesIn: 7811, BytesOut: 7667}
    39  	assert.Equal(t, expected, stats)
    40  }
    41  
    42  func TestClient_GetUsers(t *testing.T) {
    43  	client := Client{
    44  		Client: &mockSocketClient{},
    45  	}
    46  	users, err := client.Users()
    47  	assert.NoError(t, err)
    48  	expected := Users{{
    49  		CommonName:     "pepehome",
    50  		RealAddress:    "1.2.3.4:44347",
    51  		VirtualAddress: "10.9.0.5",
    52  		BytesReceived:  6043,
    53  		BytesSent:      5661,
    54  		ConnectedSince: 1555439465,
    55  		Username:       "pepe",
    56  	}}
    57  	assert.Equal(t, expected, users)
    58  }
    59  
    60  func TestClient_MaxLineExceeded(t *testing.T) {
    61  	client := Client{
    62  		Client: &mockSocketClient{maxLineExceeded: true},
    63  	}
    64  	_, err := client.Users()
    65  	assert.Error(t, err)
    66  }
    67  
    68  type mockSocketClient struct {
    69  	maxLineExceeded bool
    70  }
    71  
    72  func (m *mockSocketClient) Connect() error { return nil }
    73  
    74  func (m *mockSocketClient) Disconnect() error { return nil }
    75  
    76  func (m *mockSocketClient) Command(command string, process socket.Processor) error {
    77  	var s *bufio.Scanner
    78  	switch command {
    79  	default:
    80  		return fmt.Errorf("unknown command : %s", command)
    81  	case commandExit:
    82  	case commandVersion:
    83  		s = bufio.NewScanner(bytes.NewReader(testVersionData))
    84  	case commandStatus3:
    85  		if m.maxLineExceeded {
    86  			s = bufio.NewScanner(strings.NewReader(testMaxLinesExceededData))
    87  			break
    88  		}
    89  		s = bufio.NewScanner(bytes.NewReader(testStatus3Data))
    90  	case commandLoadStats:
    91  		s = bufio.NewScanner(bytes.NewReader(testLoadStatsData))
    92  	}
    93  
    94  	for s.Scan() {
    95  		process(s.Bytes())
    96  	}
    97  	return nil
    98  }