Commit 3def99a8 authored by Luka Zitnik's avatar Luka Zitnik Committed by Bryan C. Mills

cmd/go: print finally FAIL if a test has failed in package list mode

Fixes #30507

Change-Id: Ic598e4d5f71c624fcde051982bf85533e2f18e8d
Reviewed-on: https://go-review.googlesource.com/c/go/+/170948Reviewed-by: default avatarBryan C. Mills <bcmills@google.com>
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 23f3ea82
...@@ -1285,7 +1285,10 @@ ...@@ -1285,7 +1285,10 @@
// line. If a package test fails, go test prints the full test output. // line. If a package test fails, go test prints the full test output.
// If invoked with the -bench or -v flag, go test prints the full // If invoked with the -bench or -v flag, go test prints the full
// output even for passing package tests, in order to display the // output even for passing package tests, in order to display the
// requested benchmark results or verbose logging. // requested benchmark results or verbose logging. After the package
// tests for all of the listed packages finish, and their output is
// printed, go test prints a final 'FAIL' status if any package test
// has failed.
// //
// In package list mode only, go test caches successful package test // In package list mode only, go test caches successful package test
// results to avoid unnecessary repeated running of tests. When the // results to avoid unnecessary repeated running of tests. When the
......
...@@ -132,6 +132,10 @@ func SetExitStatus(n int) { ...@@ -132,6 +132,10 @@ func SetExitStatus(n int) {
exitMu.Unlock() exitMu.Unlock()
} }
func GetExitStatus() int {
return exitStatus
}
// Run runs the command, with stdout and stderr // Run runs the command, with stdout and stderr
// connected to the go command's own stdout and stderr. // connected to the go command's own stdout and stderr.
// If the command fails, Run reports the error using Errorf. // If the command fails, Run reports the error using Errorf.
......
...@@ -102,7 +102,10 @@ package test passes, go test prints only the final 'ok' summary ...@@ -102,7 +102,10 @@ package test passes, go test prints only the final 'ok' summary
line. If a package test fails, go test prints the full test output. line. If a package test fails, go test prints the full test output.
If invoked with the -bench or -v flag, go test prints the full If invoked with the -bench or -v flag, go test prints the full
output even for passing package tests, in order to display the output even for passing package tests, in order to display the
requested benchmark results or verbose logging. requested benchmark results or verbose logging. After the package
tests for all of the listed packages finish, and their output is
printed, go test prints a final 'FAIL' status if any package test
has failed.
In package list mode only, go test caches successful package test In package list mode only, go test caches successful package test
results to avoid unnecessary repeated running of tests. When the results to avoid unnecessary repeated running of tests. When the
...@@ -735,7 +738,7 @@ func runTest(cmd *base.Command, args []string) { ...@@ -735,7 +738,7 @@ func runTest(cmd *base.Command, args []string) {
} }
// Ultimately the goal is to print the output. // Ultimately the goal is to print the output.
root := &work.Action{Mode: "go test", Deps: prints} root := &work.Action{Mode: "go test", Func: printExitStatus, Deps: prints}
// Force the printing of results to happen in order, // Force the printing of results to happen in order,
// one at a time. // one at a time.
...@@ -1632,3 +1635,14 @@ func builderNoTest(b *work.Builder, a *work.Action) error { ...@@ -1632,3 +1635,14 @@ func builderNoTest(b *work.Builder, a *work.Action) error {
fmt.Fprintf(stdout, "? \t%s\t[no test files]\n", a.Package.ImportPath) fmt.Fprintf(stdout, "? \t%s\t[no test files]\n", a.Package.ImportPath)
return nil return nil
} }
// printExitStatus is the action for printing the exit status
func printExitStatus(b *work.Builder, a *work.Action) error {
if !testJSON && len(pkgArgs) != 0 {
if base.GetExitStatus() != 0 {
fmt.Println("FAIL")
return nil
}
}
return nil
}
env GO111MODULE=off
! go test x y
stdout ^FAIL\s+x
stdout ^ok\s+y
stdout (?-m)FAIL\n$
-- x/x_test.go --
package x
import "testing"
func TestNothingJustFail(t *testing.T) {
t.Fail()
}
-- y/y_test.go --
package y
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment