aboutsummaryrefslogtreecommitdiff
path: root/src/internal/testenv/exec.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/internal/testenv/exec.go')
-rw-r--r--src/internal/testenv/exec.go20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/internal/testenv/exec.go b/src/internal/testenv/exec.go
index ebb70a1375..0e6a5f9a1a 100644
--- a/src/internal/testenv/exec.go
+++ b/src/internal/testenv/exec.go
@@ -62,7 +62,7 @@ var tryExec = sync.OnceValue(func() error {
// We know that this is a test executable. We should be able to run it with a
// no-op flag to check for overall exec support.
- exe, err := os.Executable()
+ exe, err := exePath()
if err != nil {
return fmt.Errorf("can't probe for exec support: %w", err)
}
@@ -71,6 +71,24 @@ var tryExec = sync.OnceValue(func() error {
return cmd.Run()
})
+// Executable is a wrapper around [MustHaveExec] and [os.Executable].
+// It returns the path name for the executable that started the current process,
+// or skips the test if the current system can't start new processes,
+// or fails the test if the path can not be obtained.
+func Executable(t testing.TB) string {
+ MustHaveExec(t)
+
+ exe, err := exePath()
+ if err != nil {
+ t.Fatalf("os.Executable error: %v", err)
+ }
+ return exe
+}
+
+var exePath = sync.OnceValues(func() (string, error) {
+ return os.Executable()
+})
+
var execPaths sync.Map // path -> error
// MustHaveExecPath checks that the current system can start the named executable