aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2018-01-08 12:11:00 -0500
committerRuss Cox <rsc@golang.org>2018-01-09 01:53:38 +0000
commit9044f018ec7bf35ac030dc5aec1acd7d18d6691c (patch)
treefc12357dd45e0096525eed882eb3b4398d550dc9
parenta99deed39bb945cba922bd312435fdf309b42a13 (diff)
downloadgo-9044f018ec7bf35ac030dc5aec1acd7d18d6691c.tar.gz
go-9044f018ec7bf35ac030dc5aec1acd7d18d6691c.zip
cmd/test2json: emit Benchmark name output early
When benchmarks run, they print lines like: BenchmarkGenericNoMatch-8 3000000 385 ns/op The first field, padded by spaces and followed by a tab, is printed when the benchmark begins running. The rest of the line is printed when the benchmark ends. Tools and people can watch the timing of these prints to see which benchmark is running. To allow tools consuming json output to continue to be able to see which benchmark is running, this CL adds a special case to the usual "line at a time" behavior to flush the benchmark name if it is observed separately from the rest of the line. Fixes #23352. Change-Id: I7b6410698d78034eec18745d7f57b7d8e9575dbb Reviewed-on: https://go-review.googlesource.com/86695 Run-TryBot: Russ Cox <rsc@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
-rw-r--r--src/cmd/internal/test2json/test2json.go25
-rw-r--r--src/cmd/internal/test2json/testdata/benchshort.json7
-rw-r--r--src/cmd/internal/test2json/testdata/benchshort.test5
3 files changed, 37 insertions, 0 deletions
diff --git a/src/cmd/internal/test2json/test2json.go b/src/cmd/internal/test2json/test2json.go
index fa0708357b..483fb1de52 100644
--- a/src/cmd/internal/test2json/test2json.go
+++ b/src/cmd/internal/test2json/test2json.go
@@ -16,6 +16,7 @@ import (
"strconv"
"strings"
"time"
+ "unicode"
"unicode/utf8"
)
@@ -349,6 +350,15 @@ func (l *lineBuffer) write(b []byte) {
for i < len(l.b) {
j := bytes.IndexByte(l.b[i:], '\n')
if j < 0 {
+ if !l.mid {
+ if j := bytes.IndexByte(l.b[i:], '\t'); j >= 0 {
+ if isBenchmarkName(bytes.TrimRight(l.b[i:i+j], " ")) {
+ l.part(l.b[i : i+j+1])
+ l.mid = true
+ i += j + 1
+ }
+ }
+ }
break
}
e := i + j + 1
@@ -390,6 +400,21 @@ func (l *lineBuffer) flush() {
}
}
+var benchmark = []byte("Benchmark")
+
+// isBenchmarkName reports whether b is a valid benchmark name
+// that might appear as the first field in a benchmark result line.
+func isBenchmarkName(b []byte) bool {
+ if !bytes.HasPrefix(b, benchmark) {
+ return false
+ }
+ if len(b) == len(benchmark) { // just "Benchmark"
+ return true
+ }
+ r, _ := utf8.DecodeRune(b[len(benchmark):])
+ return !unicode.IsLower(r)
+}
+
// trimUTF8 returns a length t as close to len(b) as possible such that b[:t]
// does not end in the middle of a possibly-valid UTF-8 sequence.
//
diff --git a/src/cmd/internal/test2json/testdata/benchshort.json b/src/cmd/internal/test2json/testdata/benchshort.json
new file mode 100644
index 0000000000..8c61d95d8d
--- /dev/null
+++ b/src/cmd/internal/test2json/testdata/benchshort.json
@@ -0,0 +1,7 @@
+{"Action":"output","Output":"# This file ends in an early EOF to trigger the Benchmark prefix test,\n"}
+{"Action":"output","Output":"# which only happens when a benchmark prefix is seen ahead of the \\n.\n"}
+{"Action":"output","Output":"# Normally that's due to the benchmark running and the \\n coming later,\n"}
+{"Action":"output","Output":"# but to avoid questions of timing, we just use a file with no \\n at all.\n"}
+{"Action":"output","Output":"BenchmarkFoo \t"}
+{"Action":"output","Output":"10000 early EOF"}
+{"Action":"fail"}
diff --git a/src/cmd/internal/test2json/testdata/benchshort.test b/src/cmd/internal/test2json/testdata/benchshort.test
new file mode 100644
index 0000000000..0b173ab20d
--- /dev/null
+++ b/src/cmd/internal/test2json/testdata/benchshort.test
@@ -0,0 +1,5 @@
+# This file ends in an early EOF to trigger the Benchmark prefix test,
+# which only happens when a benchmark prefix is seen ahead of the \n.
+# Normally that's due to the benchmark running and the \n coming later,
+# but to avoid questions of timing, we just use a file with no \n at all.
+BenchmarkFoo 10000 early EOF \ No newline at end of file