mirror of https://github.com/containers/podman.git
137 lines
4.1 KiB
Go
137 lines
4.1 KiB
Go
package logs
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
var logTime time.Time
|
|
|
|
func init() {
|
|
logTime, _ = time.Parse(LogTimeFormat, "2023-08-07T19:56:34.223758260-06:00")
|
|
}
|
|
|
|
func makeTestLogLine(typ, msg string) *LogLine {
|
|
return &LogLine{
|
|
Device: "stdout",
|
|
ParseLogType: typ,
|
|
Msg: msg,
|
|
Time: logTime,
|
|
}
|
|
}
|
|
|
|
func TestGetTailLog(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
fileContent string
|
|
tail int
|
|
want []*LogLine
|
|
}{
|
|
{
|
|
name: "simple tail",
|
|
fileContent: `2023-08-07T19:56:34.223758260-06:00 stdout F line1
|
|
2023-08-07T19:56:34.223758260-06:00 stdout F line2
|
|
2023-08-07T19:56:34.223758260-06:00 stdout F line3
|
|
`,
|
|
tail: 2,
|
|
want: []*LogLine{makeTestLogLine("F", "line2"), makeTestLogLine("F", "line3")},
|
|
},
|
|
{
|
|
name: "simple tail with more tail than lines",
|
|
fileContent: `2023-08-07T19:56:34.223758260-06:00 stdout F line1
|
|
2023-08-07T19:56:34.223758260-06:00 stdout F line2
|
|
2023-08-07T19:56:34.223758260-06:00 stdout F line3
|
|
`,
|
|
tail: 10,
|
|
want: []*LogLine{makeTestLogLine("F", "line1"), makeTestLogLine("F", "line2"), makeTestLogLine("F", "line3")},
|
|
},
|
|
{
|
|
name: "tail with partial logs",
|
|
fileContent: `2023-08-07T19:56:34.223758260-06:00 stdout F line1
|
|
2023-08-07T19:56:34.223758260-06:00 stdout P lin
|
|
2023-08-07T19:56:34.223758260-06:00 stdout F e2
|
|
2023-08-07T19:56:34.223758260-06:00 stdout F line3
|
|
`,
|
|
tail: 2,
|
|
want: []*LogLine{makeTestLogLine("P", "lin"), makeTestLogLine("F", "e2"), makeTestLogLine("F", "line3")},
|
|
},
|
|
{
|
|
name: "tail with partial logs and more than lines",
|
|
fileContent: `2023-08-07T19:56:34.223758260-06:00 stdout F line1
|
|
2023-08-07T19:56:34.223758260-06:00 stdout P lin
|
|
2023-08-07T19:56:34.223758260-06:00 stdout F e2
|
|
2023-08-07T19:56:34.223758260-06:00 stdout F line3
|
|
`,
|
|
tail: 10,
|
|
want: []*LogLine{makeTestLogLine("F", "line1"), makeTestLogLine("P", "lin"), makeTestLogLine("F", "e2"), makeTestLogLine("F", "line3")},
|
|
},
|
|
{
|
|
name: "multiple partial lines in a row",
|
|
fileContent: `2023-08-07T19:56:34.223758260-06:00 stdout F line1
|
|
2023-08-07T19:56:34.223758260-06:00 stdout P l
|
|
2023-08-07T19:56:34.223758260-06:00 stdout P i
|
|
2023-08-07T19:56:34.223758260-06:00 stdout P n
|
|
2023-08-07T19:56:34.223758260-06:00 stdout P e
|
|
2023-08-07T19:56:34.223758260-06:00 stdout F 2
|
|
2023-08-07T19:56:34.223758260-06:00 stdout F line3
|
|
`,
|
|
tail: 2,
|
|
want: []*LogLine{makeTestLogLine("P", "l"), makeTestLogLine("P", "i"), makeTestLogLine("P", "n"),
|
|
makeTestLogLine("P", "e"), makeTestLogLine("F", "2"), makeTestLogLine("F", "line3")},
|
|
},
|
|
{
|
|
name: "partial line at the end",
|
|
fileContent: `2023-08-07T19:56:34.223758260-06:00 stdout F line1
|
|
2023-08-07T19:56:34.223758260-06:00 stdout P lin
|
|
`,
|
|
tail: 1,
|
|
want: []*LogLine{makeTestLogLine("P", "lin")},
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
dir := t.TempDir()
|
|
file := filepath.Join(dir, "log")
|
|
f, err := os.Create(file)
|
|
assert.NoError(t, err, "create log file")
|
|
_, err = f.WriteString(tt.fileContent)
|
|
assert.NoError(t, err, "write log file")
|
|
f.Close()
|
|
got, err := getTailLog(file, tt.tail)
|
|
assert.NoError(t, err, "getTailLog()")
|
|
assert.Equal(t, tt.want, got, "log lines")
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestGetTailLogBigFiles(t *testing.T) {
|
|
dir := t.TempDir()
|
|
file := filepath.Join(dir, "log")
|
|
f, err := os.Create(file)
|
|
assert.NoError(t, err, "create log file")
|
|
want := make([]*LogLine, 0, 2000)
|
|
for i := 0; i < 1000; i++ {
|
|
_, err = f.WriteString(`2023-08-07T19:56:34.223758260-06:00 stdout P lin
|
|
2023-08-07T19:56:34.223758260-06:00 stdout F e2
|
|
`)
|
|
assert.NoError(t, err, "write log file")
|
|
want = append(want, makeTestLogLine("P", "lin"), makeTestLogLine("F", "e2"))
|
|
}
|
|
f.Close()
|
|
|
|
// try a big tail greater than the lines
|
|
got, err := getTailLog(file, 5000)
|
|
assert.NoError(t, err, "getTailLog()")
|
|
assert.Equal(t, want, got, "all log lines")
|
|
|
|
// try a smaller than lines tail
|
|
got, err = getTailLog(file, 100)
|
|
assert.NoError(t, err, "getTailLog()")
|
|
// this will return the last 200 lines because of partial + full and we only count full lines for tail.
|
|
assert.Equal(t, want[1800:2000], got, "tail 100 log lines")
|
|
}
|