return nil
}
- if a.Failed {
- // We were unable to build the binary.
- a.Failed = false
- a.TestOutput = new(bytes.Buffer)
- fmt.Fprintf(a.TestOutput, "FAIL\t%s [build failed]\n", a.Package.ImportPath)
- base.SetExitStatus(1)
-
- // release next test to start
- close(r.next)
- return nil
- }
-
var stdout io.Writer = os.Stdout
var err error
if testJSON {
// Release next test to start (test2json.NewConverter writes the start event).
close(r.next)
+ if a.Failed {
+ // We were unable to build the binary.
+ a.Failed = false
+ fmt.Fprintf(stdout, "FAIL\t%s [build failed]\n", a.Package.ImportPath)
+ // Tell the JSON converter that this was a failure, not a passing run.
+ err = errors.New("build failed")
+ base.SetExitStatus(1)
+ return nil
+ }
+
if p := a.Package; len(p.TestGoFiles)+len(p.XTestGoFiles) == 0 {
fmt.Fprintf(stdout, "? \t%s\t[no test files]\n", p.ImportPath)
return nil
--- /dev/null
+! go test -json .
+
+ # We should see only JSON output on stdout, no non-JSON.
+ # To simplify the check, we just look for non-curly-braces, since
+ # every JSON entry has them and they're unlikely to occur
+ # in other error messages.
+! stdout '^[^{]'
+! stdout '[^}]\n$'
+
+ # Since the only test we requested failed to build, we should
+ # not see any "pass" actions in the JSON stream.
+! stdout '\{.*"Action":"pass".*\}'
+
+ # TODO(#62067): emit this as a build event instead of a test event.
+stdout '\{.*"Action":"output","Package":"example","Output":"FAIL\\texample \[build failed\]\\n"\}'
+stdout '\{.*"Action":"fail","Package":"example",.*\}'
+
+-- go.mod --
+module example
+go 1.19
+-- example.go --
+package example
+
+This is not valid Go source.
+-- example_test.go --
+package example
+
+func Test(*testing.T) {}