From 8cda647a0f7f4eadf382c2173f476c0dd4bc7a25 Mon Sep 17 00:00:00 2001 From: Maisem Ali Date: Sun, 2 Jul 2023 09:01:53 -0700 Subject: [PATCH] cmd/testwrapper: handle build failures `go test -json` outputs invalid JSON when a build fails. Handle that case by reseting the json.Decode and continuing to read. Updates #8493 Signed-off-by: Maisem Ali --- cmd/testwrapper/testwrapper.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cmd/testwrapper/testwrapper.go b/cmd/testwrapper/testwrapper.go index de472fffd..c9790aafc 100644 --- a/cmd/testwrapper/testwrapper.go +++ b/cmd/testwrapper/testwrapper.go @@ -81,6 +81,7 @@ func runTests(ctx context.Context, attempt int, pt *packageTests, otherArgs []st if err != nil { log.Printf("error creating stdout pipe: %v", err) } + defer r.Close() cmd.Stderr = os.Stderr cmd.Env = os.Environ() @@ -104,6 +105,15 @@ func runTests(ctx context.Context, attempt int, pt *packageTests, otherArgs []st if errors.Is(err, io.EOF) || errors.Is(err, os.ErrClosed) { break } + + // `go test -json` outputs invalid JSON when a build fails. + // In that case, discard the the output and start reading again. + // The build error will be printed to stderr. + // See: https://github.com/golang/go/issues/35169 + if _, ok := err.(*json.SyntaxError); ok { + jd = json.NewDecoder(r) + continue + } panic(err) } if goOutput.Test == "" {