Commit 65fa5318 authored by Russ Cox's avatar Russ Cox

cmd/test2json: fix processing of --- BENCH: output

If a benchmark calls b.Log without failing (without b.Error/b.Fatal/b.FailNow)
then that turns into output very much like a test passing,
except it says BENCH instead of PASS.
Benchmarks failing say FAIL just like tests failing.

Fixes #23346.

Change-Id: Ib188e695952da78057ab4a13f90d49937aa3c232
Reviewed-on: https://go-review.googlesource.com/86396
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent acc1ec9b
...@@ -140,6 +140,7 @@ var ( ...@@ -140,6 +140,7 @@ var (
[]byte("--- PASS: "), []byte("--- PASS: "),
[]byte("--- FAIL: "), []byte("--- FAIL: "),
[]byte("--- SKIP: "), []byte("--- SKIP: "),
[]byte("--- BENCH: "),
} }
fourSpace = []byte(" ") fourSpace = []byte(" ")
...@@ -186,6 +187,7 @@ func (c *converter) handleInputLine(line []byte) { ...@@ -186,6 +187,7 @@ func (c *converter) handleInputLine(line []byte) {
// "--- PASS: " // "--- PASS: "
// "--- FAIL: " // "--- FAIL: "
// "--- SKIP: " // "--- SKIP: "
// "--- BENCH: "
// but possibly indented. // but possibly indented.
for bytes.HasPrefix(line, fourSpace) { for bytes.HasPrefix(line, fourSpace) {
line = line[4:] line = line[4:]
...@@ -206,8 +208,12 @@ func (c *converter) handleInputLine(line []byte) { ...@@ -206,8 +208,12 @@ func (c *converter) handleInputLine(line []byte) {
} }
// Parse out action and test name. // Parse out action and test name.
action := strings.ToLower(strings.TrimSuffix(strings.TrimSpace(string(line[4:4+6])), ":")) i := bytes.IndexByte(line, ':') + 1
name := strings.TrimSpace(string(line[4+6:])) if i == 0 {
i = len(updates[0])
}
action := strings.ToLower(strings.TrimSuffix(strings.TrimSpace(string(line[4:i])), ":"))
name := strings.TrimSpace(string(line[i:]))
e := &event{Action: action} e := &event{Action: action}
if line[0] == '-' { // PASS or FAIL report if line[0] == '-' { // PASS or FAIL report
......
{"Action":"output","Output":"goos: darwin\n"}
{"Action":"output","Output":"goarch: 386\n"}
{"Action":"output","Output":"BenchmarkFoo-8 \t2000000000\t 0.00 ns/op\n"}
{"Action":"output","Test":"BenchmarkFoo-8","Output":"--- BENCH: BenchmarkFoo-8\n"}
{"Action":"output","Test":"BenchmarkFoo-8","Output":"\tx_test.go:8: My benchmark\n"}
{"Action":"output","Test":"BenchmarkFoo-8","Output":"\tx_test.go:8: My benchmark\n"}
{"Action":"output","Test":"BenchmarkFoo-8","Output":"\tx_test.go:8: My benchmark\n"}
{"Action":"output","Test":"BenchmarkFoo-8","Output":"\tx_test.go:8: My benchmark\n"}
{"Action":"output","Test":"BenchmarkFoo-8","Output":"\tx_test.go:8: My benchmark\n"}
{"Action":"output","Test":"BenchmarkFoo-8","Output":"\tx_test.go:8: My benchmark\n"}
{"Action":"bench","Test":"BenchmarkFoo-8"}
{"Action":"output","Output":"PASS\n"}
{"Action":"output","Output":"ok \tcommand-line-arguments\t0.009s\n"}
{"Action":"pass"}
goos: darwin
goarch: 386
BenchmarkFoo-8 2000000000 0.00 ns/op
--- BENCH: BenchmarkFoo-8
x_test.go:8: My benchmark
x_test.go:8: My benchmark
x_test.go:8: My benchmark
x_test.go:8: My benchmark
x_test.go:8: My benchmark
x_test.go:8: My benchmark
PASS
ok command-line-arguments 0.009s
{"Action":"output","Test":"BenchmarkFoo","Output":"--- FAIL: BenchmarkFoo\n"}
{"Action":"output","Test":"BenchmarkFoo","Output":"\tx_test.go:8: My benchmark\n"}
{"Action":"fail","Test":"BenchmarkFoo"}
{"Action":"output","Output":"FAIL\n"}
{"Action":"output","Output":"FAIL\tcommand-line-arguments\t0.008s\n"}
{"Action":"fail"}
--- FAIL: BenchmarkFoo
x_test.go:8: My benchmark
FAIL
FAIL command-line-arguments 0.008s
...@@ -45,7 +45,8 @@ ...@@ -45,7 +45,8 @@
// pause - the test has been paused // pause - the test has been paused
// cont - the test has continued running // cont - the test has continued running
// pass - the test passed // pass - the test passed
// fail - the test failed // bench - the benchmark printed log output but did not fail
// fail - the test or benchmark failed
// output - the test printed output // output - the test printed output
// //
// The Package field, if present, specifies the package being tested. // The Package field, if present, specifies the package being tested.
...@@ -53,7 +54,7 @@ ...@@ -53,7 +54,7 @@
// different tests are interlaced; the Package field allows readers to // different tests are interlaced; the Package field allows readers to
// separate them. // separate them.
// //
// The Test field, if present, specifies the test or example, or benchmark // The Test field, if present, specifies the test, example, or benchmark
// function that caused the event. Events for the overall package test // function that caused the event. Events for the overall package test
// do not set Test. // do not set Test.
// //
...@@ -67,6 +68,14 @@ ...@@ -67,6 +68,14 @@
// the concatenation of the Output fields of all output events is the exact // the concatenation of the Output fields of all output events is the exact
// output of the test execution. // output of the test execution.
// //
// When a benchmark runs, it typically produces a single line of output
// giving timing results. That line is reported in an event with Action == "output"
// and no Test field. If a benchmark logs output or reports a failure
// (for example, by using b.Log or b.Error), that extra output is reported
// as a sequence of events with Test set to the benchmark name, terminated
// by a final event with Action == "bench" or "fail".
// Benchmarks have no events with Action == "run", "pause", or "cont".
//
package main package main
import ( import (
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment