2017-02-02 16:24:03 +00:00
|
|
|
package socket_listener
|
|
|
|
|
|
|
|
import (
|
2018-03-09 17:44:35 +00:00
|
|
|
"bytes"
|
2018-04-18 00:02:04 +00:00
|
|
|
"crypto/tls"
|
2019-02-25 19:11:25 +00:00
|
|
|
"io"
|
2018-06-04 02:43:06 +00:00
|
|
|
"io/ioutil"
|
2018-03-09 17:44:35 +00:00
|
|
|
"log"
|
2017-02-02 16:24:03 +00:00
|
|
|
"net"
|
|
|
|
"os"
|
2018-06-04 02:43:06 +00:00
|
|
|
"path/filepath"
|
2017-02-02 16:24:03 +00:00
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
2018-10-19 18:17:18 +00:00
|
|
|
"github.com/influxdata/telegraf/internal"
|
2017-02-02 16:24:03 +00:00
|
|
|
"github.com/influxdata/telegraf/testutil"
|
2019-02-25 19:11:25 +00:00
|
|
|
"github.com/influxdata/wlog"
|
2017-02-02 16:24:03 +00:00
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
2018-05-04 23:33:23 +00:00
|
|
|
var pki = testutil.NewPKI("../../../testutil/pki")
|
|
|
|
|
2018-03-09 17:44:35 +00:00
|
|
|
// testEmptyLog is a helper function to ensure no data is written to log.
|
|
|
|
// Should be called at the start of the test, and returns a function which should run at the end.
|
|
|
|
func testEmptyLog(t *testing.T) func() {
|
|
|
|
buf := bytes.NewBuffer(nil)
|
2019-02-25 19:11:25 +00:00
|
|
|
log.SetOutput(wlog.NewWriter(buf))
|
|
|
|
|
|
|
|
level := wlog.WARN
|
|
|
|
wlog.SetLevel(level)
|
2018-03-09 17:44:35 +00:00
|
|
|
|
|
|
|
return func() {
|
|
|
|
log.SetOutput(os.Stderr)
|
2019-02-25 19:11:25 +00:00
|
|
|
|
|
|
|
for {
|
|
|
|
line, err := buf.ReadBytes('\n')
|
|
|
|
if err != nil {
|
|
|
|
assert.Equal(t, io.EOF, err)
|
|
|
|
break
|
|
|
|
}
|
|
|
|
assert.Empty(t, string(line), "log not empty")
|
|
|
|
}
|
2018-03-09 17:44:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-18 00:02:04 +00:00
|
|
|
func TestSocketListener_tcp_tls(t *testing.T) {
|
|
|
|
defer testEmptyLog(t)()
|
|
|
|
|
|
|
|
sl := newSocketListener()
|
2019-09-23 22:39:50 +00:00
|
|
|
sl.Log = testutil.Logger{}
|
2018-04-18 00:02:04 +00:00
|
|
|
sl.ServiceAddress = "tcp://127.0.0.1:0"
|
2018-05-04 23:33:23 +00:00
|
|
|
sl.ServerConfig = *pki.TLSServerConfig()
|
2018-04-18 00:02:04 +00:00
|
|
|
|
|
|
|
acc := &testutil.Accumulator{}
|
|
|
|
err := sl.Start(acc)
|
|
|
|
require.NoError(t, err)
|
|
|
|
defer sl.Stop()
|
|
|
|
|
2018-05-04 23:33:23 +00:00
|
|
|
tlsCfg, err := pki.TLSClientConfig().TLSConfig()
|
2018-04-18 00:02:04 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
secureClient, err := tls.Dial("tcp", sl.Closer.(net.Listener).Addr().String(), tlsCfg)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
testSocketListener(t, sl, secureClient)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSocketListener_unix_tls(t *testing.T) {
|
2018-06-04 02:43:06 +00:00
|
|
|
tmpdir, err := ioutil.TempDir("", "telegraf")
|
|
|
|
require.NoError(t, err)
|
|
|
|
defer os.RemoveAll(tmpdir)
|
2018-07-28 01:29:54 +00:00
|
|
|
sock := filepath.Join(tmpdir, "sl.TestSocketListener_unix_tls.sock")
|
2018-04-18 00:02:04 +00:00
|
|
|
|
|
|
|
sl := newSocketListener()
|
2019-09-23 22:39:50 +00:00
|
|
|
sl.Log = testutil.Logger{}
|
2018-06-04 02:43:06 +00:00
|
|
|
sl.ServiceAddress = "unix://" + sock
|
2018-05-04 23:33:23 +00:00
|
|
|
sl.ServerConfig = *pki.TLSServerConfig()
|
2018-04-18 00:02:04 +00:00
|
|
|
|
|
|
|
acc := &testutil.Accumulator{}
|
2018-06-04 02:43:06 +00:00
|
|
|
err = sl.Start(acc)
|
2018-04-18 00:02:04 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
defer sl.Stop()
|
|
|
|
|
2018-05-04 23:33:23 +00:00
|
|
|
tlsCfg, err := pki.TLSClientConfig().TLSConfig()
|
|
|
|
tlsCfg.InsecureSkipVerify = true
|
2018-04-18 00:02:04 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
2018-06-04 02:43:06 +00:00
|
|
|
secureClient, err := tls.Dial("unix", sock, tlsCfg)
|
2018-04-18 00:02:04 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
testSocketListener(t, sl, secureClient)
|
|
|
|
}
|
|
|
|
|
2017-02-02 16:24:03 +00:00
|
|
|
func TestSocketListener_tcp(t *testing.T) {
|
2018-03-09 17:44:35 +00:00
|
|
|
defer testEmptyLog(t)()
|
|
|
|
|
2017-02-02 16:24:03 +00:00
|
|
|
sl := newSocketListener()
|
2019-09-23 22:39:50 +00:00
|
|
|
sl.Log = testutil.Logger{}
|
2017-02-02 16:24:03 +00:00
|
|
|
sl.ServiceAddress = "tcp://127.0.0.1:0"
|
2018-10-19 18:17:18 +00:00
|
|
|
sl.ReadBufferSize = internal.Size{Size: 1024}
|
2017-02-02 16:24:03 +00:00
|
|
|
|
|
|
|
acc := &testutil.Accumulator{}
|
|
|
|
err := sl.Start(acc)
|
|
|
|
require.NoError(t, err)
|
2017-04-04 01:06:51 +00:00
|
|
|
defer sl.Stop()
|
2017-02-02 16:24:03 +00:00
|
|
|
|
|
|
|
client, err := net.Dial("tcp", sl.Closer.(net.Listener).Addr().String())
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
testSocketListener(t, sl, client)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSocketListener_udp(t *testing.T) {
|
2018-03-09 17:44:35 +00:00
|
|
|
defer testEmptyLog(t)()
|
|
|
|
|
2017-02-02 16:24:03 +00:00
|
|
|
sl := newSocketListener()
|
2019-09-23 22:39:50 +00:00
|
|
|
sl.Log = testutil.Logger{}
|
2017-02-02 16:24:03 +00:00
|
|
|
sl.ServiceAddress = "udp://127.0.0.1:0"
|
2018-10-19 18:17:18 +00:00
|
|
|
sl.ReadBufferSize = internal.Size{Size: 1024}
|
2017-02-02 16:24:03 +00:00
|
|
|
|
|
|
|
acc := &testutil.Accumulator{}
|
|
|
|
err := sl.Start(acc)
|
|
|
|
require.NoError(t, err)
|
2017-04-04 01:06:51 +00:00
|
|
|
defer sl.Stop()
|
2017-02-02 16:24:03 +00:00
|
|
|
|
|
|
|
client, err := net.Dial("udp", sl.Closer.(net.PacketConn).LocalAddr().String())
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
testSocketListener(t, sl, client)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSocketListener_unix(t *testing.T) {
|
2018-06-04 02:43:06 +00:00
|
|
|
tmpdir, err := ioutil.TempDir("", "telegraf")
|
|
|
|
require.NoError(t, err)
|
|
|
|
defer os.RemoveAll(tmpdir)
|
2018-07-28 01:29:54 +00:00
|
|
|
sock := filepath.Join(tmpdir, "sl.TestSocketListener_unix.sock")
|
2018-06-04 02:43:06 +00:00
|
|
|
|
2018-03-09 17:44:35 +00:00
|
|
|
defer testEmptyLog(t)()
|
|
|
|
|
2018-06-04 02:43:06 +00:00
|
|
|
os.Create(sock)
|
2017-02-02 16:24:03 +00:00
|
|
|
sl := newSocketListener()
|
2019-09-23 22:39:50 +00:00
|
|
|
sl.Log = testutil.Logger{}
|
2018-06-04 02:43:06 +00:00
|
|
|
sl.ServiceAddress = "unix://" + sock
|
2018-10-19 18:17:18 +00:00
|
|
|
sl.ReadBufferSize = internal.Size{Size: 1024}
|
2017-02-02 16:24:03 +00:00
|
|
|
|
|
|
|
acc := &testutil.Accumulator{}
|
2018-06-04 02:43:06 +00:00
|
|
|
err = sl.Start(acc)
|
2017-02-02 16:24:03 +00:00
|
|
|
require.NoError(t, err)
|
2017-04-04 01:06:51 +00:00
|
|
|
defer sl.Stop()
|
2017-02-02 16:24:03 +00:00
|
|
|
|
2018-06-04 02:43:06 +00:00
|
|
|
client, err := net.Dial("unix", sock)
|
2017-02-02 16:24:03 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
testSocketListener(t, sl, client)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSocketListener_unixgram(t *testing.T) {
|
2018-06-04 02:43:06 +00:00
|
|
|
tmpdir, err := ioutil.TempDir("", "telegraf")
|
|
|
|
require.NoError(t, err)
|
|
|
|
defer os.RemoveAll(tmpdir)
|
2018-07-28 01:29:54 +00:00
|
|
|
sock := filepath.Join(tmpdir, "sl.TestSocketListener_unixgram.sock")
|
2018-06-04 02:43:06 +00:00
|
|
|
|
2018-03-09 17:44:35 +00:00
|
|
|
defer testEmptyLog(t)()
|
|
|
|
|
2018-06-04 02:43:06 +00:00
|
|
|
os.Create(sock)
|
2017-02-02 16:24:03 +00:00
|
|
|
sl := newSocketListener()
|
2019-09-23 22:39:50 +00:00
|
|
|
sl.Log = testutil.Logger{}
|
2018-06-04 02:43:06 +00:00
|
|
|
sl.ServiceAddress = "unixgram://" + sock
|
2018-10-19 18:17:18 +00:00
|
|
|
sl.ReadBufferSize = internal.Size{Size: 1024}
|
2017-02-02 16:24:03 +00:00
|
|
|
|
|
|
|
acc := &testutil.Accumulator{}
|
2018-06-04 02:43:06 +00:00
|
|
|
err = sl.Start(acc)
|
2017-02-02 16:24:03 +00:00
|
|
|
require.NoError(t, err)
|
2017-04-04 01:06:51 +00:00
|
|
|
defer sl.Stop()
|
2017-02-02 16:24:03 +00:00
|
|
|
|
2018-06-04 02:43:06 +00:00
|
|
|
client, err := net.Dial("unixgram", sock)
|
2017-02-02 16:24:03 +00:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
testSocketListener(t, sl, client)
|
|
|
|
}
|
|
|
|
|
2019-11-22 02:11:17 +00:00
|
|
|
func TestSocketListenerDecode_tcp(t *testing.T) {
|
|
|
|
defer testEmptyLog(t)()
|
|
|
|
|
|
|
|
sl := newSocketListener()
|
|
|
|
sl.Log = testutil.Logger{}
|
|
|
|
sl.ServiceAddress = "tcp://127.0.0.1:0"
|
|
|
|
sl.ReadBufferSize = internal.Size{Size: 1024}
|
|
|
|
sl.ContentEncoding = "gzip"
|
|
|
|
|
|
|
|
acc := &testutil.Accumulator{}
|
|
|
|
err := sl.Start(acc)
|
|
|
|
require.NoError(t, err)
|
|
|
|
defer sl.Stop()
|
|
|
|
|
|
|
|
client, err := net.Dial("tcp", sl.Closer.(net.Listener).Addr().String())
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
testSocketListener(t, sl, client)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestSocketListenerDecode_udp(t *testing.T) {
|
|
|
|
defer testEmptyLog(t)()
|
|
|
|
|
|
|
|
sl := newSocketListener()
|
|
|
|
sl.Log = testutil.Logger{}
|
|
|
|
sl.ServiceAddress = "udp://127.0.0.1:0"
|
|
|
|
sl.ReadBufferSize = internal.Size{Size: 1024}
|
|
|
|
sl.ContentEncoding = "gzip"
|
|
|
|
|
|
|
|
acc := &testutil.Accumulator{}
|
|
|
|
err := sl.Start(acc)
|
|
|
|
require.NoError(t, err)
|
|
|
|
defer sl.Stop()
|
|
|
|
|
|
|
|
client, err := net.Dial("udp", sl.Closer.(net.PacketConn).LocalAddr().String())
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
testSocketListener(t, sl, client)
|
|
|
|
}
|
|
|
|
|
2017-02-02 16:24:03 +00:00
|
|
|
func testSocketListener(t *testing.T, sl *SocketListener, client net.Conn) {
|
2019-11-22 02:11:17 +00:00
|
|
|
mstr12 := []byte("test,foo=bar v=1i 123456789\ntest,foo=baz v=2i 123456790\n")
|
|
|
|
mstr3 := []byte("test,foo=zab v=3i 123456791")
|
|
|
|
|
|
|
|
if sl.ContentEncoding == "gzip" {
|
|
|
|
encoder, err := internal.NewContentEncoder(sl.ContentEncoding)
|
|
|
|
require.NoError(t, err)
|
|
|
|
mstr12, err = encoder.Encode(mstr12)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
encoder, err = internal.NewContentEncoder(sl.ContentEncoding)
|
|
|
|
require.NoError(t, err)
|
|
|
|
mstr3, err = encoder.Encode(mstr3)
|
|
|
|
require.NoError(t, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
client.Write(mstr12)
|
|
|
|
client.Write(mstr3)
|
|
|
|
if client.LocalAddr().Network() != "udp" {
|
2017-02-02 16:24:03 +00:00
|
|
|
// stream connection. needs trailing newline to terminate mstr3
|
|
|
|
client.Write([]byte{'\n'})
|
|
|
|
}
|
|
|
|
|
|
|
|
acc := sl.Accumulator.(*testutil.Accumulator)
|
|
|
|
|
2017-03-24 19:03:36 +00:00
|
|
|
acc.Wait(3)
|
2017-02-02 16:24:03 +00:00
|
|
|
acc.Lock()
|
2017-03-24 19:03:36 +00:00
|
|
|
m1 := acc.Metrics[0]
|
|
|
|
m2 := acc.Metrics[1]
|
|
|
|
m3 := acc.Metrics[2]
|
2017-02-02 16:24:03 +00:00
|
|
|
acc.Unlock()
|
|
|
|
|
2017-03-24 19:03:36 +00:00
|
|
|
assert.Equal(t, "test", m1.Measurement)
|
|
|
|
assert.Equal(t, map[string]string{"foo": "bar"}, m1.Tags)
|
|
|
|
assert.Equal(t, map[string]interface{}{"v": int64(1)}, m1.Fields)
|
|
|
|
assert.True(t, time.Unix(0, 123456789).Equal(m1.Time))
|
2017-02-02 16:24:03 +00:00
|
|
|
|
2017-03-24 19:03:36 +00:00
|
|
|
assert.Equal(t, "test", m2.Measurement)
|
|
|
|
assert.Equal(t, map[string]string{"foo": "baz"}, m2.Tags)
|
|
|
|
assert.Equal(t, map[string]interface{}{"v": int64(2)}, m2.Fields)
|
|
|
|
assert.True(t, time.Unix(0, 123456790).Equal(m2.Time))
|
2017-02-02 16:24:03 +00:00
|
|
|
|
2017-03-24 19:03:36 +00:00
|
|
|
assert.Equal(t, "test", m3.Measurement)
|
|
|
|
assert.Equal(t, map[string]string{"foo": "zab"}, m3.Tags)
|
|
|
|
assert.Equal(t, map[string]interface{}{"v": int64(3)}, m3.Fields)
|
|
|
|
assert.True(t, time.Unix(0, 123456791).Equal(m3.Time))
|
2017-02-02 16:24:03 +00:00
|
|
|
}
|