enabled by default on listerners. Using multipathtcp="0" reverts to the
pre-Go 1.24 behavior.
+Go 1.24 changed the behavior of `go test -json` to emit build errors as JSON
+instead of text.
+These new JSON events are distinguished by new `Action` values,
+but can still cause problems with CI systems that aren't robust to these events.
+This behavior can be controlled with the `gotestjsonbuildtext` setting.
+Using `gotestjsonbuildtext=1` restores the 1.23 behavior.
+This setting will be removed in a future release, Go 1.28 at the earliest.
+
### Go 1.23
Go 1.23 changed the channels created by package time to be unbuffered
The `go build` and `go install` commands now accept a `-json` flag that reports
build output and failures as structured JSON output on standard output.
-Furthermore, passing `-json` to `go test` now reports build output and failures
-in addition to test results in JSON. For details of the reporting format, see
-`go help buildjson`.
+For details of the reporting format, see `go help buildjson`.
+
+Furthermore, `go test -json` now reports build output and failures in JSON,
+interleaved with test result JSON.
+These are distinguished by new `Action` types, but if they cause problems in
+a test integration system, you can revert to the text build output by setting
+`GODEBUG=gotestjsonbuildtext=1`.
### Cgo {#cgo}
import (
"cmd/go/internal/base"
+ "cmd/go/internal/cfg"
"cmd/go/internal/cmdflag"
"cmd/go/internal/work"
"errors"
"flag"
"fmt"
+ "internal/godebug"
"os"
"path/filepath"
"strconv"
// our command line are for us, and some are for the test binary, and
// some are for both.
+var gotestjsonbuildtext = godebug.New("gotestjsonbuildtext")
+
func init() {
work.AddBuildFlags(CmdTest, work.OmitVFlag|work.OmitJSONFlag)
cf.StringVar(&testO, "o", "", "")
work.AddCoverFlags(CmdTest, &testCoverProfile)
cf.Var((*base.StringsFlag)(&work.ExecCmd), "exec", "")
- // TODO(austin): Make test -json imply build -json.
cf.BoolVar(&testJSON, "json", false, "")
cf.Var(&testVet, "vet", "")
delete(addFromGOFLAGS, "v")
delete(addFromGOFLAGS, "test.v")
- // TODO(austin,#70402): Re-enable this once LUCI can handle build JSON in the test stream.
- //cfg.BuildJSON = true
+ if gotestjsonbuildtext.Value() == "1" {
+ gotestjsonbuildtext.IncNonDefault()
+ } else {
+ cfg.BuildJSON = true
+ }
}
// Inject flags from GOFLAGS before the explicit command-line arguments.
-# TODO(austin,#70402)
-skip
-
[short] skip
+env GODEBUG=gotestjsonbuildtext=0
+
# There are several places where paths appear in JSON in regexps here.
# For the path separator we use (/|\\\\).
# Unfortunately, we can't just use ${/} because, while script test automatically
stdout '"Action":"fail","Package":"m/veterror","Elapsed":.*,"FailedBuild":"m/veterror \[m/veterror.test\]"'
! stderr '.'
+# Test that the GODEBUG fallback works.
+env GODEBUG=gotestjsonbuildtext=1
+! go test -json -o=$devnull ./builderror
+stderr '# m/builderror \[m/builderror.test\]\n'
+stderr 'builderror'${/}'main_test.go:3:11: undefined: y\n'
+stdout '"Action":"start","Package":"m/builderror"'
+stdout '"Action":"output","Package":"m/builderror","Output":"FAIL\\tm/builderror \[build failed\]\\n"'
+stdout '"Action":"fail","Package":"m/builderror","Elapsed":.*,"FailedBuild":"m/builderror \[m/builderror\.test\]"'
+
+
-- go.mod --
module m
go 1.21
{Name: "gocachehash", Package: "cmd/go"},
{Name: "gocachetest", Package: "cmd/go"},
{Name: "gocacheverify", Package: "cmd/go"},
+ {Name: "gotestjsonbuildtext", Package: "cmd/go", Changed: 24, Old: "1"},
{Name: "gotypesalias", Package: "go/types", Changed: 23, Old: "0"},
{Name: "http2client", Package: "net/http"},
{Name: "http2debug", Package: "net/http", Opaque: true},
The number of non-default behaviors executed by the cmd/go
package due to a non-default GODEBUG=gocacheverify=... setting.
+ /godebug/non-default-behavior/gotestjsonbuildtext:events
+ The number of non-default behaviors executed by the cmd/go
+ package due to a non-default GODEBUG=gotestjsonbuildtext=...
+ setting.
+
/godebug/non-default-behavior/gotypesalias:events
The number of non-default behaviors executed by the go/types
package due to a non-default GODEBUG=gotypesalias=... setting.