assume we receive logs by lines and don't ignore those without EOL

Signed-off-by: Nicolas De Loof <nicolas.deloof@gmail.com>
This commit is contained in:
Nicolas De Loof 2023-06-06 16:52:31 +02:00 committed by Nicolas De loof
parent e21a8d6293
commit 4bf2fe9fed
3 changed files with 27 additions and 13 deletions

View File

@ -71,9 +71,9 @@ func TestComposeService_Logs_Demux(t *testing.T) {
c1Stdout := stdcopy.NewStdWriter(c1Writer, stdcopy.Stdout) c1Stdout := stdcopy.NewStdWriter(c1Writer, stdcopy.Stdout)
c1Stderr := stdcopy.NewStdWriter(c1Writer, stdcopy.Stderr) c1Stderr := stdcopy.NewStdWriter(c1Writer, stdcopy.Stderr)
go func() { go func() {
_, err := c1Stdout.Write([]byte("hello stdout\n")) _, err := c1Stdout.Write([]byte("hello\n stdout"))
assert.NoError(t, err, "Writing to fake stdout") assert.NoError(t, err, "Writing to fake stdout")
_, err = c1Stderr.Write([]byte("hello stderr\n")) _, err = c1Stderr.Write([]byte("hello\n stderr"))
assert.NoError(t, err, "Writing to fake stderr") assert.NoError(t, err, "Writing to fake stderr")
_ = c1Writer.Close() _ = c1Writer.Close()
}() }()
@ -94,7 +94,7 @@ func TestComposeService_Logs_Demux(t *testing.T) {
require.Equal( require.Equal(
t, t,
[]string{"hello stdout", "hello stderr"}, []string{"hello", " stdout", "hello", " stderr"},
consumer.LogsForContainer("c"), consumer.LogsForContainer("c"),
) )
} }

View File

@ -43,11 +43,17 @@ func (s *splitWriter) Write(b []byte) (int, error) {
for { for {
b = s.buffer.Bytes() b = s.buffer.Bytes()
index := bytes.Index(b, []byte{'\n'}) index := bytes.Index(b, []byte{'\n'})
if index < 0 { if index > 0 {
line := s.buffer.Next(index + 1)
s.consumer(string(line[:len(line)-1]))
} else {
line := s.buffer.String()
s.buffer.Reset()
if len(line) > 0 {
s.consumer(line)
}
break break
} }
line := s.buffer.Next(index + 1)
s.consumer(string(line[:len(line)-1]))
} }
return n, nil return n, nil
} }

View File

@ -28,13 +28,21 @@ func TestSplitWriter(t *testing.T) {
w := GetWriter(func(line string) { w := GetWriter(func(line string) {
lines = append(lines, line) lines = append(lines, line)
}) })
w.Write([]byte("h")) w.Write([]byte("hello\n"))
w.Write([]byte("e")) w.Write([]byte("world\n"))
w.Write([]byte("l")) w.Write([]byte("!"))
w.Write([]byte("l")) assert.DeepEqual(t, lines, []string{"hello", "world", "!"})
w.Write([]byte("o"))
w.Write([]byte("\n")) }
w.Write([]byte("world!\n"))
//nolint:errcheck
func TestSplitWriterNoEOL(t *testing.T) {
var lines []string
w := GetWriter(func(line string) {
lines = append(lines, line)
})
w.Write([]byte("hello\n"))
w.Write([]byte("world!"))
assert.DeepEqual(t, lines, []string{"hello", "world!"}) assert.DeepEqual(t, lines, []string{"hello", "world!"})
} }