Browse Source

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 <[email protected]>
Maisem Ali 2 years ago
parent
commit
8cda647a0f
1 changed files with 10 additions and 0 deletions
  1. 10 0
      cmd/testwrapper/testwrapper.go

+ 10 - 0
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 == "" {