-
Notifications
You must be signed in to change notification settings - Fork 18.8k
Closed
Labels
FrozenDueToAgeNeedsFixThe path to resolution is known, but the work has not been done.The path to resolution is known, but the work has not been done.help wanted
Milestone
Description
What version of Go are you using (go version)?
$ go version go version go1.12.4 darwin/amd64
Does this issue reproduce with the latest release?
Yes
What operating system and processor architecture are you using (go env)?
go env Output
$ go env GOARCH="amd64" GOBIN="" GOCACHE="/Users/liggitt/Library/Caches/go-build" GOEXE="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="darwin" GOOS="darwin" GOPATH="/Users/liggitt/go" GOPROXY="" GORACE="" GOROOT="/Users/liggitt/.gvm/gos/go1.12.4" GOTMPDIR="" GOTOOLDIR="/Users/liggitt/.gvm/gos/go1.12.4/pkg/tool/darwin_amd64" GCCGO="gccgo" CC="clang" CXX="clang++" CGO_ENABLED="1" GOMOD="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/h8/3dzrjpfj76d93vbhc5f2r8tw00kjgb/T/go-build854512890=/tmp/go-build -gno-record-gcc-switches -fno-common"
What did you do?
We have go tests that start a server goroutine running in the background, then run subtests against that server. The server goroutine can log to stdout/stderr.
To obtain structured test output, we run go tests with -json to cleanly separate test names, status, and output.
The following example reproduces the issue:
stdout_test.go:
package main
import (
"fmt"
"os"
"testing"
"time"
)
func TestStdoutJSON(t *testing.T) {
go func() {
for {
os.Stderr.Write([]byte("os.Stderr message\n"))
os.Stdout.Write([]byte("os.Stdout message\n"))
time.Sleep(time.Millisecond)
}
}()
for i := 0; i < 10; i++ {
t.Run(fmt.Sprintf("subtest %d", i), func(t *testing.T) {
for i := 0; i < 10; i++ {
t.Run(fmt.Sprintf("subtest %d", i), func(t *testing.T) {
for i := 0; i < 10; i++ {
t.Run(fmt.Sprintf("subtest %d", i), func(t *testing.T) {
t.Log("testlog")
})
}
})
}
})
}
}$ go test -count=100 -json -v stdout_test.go | jq 'select(.Test//"" | contains("os"))' {
"Time": "2019-08-01T16:06:56.384955-04:00",
"Action": "output",
"Package": "command-line-arguments",
"Test": "Tos.Stderr message",
"Output": " --- PASS: Tos.Stderr message\n"
}
{
"Time": "2019-08-01T16:06:56.384968-04:00",
"Action": "output",
"Package": "command-line-arguments",
"Test": "Tos.Stderr message",
"Output": "estStdoutJSON/subtest_4/subtest_6/subtest_6 (0.00s)\n"
}
...What did you expect to see?
Correct test name and status in go test -json output
What did you see instead?
Stderr output from the server goroutine interleaved with test names inside the structured json data.
Observations:
- This has only been seen in tests that make use of subtests
- Stdout from the background goroutine is not observed to interleave, only Stderr
go test -json not outputting test names with fidelity messes up systems that transform that output to junit format or ingest it into tools like testgrid that show history of a particular test
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
FrozenDueToAgeNeedsFixThe path to resolution is known, but the work has not been done.The path to resolution is known, but the work has not been done.help wanted