github.com/netdata/go.d.plugin@v0.58.1/pkg/socket/client_test.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package socket 4 5 import ( 6 "crypto/tls" 7 "testing" 8 "time" 9 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 ) 13 14 const ( 15 testServerAddress = "127.0.0.1:9999" 16 testUdpServerAddress = "udp://127.0.0.1:9999" 17 testUnixServerAddress = "/tmp/testSocketFD" 18 defaultTimeout = 100 * time.Millisecond 19 ) 20 21 var tcpConfig = Config{ 22 Address: testServerAddress, 23 ConnectTimeout: defaultTimeout, 24 ReadTimeout: defaultTimeout, 25 WriteTimeout: defaultTimeout, 26 TLSConf: nil, 27 } 28 29 var udpConfig = Config{ 30 Address: testUdpServerAddress, 31 ConnectTimeout: defaultTimeout, 32 ReadTimeout: defaultTimeout, 33 WriteTimeout: defaultTimeout, 34 TLSConf: nil, 35 } 36 37 var unixConfig = Config{ 38 Address: testUnixServerAddress, 39 ConnectTimeout: defaultTimeout, 40 ReadTimeout: defaultTimeout, 41 WriteTimeout: defaultTimeout, 42 TLSConf: nil, 43 } 44 45 var tcpTlsConfig = Config{ 46 Address: testServerAddress, 47 ConnectTimeout: defaultTimeout, 48 ReadTimeout: defaultTimeout, 49 WriteTimeout: defaultTimeout, 50 TLSConf: &tls.Config{}, 51 } 52 53 func Test_clientCommand(t *testing.T) { 54 srv := &tcpServer{addr: testServerAddress, rowsNumResp: 1} 55 go func() { _ = srv.Run(); defer func() { _ = srv.Close() }() }() 56 57 time.Sleep(time.Millisecond * 100) 58 sock := New(tcpConfig) 59 require.NoError(t, sock.Connect()) 60 err := sock.Command("ping\n", func(bytes []byte) bool { 61 assert.Equal(t, "pong", string(bytes)) 62 return true 63 }) 64 require.NoError(t, sock.Disconnect()) 65 require.NoError(t, err) 66 } 67 68 func Test_clientTimeout(t *testing.T) { 69 srv := &tcpServer{addr: testServerAddress, rowsNumResp: 1} 70 go func() { _ = srv.Run() }() 71 72 time.Sleep(time.Millisecond * 100) 73 sock := New(tcpConfig) 74 require.NoError(t, sock.Connect()) 75 sock.ReadTimeout = 0 76 sock.ReadTimeout = 0 77 err := sock.Command("ping\n", func(bytes []byte) bool { 78 assert.Equal(t, "pong", string(bytes)) 79 return true 80 }) 81 require.Error(t, err) 82 } 83 84 func Test_clientIncompleteSSL(t *testing.T) { 85 srv := &tcpServer{addr: testServerAddress, rowsNumResp: 1} 86 go func() { _ = srv.Run() }() 87 88 time.Sleep(time.Millisecond * 100) 89 sock := New(tcpTlsConfig) 90 err := sock.Connect() 91 require.Error(t, err) 92 } 93 94 func Test_clientCommandStopProcessing(t *testing.T) { 95 srv := &tcpServer{addr: testServerAddress, rowsNumResp: 2} 96 go func() { _ = srv.Run() }() 97 98 time.Sleep(time.Millisecond * 100) 99 sock := New(tcpConfig) 100 require.NoError(t, sock.Connect()) 101 err := sock.Command("ping\n", func(bytes []byte) bool { 102 assert.Equal(t, "pong", string(bytes)) 103 return false 104 }) 105 require.NoError(t, sock.Disconnect()) 106 require.NoError(t, err) 107 } 108 109 func Test_clientUDPCommand(t *testing.T) { 110 srv := &udpServer{addr: testServerAddress, rowsNumResp: 1} 111 go func() { _ = srv.Run(); defer func() { _ = srv.Close() }() }() 112 113 time.Sleep(time.Millisecond * 100) 114 sock := New(udpConfig) 115 require.NoError(t, sock.Connect()) 116 err := sock.Command("ping\n", func(bytes []byte) bool { 117 assert.Equal(t, "pong", string(bytes)) 118 return false 119 }) 120 require.NoError(t, sock.Disconnect()) 121 require.NoError(t, err) 122 } 123 124 func Test_clientTCPAddress(t *testing.T) { 125 srv := &tcpServer{addr: testServerAddress, rowsNumResp: 1} 126 go func() { _ = srv.Run() }() 127 time.Sleep(time.Millisecond * 100) 128 129 sock := New(tcpConfig) 130 require.NoError(t, sock.Connect()) 131 132 tcpConfig.Address = "tcp://" + tcpConfig.Address 133 sock = New(tcpConfig) 134 require.NoError(t, sock.Connect()) 135 } 136 137 func Test_clientUnixCommand(t *testing.T) { 138 srv := &unixServer{addr: testUnixServerAddress, rowsNumResp: 1} 139 // cleanup previous file descriptors 140 _ = srv.Close() 141 go func() { _ = srv.Run() }() 142 143 time.Sleep(time.Millisecond * 200) 144 sock := New(unixConfig) 145 require.NoError(t, sock.Connect()) 146 err := sock.Command("ping\n", func(bytes []byte) bool { 147 assert.Equal(t, "pong", string(bytes)) 148 return false 149 }) 150 require.NoError(t, err) 151 require.NoError(t, sock.Disconnect()) 152 } 153 154 func Test_clientEmptyProcessFunc(t *testing.T) { 155 srv := &tcpServer{addr: testServerAddress, rowsNumResp: 1} 156 go func() { _ = srv.Run() }() 157 158 time.Sleep(time.Millisecond * 100) 159 sock := New(tcpConfig) 160 require.NoError(t, sock.Connect()) 161 err := sock.Command("ping\n", nil) 162 require.Error(t, err, "nil process func should return an error") 163 }