package cmd import ( "runtime" "strings" "testing" "time" "github.com/stretchr/testify/assert" ) func TestRunCommand(t *testing.T) { // TODO Windows: Port this test if runtime.GOOS == "windows" { t.Skip("Needs porting to Windows") } var cmd string if runtime.GOOS == "solaris" { cmd = "gls" } else { cmd = "ls" } result := RunCommand(cmd) result.Assert(t, Expected{}) result = RunCommand("doesnotexists") expectedError := `exec: "doesnotexists": executable file not found` result.Assert(t, Expected{ExitCode: 127, Error: expectedError}) result = RunCommand(cmd, "-z") result.Assert(t, Expected{ ExitCode: 2, Error: "exit status 2", Err: "invalid option", }) assert.Contains(t, result.Combined(), "invalid option") } func TestRunCommandWithCombined(t *testing.T) { // TODO Windows: Port this test if runtime.GOOS == "windows" { t.Skip("Needs porting to Windows") } result := RunCommand("ls", "-a") result.Assert(t, Expected{}) assert.Contains(t, result.Combined(), "..") assert.Contains(t, result.Stdout(), "..") } func TestRunCommandWithTimeoutFinished(t *testing.T) { // TODO Windows: Port this test if runtime.GOOS == "windows" { t.Skip("Needs porting to Windows") } result := RunCmd(Cmd{ Command: []string{"ls", "-a"}, Timeout: 50 * time.Millisecond, }) result.Assert(t, Expected{Out: ".."}) } func TestRunCommandWithTimeoutKilled(t *testing.T) { // TODO Windows: Port this test if runtime.GOOS == "windows" { t.Skip("Needs porting to Windows") } command := []string{"sh", "-c", "while true ; do echo 1 ; sleep .5 ; done"} result := RunCmd(Cmd{Command: command, Timeout: 1250 * time.Millisecond}) result.Assert(t, Expected{Timeout: true}) ones := strings.Split(result.Stdout(), "\n") assert.Len(t, ones, 4) } func TestRunCommandWithErrors(t *testing.T) { result := RunCommand("/foobar") result.Assert(t, Expected{Error: "foobar", ExitCode: 127}) } func TestRunCommandWithStdoutStderr(t *testing.T) { result := RunCommand("echo", "hello", "world") result.Assert(t, Expected{Out: "hello world\n", Err: None}) } func TestRunCommandWithStdoutStderrError(t *testing.T) { result := RunCommand("doesnotexists") expected := `exec: "doesnotexists": executable file not found` result.Assert(t, Expected{Out: None, Err: None, ExitCode: 127, Error: expected}) switch runtime.GOOS { case "windows": expected = "ls: unknown option" case "solaris": expected = "gls: invalid option" default: expected = "ls: invalid option" } var cmd string if runtime.GOOS == "solaris" { cmd = "gls" } else { cmd = "ls" } result = RunCommand(cmd, "-z") result.Assert(t, Expected{ Out: None, Err: expected, ExitCode: 2, Error: "exit status 2", }) }