Skip to content

Commit 01f2cdd

Browse files
committed
parser/gotest: Use the new LimitedLineReader in the gotest parser
1 parent 3e3223a commit 01f2cdd

File tree

2 files changed

+9
-89
lines changed

2 files changed

+9
-89
lines changed

parser/gotest/gotest.go

Lines changed: 9 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package gotest
33

44
import (
55
"bufio"
6-
"bytes"
76
"fmt"
87
"io"
98
"regexp"
@@ -12,6 +11,7 @@ import (
1211
"time"
1312

1413
"github.com/jstemmer/go-junit-report/v2/gtr"
14+
"github.com/jstemmer/go-junit-report/v2/parser/gotest/internal/reader"
1515
)
1616

1717
const (
@@ -130,45 +130,19 @@ func NewParser(options ...Option) *Parser {
130130
// Parse parses Go test output from the given io.Reader r and returns
131131
// gtr.Report.
132132
func (p *Parser) Parse(r io.Reader) (gtr.Report, error) {
133+
return p.parse(reader.NewLimitedLineReader(r, maxLineSize))
134+
}
135+
136+
func (p *Parser) parse(r *reader.LimitedLineReader) (gtr.Report, error) {
133137
p.events = nil
134-
s := bufio.NewReader(r)
135138
for {
136-
line, isPrefix, err := s.ReadLine()
139+
line, err := r.ReadLine()
137140
if err == io.EOF {
138141
break
139142
} else if err != nil {
140143
return gtr.Report{}, err
141144
}
142145

143-
if !isPrefix {
144-
p.parseLine(string(line))
145-
continue
146-
}
147-
148-
// Line is incomplete, keep reading until we reach the end of the line.
149-
var buf bytes.Buffer
150-
buf.Write(line) // ignore err, always nil
151-
for isPrefix {
152-
line, isPrefix, err = s.ReadLine()
153-
if err == io.EOF {
154-
break
155-
} else if err != nil {
156-
return gtr.Report{}, err
157-
}
158-
159-
if buf.Len() >= maxLineSize {
160-
// Stop writing to buf if we exceed maxLineSize. We continue
161-
// reading however to make sure we consume the entire line.
162-
continue
163-
}
164-
165-
buf.Write(line) // ignore err, always nil
166-
}
167-
168-
if buf.Len() > maxLineSize {
169-
buf.Truncate(maxLineSize)
170-
}
171-
172146
// Lines that exceed bufio.MaxScanTokenSize are not expected to contain
173147
// any relevant test infrastructure output, so instead of parsing them
174148
// we treat them as regular output to increase performance.
@@ -177,10 +151,10 @@ func (p *Parser) Parse(r io.Reader) (gtr.Report, error) {
177151
// reading lines up to bufio.MaxScanTokenSize in length. Since this
178152
// turned out to be fine in almost all cases, it seemed an appropriate
179153
// value to use to decide whether or not to attempt parsing this line.
180-
if buf.Len() > bufio.MaxScanTokenSize {
181-
p.output(buf.String())
154+
if len(line) > bufio.MaxScanTokenSize {
155+
p.output(line)
182156
} else {
183-
p.parseLine(buf.String())
157+
p.parseLine(line)
184158
}
185159
}
186160
return p.report(p.events), nil

parser/gotest/gotest_test.go

Lines changed: 0 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package gotest
22

33
import (
4-
"bufio"
5-
"bytes"
64
"fmt"
75
"strings"
86
"testing"
@@ -218,58 +216,6 @@ func TestParseLine(t *testing.T) {
218216
}
219217
}
220218

221-
func TestParseLargeLine(t *testing.T) {
222-
tests := []struct {
223-
desc string
224-
inputSize int
225-
}{
226-
{"small size", 128},
227-
{"under buf size", 4095},
228-
{"buf size", 4096},
229-
{"multiple of buf size ", 4096 * 2},
230-
{"not multiple of buf size", 10 * 1024},
231-
{"bufio.MaxScanTokenSize", bufio.MaxScanTokenSize},
232-
{"over bufio.MaxScanTokenSize", bufio.MaxScanTokenSize + 1},
233-
{"under limit", maxLineSize - 1},
234-
{"at limit", maxLineSize},
235-
{"just over limit", maxLineSize + 1},
236-
{"over limit", maxLineSize + 128},
237-
}
238-
239-
createInput := func(lines ...string) *bytes.Buffer {
240-
buf := &bytes.Buffer{}
241-
buf.WriteString("=== RUN TestOne\n--- PASS: TestOne (0.00s)\n")
242-
buf.WriteString(strings.Join(lines, "\n"))
243-
return buf
244-
}
245-
246-
for _, test := range tests {
247-
t.Run(test.desc, func(t *testing.T) {
248-
line1 := string(make([]byte, test.inputSize))
249-
line2 := "other line"
250-
report, err := NewParser().Parse(createInput(line1, line2))
251-
if err != nil {
252-
t.Fatalf("Parse() returned error %v", err)
253-
} else if len(report.Packages) != 1 {
254-
t.Fatalf("Parse() returned unexpected number of packages, got %d want 1.", len(report.Packages))
255-
} else if len(report.Packages[0].Output) != 2 {
256-
t.Fatalf("Parse() returned unexpected number of output lines, got %d want 1.", len(report.Packages[0].Output))
257-
}
258-
259-
want := line1
260-
if len(want) > maxLineSize {
261-
want = want[:maxLineSize]
262-
}
263-
if got := report.Packages[0].Output[0]; got != want {
264-
t.Fatalf("Parse() output line1 mismatch, got len %d want len %d", len(got), len(want))
265-
}
266-
if report.Packages[0].Output[1] != line2 {
267-
t.Fatalf("Parse() output line2 mismatch, got %v want %v", report.Packages[0].Output[1], line2)
268-
}
269-
})
270-
}
271-
}
272-
273219
func TestReport(t *testing.T) {
274220
events := []Event{
275221
{Type: "run_test", Name: "TestOne"},

0 commit comments

Comments
 (0)