mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-14 20:37:55 -05:00
f6ab9553f4
Closes #10411
73 lines
1.9 KiB
Go
73 lines
1.9 KiB
Go
// Copyright 2015 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package testenv
|
|
|
|
import (
|
|
"os"
|
|
"os/exec"
|
|
"runtime"
|
|
"strings"
|
|
"sync"
|
|
"testing"
|
|
)
|
|
|
|
// HasExec reports whether the current system can start new processes
|
|
// using os.StartProcess or (more commonly) exec.Command.
|
|
func HasExec() bool {
|
|
switch runtime.GOOS {
|
|
case "js", "ios":
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
// MustHaveExec checks that the current system can start new processes
|
|
// using os.StartProcess or (more commonly) exec.Command.
|
|
// If not, MustHaveExec calls t.Skip with an explanation.
|
|
func MustHaveExec(t testing.TB) {
|
|
if !HasExec() {
|
|
t.Skipf("skipping test: cannot exec subprocess on %s/%s", runtime.GOOS, runtime.GOARCH)
|
|
}
|
|
}
|
|
|
|
var execPaths sync.Map // path -> error
|
|
|
|
// MustHaveExecPath checks that the current system can start the named executable
|
|
// using os.StartProcess or (more commonly) exec.Command.
|
|
// If not, MustHaveExecPath calls t.Skip with an explanation.
|
|
func MustHaveExecPath(t testing.TB, path string) {
|
|
MustHaveExec(t)
|
|
|
|
err, found := execPaths.Load(path)
|
|
if !found {
|
|
_, err = exec.LookPath(path)
|
|
err, _ = execPaths.LoadOrStore(path, err)
|
|
}
|
|
if err != nil {
|
|
t.Skipf("skipping test: %s: %s", path, err)
|
|
}
|
|
}
|
|
|
|
// CleanCmdEnv will fill cmd.Env with the environment, excluding certain
|
|
// variables that could modify the behavior of the Go tools such as
|
|
// GODEBUG and GOTRACEBACK.
|
|
func CleanCmdEnv(cmd *exec.Cmd) *exec.Cmd {
|
|
if cmd.Env != nil {
|
|
panic("environment already set")
|
|
}
|
|
for _, env := range os.Environ() {
|
|
// Exclude GODEBUG from the environment to prevent its output
|
|
// from breaking tests that are trying to parse other command output.
|
|
if strings.HasPrefix(env, "GODEBUG=") {
|
|
continue
|
|
}
|
|
// Exclude GOTRACEBACK for the same reason.
|
|
if strings.HasPrefix(env, "GOTRACEBACK=") {
|
|
continue
|
|
}
|
|
cmd.Env = append(cmd.Env, env)
|
|
}
|
|
return cmd
|
|
}
|