benchfmt: ignore just benchmark name on a line
"go test -v" prints just the benchmark name followed by a newline when
starting each benchmark. Currently, this causes benchfmt to report a
"missing iteration count" error on these lines. Make the parser ignore
this specific case.
Fixes golang/go#58528.
Change-Id: I92032d10f3cd3d4c8e867674c1905df9123f13fc
Reviewed-on: https://go-review.googlesource.com/c/perf/+/540795
Auto-Submit: Austin Clements <austin@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
diff --git a/benchfmt/reader.go b/benchfmt/reader.go
index 32b0ec6..817fd41 100644
--- a/benchfmt/reader.go
+++ b/benchfmt/reader.go
@@ -59,6 +59,7 @@
}
var noResult = &SyntaxError{"", 0, "Reader.Scan has not been called"}
+var errSkip = &SyntaxError{"", 0, "skip line"}
// NewReader constructs a reader to parse the Go benchmark format from r.
// fileName is used in error messages; it is purely diagnostic.
@@ -152,13 +153,10 @@
// Most lines are benchmark lines, and we can check
// for that very quickly, so start with that.
if bytes.HasPrefix(line, benchmarkPrefix) {
- // At this point we commit to this being a
- // benchmark line. If it's malformed, we treat
- // that as an error.
- if err := r.parseBenchmarkLine(line); err != nil {
- r.q = append(r.q, err)
- } else {
+ if err := r.parseBenchmarkLine(line); err == nil {
r.q = append(r.q, &r.result)
+ } else if err != errSkip {
+ r.q = append(r.q, err)
}
continue
}
@@ -248,8 +246,17 @@
line = line[len("Benchmark"):]
// Read the name.
+ lineLen := len(line)
r.result.Name, line = splitField(line)
+ // As a special case, if the name is the entire line, we
+ // ignore it. This happens in "go test -v" output, which
+ // prints the benchmark name immediately followed by a newline
+ // when the benchmark starts.
+ if len(line) == 0 && len(r.result.Name) == lineLen {
+ return errSkip
+ }
+
// Read the iteration count.
f, line = splitField(line)
if len(f) == 0 {
diff --git a/benchfmt/reader_test.go b/benchfmt/reader_test.go
index b1bad87..ac6d6cf 100644
--- a/benchfmt/reader_test.go
+++ b/benchfmt/reader_test.go
@@ -179,7 +179,7 @@
{
"bad lines",
`not a benchmark
-BenchmarkMissingIter
+BenchmarkMissingIter
BenchmarkBadIter abc
BenchmarkHugeIter 9999999999999999999999999999999
BenchmarkMissingVal 100
@@ -250,6 +250,19 @@
v(1, "ns/op").res,
},
},
+ {
+ // go test -v prints just the benchmark name
+ // on a line when starting each benchmark.
+ // Make sure we ignore it.
+ "verbose",
+ `BenchmarkOne
+BenchmarkOne 100 1 ns/op
+`,
+ []Record{
+ r("One", 100).
+ v(1, "ns/op").res,
+ },
+ },
} {
t.Run(test.name, func(t *testing.T) {
got, _ := parseAll(t, test.input)