Browse Source

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

Signed-off-by: Nicolas De Loof <[email protected]>
Nicolas De Loof 2 years ago
parent
commit
4bf2fe9fed
3 changed files with 27 additions and 13 deletions
  1. 3 3
      pkg/compose/logs_test.go
  2. 9 3
      pkg/utils/writer.go
  3. 15 7
      pkg/utils/writer_test.go

+ 3 - 3
pkg/compose/logs_test.go

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

+ 9 - 3
pkg/utils/writer.go

@@ -43,11 +43,17 @@ func (s *splitWriter) Write(b []byte) (int, error) {
 	for {
 		b = s.buffer.Bytes()
 		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
 		}
-		line := s.buffer.Next(index + 1)
-		s.consumer(string(line[:len(line)-1]))
 	}
 	return n, nil
 }

+ 15 - 7
pkg/utils/writer_test.go

@@ -28,13 +28,21 @@ func TestSplitWriter(t *testing.T) {
 	w := GetWriter(func(line string) {
 		lines = append(lines, line)
 	})
-	w.Write([]byte("h"))
-	w.Write([]byte("e"))
-	w.Write([]byte("l"))
-	w.Write([]byte("l"))
-	w.Write([]byte("o"))
-	w.Write([]byte("\n"))
-	w.Write([]byte("world!\n"))
+	w.Write([]byte("hello\n"))
+	w.Write([]byte("world\n"))
+	w.Write([]byte("!"))
+	assert.DeepEqual(t, lines, []string{"hello", "world", "!"})
+
+}
+
+//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!"})
 
 }