]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go/internal/test: pass default timeout to test programs if not given from command...
authorOkamotoYuki <okamoto.yuki.0130@gmail.com>
Sun, 10 Mar 2019 02:38:12 +0000 (02:38 +0000)
committerBryan C. Mills <bcmills@google.com>
Sat, 13 Apr 2019 02:39:29 +0000 (02:39 +0000)
Make 'go test' command to pass the default timeout (10m) to test programs if the value is not given from command line.

Fixes #28147

Change-Id: I7856e452224a51a92da03bab8e3a0f9d7c41d32a
GitHub-Last-Rev: 66f9a6f90e9ffe7c58d5c1fe32af84e16ea74ab8
GitHub-Pull-Request: golang/go#30545
Reviewed-on: https://go-review.googlesource.com/c/go/+/164963
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
src/cmd/go/internal/test/test.go
src/cmd/go/testdata/script/test_timeout.txt [new file with mode: 0644]

index 225dab31de619fcf8af73f70e4a403140de75737..9b9bbce0dd838df64c76f1a10464ae647d07aa5c 100644 (file)
@@ -484,8 +484,9 @@ var (
        pkgArgs          []string
        pkgs             []*load.Package
 
-       testKillTimeout = 10 * time.Minute
-       testCacheExpire time.Time // ignore cached test results before this time
+       testActualTimeout = 10 * time.Minute                  // actual timeout which is passed to tests
+       testKillTimeout   = testActualTimeout + 1*time.Minute // backup alarm
+       testCacheExpire   time.Time                           // ignore cached test results before this time
 )
 
 // testVetFlags is the list of flags to pass to vet when invoked automatically during go test.
@@ -552,13 +553,21 @@ func runTest(cmd *base.Command, args []string) {
        // the test wedges with a goroutine spinning and its background
        // timer does not get a chance to fire.
        if dt, err := time.ParseDuration(testTimeout); err == nil && dt > 0 {
-               testKillTimeout = dt + 1*time.Minute
+               testActualTimeout = dt
+               testKillTimeout = testActualTimeout + 1*time.Minute
        } else if err == nil && dt == 0 {
                // An explicit zero disables the test timeout.
+               // No timeout is passed to tests.
                // Let it have one century (almost) before we kill it.
+               testActualTimeout = -1
                testKillTimeout = 100 * 365 * 24 * time.Hour
        }
 
+       // Pass timeout to tests if it exists.
+       if testActualTimeout > 0 {
+               testArgs = append(testArgs, "-test.timeout="+testActualTimeout.String())
+       }
+
        // show passing test output (after buffering) with -v flag.
        // must buffer because tests are running in parallel, and
        // otherwise the output will get mixed.
diff --git a/src/cmd/go/testdata/script/test_timeout.txt b/src/cmd/go/testdata/script/test_timeout.txt
new file mode 100644 (file)
index 0000000..9087a90
--- /dev/null
@@ -0,0 +1,21 @@
+env GO111MODULE=off
+cd a
+
+# No timeout is passed via 'go test' command.
+go test -v
+stdout '10m0s'
+
+# Timeout is passed via 'go test' command.
+go test -v -timeout 30m
+stdout '30m0s'
+
+-- a/timeout_test.go --
+package t
+import (
+       "flag"
+       "fmt"
+       "testing"
+)
+func TestTimeout(t *testing.T) {
+       fmt.Println(flag.Lookup("test.timeout").Value.String())
+}
\ No newline at end of file