github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/clients/pkg/promtail/targets/syslog/syslogparser/syslogparser_test.go (about) 1 package syslogparser_test 2 3 import ( 4 "io" 5 "strings" 6 "testing" 7 8 "github.com/influxdata/go-syslog/v3" 9 "github.com/influxdata/go-syslog/v3/rfc5424" 10 "github.com/stretchr/testify/require" 11 12 "github.com/grafana/loki/clients/pkg/promtail/targets/syslog/syslogparser" 13 ) 14 15 var ( 16 defaultMaxMessageLength = 8192 17 ) 18 19 func TestParseStream_OctetCounting(t *testing.T) { 20 r := strings.NewReader("23 <13>1 - - - - - - First24 <13>1 - - - - - - Second") 21 22 results := make([]*syslog.Result, 0) 23 cb := func(res *syslog.Result) { 24 results = append(results, res) 25 } 26 27 err := syslogparser.ParseStream(r, cb, defaultMaxMessageLength) 28 require.NoError(t, err) 29 30 require.Equal(t, 2, len(results)) 31 require.NoError(t, results[0].Error) 32 require.Equal(t, "First", *results[0].Message.(*rfc5424.SyslogMessage).Message) 33 require.NoError(t, results[1].Error) 34 require.Equal(t, "Second", *results[1].Message.(*rfc5424.SyslogMessage).Message) 35 } 36 37 func TestParseStream_ValidParseError(t *testing.T) { 38 // This message can not parse fully but is valid when using the BestEffort Parser Option. 39 r := strings.NewReader("17 <13>1 First") 40 41 results := make([]*syslog.Result, 0) 42 cb := func(res *syslog.Result) { 43 results = append(results, res) 44 } 45 46 err := syslogparser.ParseStream(r, cb, defaultMaxMessageLength) 47 require.NoError(t, err) 48 49 require.Equal(t, 1, len(results)) 50 require.EqualError(t, results[0].Error, "expecting a RFC3339MICRO timestamp or a nil value [col 6]") 51 require.True(t, results[0].Message.(*rfc5424.SyslogMessage).Valid()) 52 } 53 54 func TestParseStream_OctetCounting_LongMessage(t *testing.T) { 55 r := strings.NewReader("8198 <13>1 - - - - - - First") 56 57 results := make([]*syslog.Result, 0) 58 cb := func(res *syslog.Result) { 59 results = append(results, res) 60 } 61 62 err := syslogparser.ParseStream(r, cb, defaultMaxMessageLength) 63 require.NoError(t, err) 64 65 require.Equal(t, 1, len(results)) 66 require.EqualError(t, results[0].Error, "message too long to parse. was size 8198, max length 8192") 67 } 68 69 func TestParseStream_NewlineSeparated(t *testing.T) { 70 r := strings.NewReader("<13>1 - - - - - - First\n<13>1 - - - - - - Second\n") 71 72 results := make([]*syslog.Result, 0) 73 cb := func(res *syslog.Result) { 74 results = append(results, res) 75 } 76 77 err := syslogparser.ParseStream(r, cb, defaultMaxMessageLength) 78 require.NoError(t, err) 79 80 require.Equal(t, 2, len(results)) 81 require.NoError(t, results[0].Error) 82 require.Equal(t, "First", *results[0].Message.(*rfc5424.SyslogMessage).Message) 83 require.NoError(t, results[1].Error) 84 require.Equal(t, "Second", *results[1].Message.(*rfc5424.SyslogMessage).Message) 85 } 86 87 func TestParseStream_InvalidStream(t *testing.T) { 88 r := strings.NewReader("invalid") 89 90 err := syslogparser.ParseStream(r, func(res *syslog.Result) {}, defaultMaxMessageLength) 91 require.EqualError(t, err, "invalid or unsupported framing. first byte: 'i'") 92 } 93 94 func TestParseStream_EmptyStream(t *testing.T) { 95 r := strings.NewReader("") 96 97 err := syslogparser.ParseStream(r, func(res *syslog.Result) {}, defaultMaxMessageLength) 98 require.Equal(t, err, io.EOF) 99 }