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