aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBryan C. Mills <bcmills@google.com>2022-10-26 11:44:34 -0400
committerGopher Robot <gobot@golang.org>2022-10-31 20:54:10 +0000
commite8ec68edfac4f50f57dd7faf039bb5c0f8eaba88 (patch)
treed454c84525c510bddcf22ba7293099574dca8225 /src
parent84cd7ab3c388fb3280cf426a35045d85cda99ff8 (diff)
downloadgo-e8ec68edfac4f50f57dd7faf039bb5c0f8eaba88.tar.xz
internal/testenv: remove RunWithTimout
For most tests, the test's deadline itself is more appropriate than an arbitrary timeout layered atop of it (especially once #48157 is implemented), and testenv.Command already adds cleaner timeout behavior when a command would run too close to the test's deadline. That makes RunWithTimeout something of an attractive nuisance. For now, migrate the two existing uses of it to testenv.CommandContext, with a shorter timeout implemented using context.WithTimeout. As a followup, we may want to drop the extra timeouts from these invocations entirely. Updates #50436. Updates #37405. Change-Id: I16840fd36c0137b6da87ec54012b3e44661f0d08 Reviewed-on: https://go-review.googlesource.com/c/go/+/445597 Reviewed-by: Ian Lance Taylor <iant@google.com> Run-TryBot: Bryan Mills <bcmills@google.com> Auto-Submit: Bryan Mills <bcmills@google.com> Reviewed-by: Austin Clements <austin@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/internal/testenv/testenv.go57
-rw-r--r--src/runtime/crash_test.go19
-rw-r--r--src/runtime/runtime-gdb_test.go6
3 files changed, 20 insertions, 62 deletions
diff --git a/src/internal/testenv/testenv.go b/src/internal/testenv/testenv.go
index f71f5cdd41..b61a44c855 100644
--- a/src/internal/testenv/testenv.go
+++ b/src/internal/testenv/testenv.go
@@ -11,7 +11,6 @@
package testenv
import (
- "bytes"
"context"
"errors"
"flag"
@@ -505,62 +504,6 @@ func SkipIfOptimizationOff(t testing.TB) {
}
}
-// RunWithTimeout runs cmd and returns its combined output. If the
-// subprocess exits with a non-zero status, it will log that status
-// and return a non-nil error, but this is not considered fatal.
-func RunWithTimeout(t testing.TB, cmd *exec.Cmd) ([]byte, error) {
- args := cmd.Args
- if args == nil {
- args = []string{cmd.Path}
- }
-
- var b bytes.Buffer
- cmd.Stdout = &b
- cmd.Stderr = &b
- if err := cmd.Start(); err != nil {
- t.Fatalf("starting %s: %v", args, err)
- }
-
- // If the process doesn't complete within 1 minute,
- // assume it is hanging and kill it to get a stack trace.
- p := cmd.Process
- done := make(chan bool)
- go func() {
- scale := 1
- // This GOARCH/GOOS test is copied from cmd/dist/test.go.
- // TODO(iant): Have cmd/dist update the environment variable.
- if runtime.GOARCH == "arm" || runtime.GOOS == "windows" {
- scale = 2
- }
- if s := os.Getenv("GO_TEST_TIMEOUT_SCALE"); s != "" {
- if sc, err := strconv.Atoi(s); err == nil {
- scale = sc
- }
- }
-
- select {
- case <-done:
- case <-time.After(time.Duration(scale) * time.Minute):
- p.Signal(Sigquit)
- // If SIGQUIT doesn't do it after a little
- // while, kill the process.
- select {
- case <-done:
- case <-time.After(time.Duration(scale) * 30 * time.Second):
- p.Signal(os.Kill)
- }
- }
- }()
-
- err := cmd.Wait()
- if err != nil {
- t.Logf("%s exit status: %v", args, err)
- }
- close(done)
-
- return b.Bytes(), err
-}
-
// WriteImportcfg writes an importcfg file used by the compiler or linker to
// dstPath containing entries for the packages in std and cmd in addition
// to the package to package file mappings in additionalPackageFiles.
diff --git a/src/runtime/crash_test.go b/src/runtime/crash_test.go
index d5f755296b..6e00489b49 100644
--- a/src/runtime/crash_test.go
+++ b/src/runtime/crash_test.go
@@ -6,6 +6,7 @@ package runtime_test
import (
"bytes"
+ "context"
"errors"
"flag"
"fmt"
@@ -18,6 +19,7 @@ import (
"strings"
"sync"
"testing"
+ "time"
)
var toRemove []string
@@ -58,18 +60,27 @@ func runTestProg(t *testing.T, binary, name string, env ...string) string {
}
func runBuiltTestProg(t *testing.T, exe, name string, env ...string) string {
+ t.Helper()
+
if *flagQuick {
t.Skip("-quick")
}
- testenv.MustHaveGoBuild(t)
-
- cmd := testenv.CleanCmdEnv(exec.Command(exe, name))
+ ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
+ defer cancel()
+ cmd := testenv.CleanCmdEnv(testenv.CommandContext(t, ctx, exe, name))
cmd.Env = append(cmd.Env, env...)
if testing.Short() {
cmd.Env = append(cmd.Env, "RUNTIME_TEST_SHORT=1")
}
- out, _ := testenv.RunWithTimeout(t, cmd)
+ out, err := cmd.CombinedOutput()
+ if err != nil {
+ if _, ok := err.(*exec.ExitError); ok {
+ t.Logf("%v: %v", cmd, err)
+ } else {
+ t.Fatalf("%v failed to start: %v", cmd, err)
+ }
+ }
return string(out)
}
diff --git a/src/runtime/runtime-gdb_test.go b/src/runtime/runtime-gdb_test.go
index efc09c67e4..d3a30870c1 100644
--- a/src/runtime/runtime-gdb_test.go
+++ b/src/runtime/runtime-gdb_test.go
@@ -6,6 +6,7 @@ package runtime_test
import (
"bytes"
+ "context"
"fmt"
"internal/testenv"
"os"
@@ -16,6 +17,7 @@ import (
"strconv"
"strings"
"testing"
+ "time"
)
// NOTE: In some configurations, GDB will segfault when sent a SIGWINCH signal.
@@ -428,7 +430,9 @@ func TestGdbBacktrace(t *testing.T) {
"-ex", "continue",
filepath.Join(dir, "a.exe"),
}
- got, err := testenv.RunWithTimeout(t, exec.Command("gdb", args...))
+ ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
+ defer cancel()
+ got, err := testenv.CommandContext(t, ctx, "gdb", args...).CombinedOutput()
t.Logf("gdb output:\n%s", got)
if err != nil {
if bytes.Contains(got, []byte("internal-error: wait returned unexpected status 0x0")) {