Handle executable not found in exec

This commit is contained in:
Sami Wagiaalla
2015-10-29 15:24:19 -04:00
parent 13e68d2a87
commit 4d373b133a
2 changed files with 22 additions and 6 deletions

View File

@@ -21,6 +21,9 @@ import (
"syscall"
)
// ErrExecutableNotFound is returned if the executable is not found.
var ErrExecutableNotFound = osexec.ErrNotFound
// Interface is an interface that presents a subset of the os/exec API. Use this
// when you want to inject fakeable/mockable exec behavior.
type Interface interface {
@@ -81,13 +84,17 @@ func (cmd *cmdWrapper) SetDir(dir string) {
func (cmd *cmdWrapper) CombinedOutput() ([]byte, error) {
out, err := (*osexec.Cmd)(cmd).CombinedOutput()
if err != nil {
ee, ok := err.(*osexec.ExitError)
if !ok {
return out, err
if ee, ok := err.(*osexec.ExitError); ok {
// Force a compile fail if exitErrorWrapper can't convert to ExitError.
var x ExitError = &exitErrorWrapper{ee}
return out, x
}
// Force a compile fail if exitErrorWrapper can't convert to ExitError.
var x ExitError = &exitErrorWrapper{ee}
return out, x
if ee, ok := err.(*osexec.Error); ok {
if ee.Err == osexec.ErrNotFound {
return out, ErrExecutableNotFound
}
}
return out, err
}
return out, nil
}

View File

@@ -92,3 +92,12 @@ func TestLookPath(t *testing.T) {
t.Errorf("unexpected result for LookPath: got %s, expected %s", sh, shExpected)
}
}
func TestExecutableNotFound(t *testing.T) {
exec := New()
cmd := exec.Command("fake_executable_name")
_, err := cmd.CombinedOutput()
if err != ErrExecutableNotFound {
t.Errorf("Expected error ErrExecutableNotFound but got %v", err)
}
}