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  }