Files
dozzle/internal/docker/log_reader_test.go
T

85 lines
2.5 KiB
Go

package docker
import (
"bytes"
"encoding/binary"
"io"
"strings"
"testing"
"github.com/amir20/dozzle/internal/container"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func writeFrame(buf *bytes.Buffer, streamType byte, payload string) {
header := make([]byte, 8)
header[0] = streamType
binary.BigEndian.PutUint32(header[4:], uint32(len(payload)))
buf.Write(header)
buf.WriteString(payload)
}
func TestRead_multiplexed(t *testing.T) {
buf := &bytes.Buffer{}
writeFrame(buf, 1, "2024-01-01T00:00:00.000000000Z out\n")
writeFrame(buf, 2, "2024-01-01T00:00:01.000000000Z err\n")
reader := NewLogReader(buf, false)
message, std, err := reader.Read()
require.NoError(t, err)
assert.Equal(t, "2024-01-01T00:00:00.000000000Z out\n", message)
assert.Equal(t, container.STDOUT, std)
message, std, err = reader.Read()
require.NoError(t, err)
assert.Equal(t, "2024-01-01T00:00:01.000000000Z err\n", message)
assert.Equal(t, container.STDERR, std)
_, _, err = reader.Read()
assert.Equal(t, io.EOF, err)
}
func TestRead_lastLineWithoutNewline(t *testing.T) {
buf := &bytes.Buffer{}
writeFrame(buf, 1, "2024-01-01T00:00:00.000000000Z first\n")
writeFrame(buf, 1, "2024-01-01T00:00:01.000000000Z last line without newline")
reader := NewLogReader(buf, false)
message, _, err := reader.Read()
require.NoError(t, err)
assert.Equal(t, "2024-01-01T00:00:00.000000000Z first\n", message)
message, std, err := reader.Read()
assert.Equal(t, io.EOF, err)
assert.Equal(t, container.STDOUT, std)
assert.Equal(t, "2024-01-01T00:00:01.000000000Z last line without newline", message)
}
func TestRead_lastLineWithoutNewlineTTY(t *testing.T) {
input := "2024-01-01T00:00:00.000000000Z first\n2024-01-01T00:00:01.000000000Z last line without newline"
reader := NewLogReader(strings.NewReader(input), true)
message, _, err := reader.Read()
require.NoError(t, err)
assert.Equal(t, "2024-01-01T00:00:00.000000000Z first\n", message)
message, _, err = reader.Read()
assert.Equal(t, io.EOF, err)
assert.Equal(t, "2024-01-01T00:00:01.000000000Z last line without newline", message)
}
func TestRead_continuedFrames(t *testing.T) {
buf := &bytes.Buffer{}
writeFrame(buf, 1, "2024-01-01T00:00:00.000000000Z part one ")
writeFrame(buf, 1, "2024-01-01T00:00:00.000000000Z and part two\n")
reader := NewLogReader(buf, false)
message, _, err := reader.Read()
require.NoError(t, err)
assert.Equal(t, "2024-01-01T00:00:00.000000000Z part one and part two\n", message)
}