Skip to content

Commit 77e2d18

Browse files
authored
fix: long lines (#20)
1 parent 95faae7 commit 77e2d18

File tree

3 files changed

+59
-10
lines changed

3 files changed

+59
-10
lines changed

internal/app/app_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package app_test
22

33
import (
4+
"errors"
45
"os"
56
"strings"
67
"testing"
@@ -199,6 +200,21 @@ func TestAppViewResized(t *testing.T) {
199200
}
200201
}
201202

203+
func TestAppViewError(t *testing.T) {
204+
t.Parallel()
205+
206+
appModel := newTestModel(t, assets.ExampleJSONLog())
207+
208+
// nolint: goerr113 // It is a test.
209+
errMsg := errors.New("error description")
210+
211+
appModel, _ = toAppModel(appModel.Update(errMsg))
212+
assert.True(t, appModel.IsErrorShown())
213+
214+
rendered := appModel.View()
215+
assert.Contains(t, rendered, errMsg.Error())
216+
}
217+
202218
func newTestModel(tb testing.TB, content []byte) app.Model {
203219
tb.Helper()
204220

internal/pkg/source/source.go

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,18 @@ import (
44
"bufio"
55
"bytes"
66
"fmt"
7+
"io"
78
"os"
89

910
tea "github.com/charmbracelet/bubbletea"
1011
)
1112

13+
const (
14+
maxLineSize = 8 * 1024 * 1024
15+
16+
logEntriesEstimateNumber = 256
17+
)
18+
1219
// LoadLogsFromFile loads json log entries from file.
1320
func LoadLogsFromFile(path string) func() tea.Msg {
1421
return func() (msg tea.Msg) {
@@ -19,22 +26,33 @@ func LoadLogsFromFile(path string) func() tea.Msg {
1926

2027
defer file.Close()
2128

22-
scanner := bufio.NewScanner(file)
29+
logEntries, err := parseLogEntriesFromReader(file)
30+
if err != nil {
31+
return fmt.Errorf("parsing from reader: %w", err)
32+
}
2333

24-
logEntries := make(LogEntries, 0, 256)
34+
return logEntries.Reverse()
35+
}
36+
}
2537

26-
for scanner.Scan() {
27-
line := scanner.Bytes()
38+
func parseLogEntriesFromReader(reader io.Reader) (LogEntries, error) {
39+
bufReader := bufio.NewReaderSize(reader, maxLineSize)
40+
logEntries := make(LogEntries, 0, logEntriesEstimateNumber)
2841

29-
if len(bytes.TrimSpace(line)) > 0 {
30-
logEntries = append(logEntries, ParseLogEntry(line))
42+
for {
43+
line, _, err := bufReader.ReadLine()
44+
if err != nil {
45+
if err == io.EOF {
46+
break
3147
}
32-
}
3348

34-
if err := scanner.Err(); err != nil {
35-
return fmt.Errorf("scanning: %w", err)
49+
return nil, fmt.Errorf("reading line: %w", err)
3650
}
3751

38-
return logEntries.Reverse()
52+
if len(bytes.TrimSpace(line)) > 0 {
53+
logEntries = append(logEntries, ParseLogEntry(line))
54+
}
3955
}
56+
57+
return logEntries, nil
4058
}

internal/pkg/source/source_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package source_test
22

33
import (
4+
"strings"
45
"testing"
56

67
"github.com/stretchr/testify/assert"
@@ -34,4 +35,18 @@ func TestLoadLogsFromFile(t *testing.T) {
3435
_, ok := msg.(error)
3536
assert.Truef(t, ok, "actual type: %T", msg)
3637
})
38+
39+
t.Run("large_line", func(t *testing.T) {
40+
t.Parallel()
41+
42+
longLine := strings.Repeat("1", 2*1024*1024)
43+
testFile := tests.RequireCreateFile(t, []byte(longLine))
44+
45+
msg := source.LoadLogsFromFile(testFile)()
46+
47+
logEntries, ok := msg.(source.LogEntries)
48+
if assert.Truef(t, ok, "actual type: %T", msg) {
49+
assert.NotEmpty(t, logEntries)
50+
}
51+
})
3752
}

0 commit comments

Comments
 (0)