github.com/mongodb/grip@v0.0.0-20240213223901-f906268d82b9/send/writer_test.go (about)

     1  package send
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/mongodb/grip/level"
     7  	"github.com/stretchr/testify/assert"
     8  	"github.com/stretchr/testify/require"
     9  )
    10  
    11  func TestSenderWriter(t *testing.T) {
    12  	assert := assert.New(t)
    13  	require := require.New(t)
    14  
    15  	sink, err := NewInternalLogger("sink", LevelInfo{level.Debug, level.Debug})
    16  	assert.NoError(err)
    17  
    18  	ws := NewWriterSender(sink)
    19  	assert.Equal(ws.buffer.Len(), 0)
    20  
    21  	// writing something without a new line character will cause it to not send.
    22  	msg := []byte("hello world")
    23  	n, err := ws.Write(msg)
    24  	assert.NoError(err)
    25  	assert.Equal(n, len(msg))
    26  	assert.Equal(ws.buffer.Len(), n)
    27  	assert.False(sink.HasMessage())
    28  
    29  	newLine := []byte{'\n'}
    30  	// if we add a new line character, then it'll flush
    31  	n, err = ws.Write(newLine)
    32  	assert.NoError(err)
    33  	assert.Equal(n, len(newLine))
    34  	assert.Equal(ws.buffer.Len(), 12)
    35  
    36  	assert.NoError(ws.doSend())
    37  
    38  	require.True(sink.HasMessage())
    39  	m := sink.GetMessage()
    40  	assert.True(m.Logged)
    41  	assert.Equal(m.Message.String(), "hello world")
    42  	// the above trimmed the final new line off, which is correct,
    43  	// given how senders will actually newline deelimit messages anyway.
    44  	//
    45  	// at the same time, we should make sure that we preserve newlines internally
    46  	msg = []byte("hello world\nhello grip\n")
    47  	n, err = ws.Write(msg)
    48  	assert.NoError(err)
    49  	assert.Equal(n, len(msg))
    50  	assert.Equal(ws.buffer.Len(), len(msg))
    51  
    52  	assert.NoError(ws.doSend())
    53  
    54  	assert.True(sink.HasMessage())
    55  	assert.Equal(sink.Len(), 2)
    56  	m = sink.GetMessage()
    57  	m2 := sink.GetMessage()
    58  	assert.True(m.Logged)
    59  	assert.True(m2.Logged)
    60  	assert.Equal(m.Message.String(), "hello world")
    61  	assert.Equal(m2.Message.String(), "hello grip")
    62  
    63  	// send a message, but no new line, means it lives in the buffer.
    64  	msg = []byte("hello world")
    65  	n, err = ws.Write(msg)
    66  	assert.NoError(err)
    67  	assert.Equal(n, len(msg))
    68  	assert.Equal(ws.buffer.Len(), n)
    69  	assert.False(sink.HasMessage())
    70  
    71  	assert.NotEqual(ws.buffer.Len(), 0)
    72  	assert.NoError(ws.Close())
    73  	assert.True(sink.HasMessage())
    74  	m = sink.GetMessage()
    75  	assert.True(m.Logged)
    76  	assert.Equal(m.Message.String(), "hello world")
    77  	numMessages := sink.Len()
    78  	assert.Equal(ws.buffer.Len(), 0)
    79  	assert.Equal(numMessages, sink.Len())
    80  
    81  	for i := 0; i < 10; i++ {
    82  		assert.NoError(ws.Close())
    83  		assert.False(sink.GetMessage().Logged)
    84  	}
    85  
    86  	assert.Equal(ws.buffer.Len(), 0)
    87  }