]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: display test binary output if invoked with -help
authorIan Lance Taylor <iant@golang.org>
Thu, 2 Jul 2020 19:32:13 +0000 (12:32 -0700)
committerIan Lance Taylor <iant@golang.org>
Mon, 6 Jul 2020 21:47:57 +0000 (21:47 +0000)
Fixes #39997

Change-Id: I87ea616bac809b96fcd40f3bbdbbf1c603b9d00e
Reviewed-on: https://go-review.googlesource.com/c/go/+/240878
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jay Conrod <jayconrod@google.com>
src/cmd/go/internal/test/test.go
src/cmd/go/internal/test/testflag.go
src/cmd/go/testdata/script/test_flags.txt

index 880da2891cd4fe9f14e7a94017c965885566ad5d..873a76aa38037e0d6cc5c00acfc12ddca1d0e2ff 100644 (file)
@@ -487,6 +487,8 @@ var (
        pkgArgs  []string
        pkgs     []*load.Package
 
+       testHelp bool // -help option passed to test via -args
+
        testKillTimeout = 100 * 365 * 24 * time.Hour // backup alarm; defaults to about a century if no timeout is set
        testCacheExpire time.Time                    // ignore cached test results before this time
 
@@ -532,7 +534,7 @@ func testNeedBinary() bool {
 
 // testShowPass reports whether the output for a passing test should be shown.
 func testShowPass() bool {
-       return testV || (testList != "")
+       return testV || (testList != "") || testHelp
 }
 
 var defaultVetFlags = []string{
index 9a3042bfe70eca4ac573c251db2774515f10772f..1ff34f7445cd184ba2d5b153ecf21dd957a20b9e 100644 (file)
@@ -333,6 +333,23 @@ func testFlags(args []string) (packageNames, passToTest []string) {
                injectedFlags = append(injectedFlags, "-test.outputdir="+testOutputDir)
        }
 
+       // If the user is explicitly passing -help or -h, show output
+       // of the test binary so that the help output is displayed
+       // even though the test will exit with success.
+       // This loop is imperfect: it will do the wrong thing for a case
+       // like -args -test.outputdir -help. Such cases are probably rare,
+       // and getting this wrong doesn't do too much harm.
+helpLoop:
+       for _, arg := range explicitArgs {
+               switch arg {
+               case "--":
+                       break helpLoop
+               case "-h", "-help", "--help":
+                       testHelp = true
+                       break helpLoop
+               }
+       }
+
        // Ensure that -race and -covermode are compatible.
        if testCoverMode == "" {
                testCoverMode = "set"
index 27d718a3b27d9799da915e1450c92a25fda3f08c..d38e37f238025b06832d0585f2336130d35a9ab9 100644 (file)
@@ -57,6 +57,10 @@ stderr -count=1 'invalid value "walrus" for flag -covermode: valid modes are .*$
 stderr '^usage: go test .*$'
 stderr '^Run ''go help test'' and ''go help testflag'' for details.$'
 
+# Passing -help to the test binary should show flag help.
+go test ./x -args -help
+stdout 'usage_message'
+
 # -covermode, -coverpkg, and -coverprofile should imply -cover
 go test -covermode=set ./x
 stdout '\s+coverage:\s+'
@@ -98,6 +102,8 @@ import (
        "testing"
 )
 
+var _ = flag.String("usage_message", "", "dummy flag to check usage message")
+
 func TestLogTimeout(t *testing.T) {
        t.Log(flag.Lookup("test.timeout").Value)
 }