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 }