| package main |
| |
| import ( |
| "bytes" |
| "fmt" |
| "io" |
| "os/exec" |
| "strings" |
| "syscall" |
| "testing" |
| ) |
| |
| func getExitCode(err error) (int, error) { |
| exitCode := 0 |
| if exiterr, ok := err.(*exec.ExitError); ok { |
| if procExit := exiterr.Sys().(syscall.WaitStatus); ok { |
| return procExit.ExitStatus(), nil |
| } |
| } |
| return exitCode, fmt.Errorf("failed to get exit code") |
| } |
| |
| func runCommandWithOutput(cmd *exec.Cmd) (output string, exitCode int, err error) { |
| exitCode = 0 |
| out, err := cmd.CombinedOutput() |
| if err != nil { |
| var exiterr error |
| if exitCode, exiterr = getExitCode(err); exiterr != nil { |
| // TODO: Fix this so we check the error's text. |
| // we've failed to retrieve exit code, so we set it to 127 |
| exitCode = 127 |
| } |
| } |
| output = string(out) |
| return |
| } |
| |
| func runCommandWithStdoutStderr(cmd *exec.Cmd) (stdout string, stderr string, exitCode int, err error) { |
| exitCode = 0 |
| var stderrBuffer bytes.Buffer |
| stderrPipe, err := cmd.StderrPipe() |
| if err != nil { |
| return "", "", -1, err |
| } |
| go io.Copy(&stderrBuffer, stderrPipe) |
| out, err := cmd.Output() |
| |
| if err != nil { |
| var exiterr error |
| if exitCode, exiterr = getExitCode(err); exiterr != nil { |
| // TODO: Fix this so we check the error's text. |
| // we've failed to retrieve exit code, so we set it to 127 |
| exitCode = 127 |
| } |
| } |
| stdout = string(out) |
| stderr = string(stderrBuffer.Bytes()) |
| return |
| } |
| |
| func runCommand(cmd *exec.Cmd) (exitCode int, err error) { |
| exitCode = 0 |
| err = cmd.Run() |
| if err != nil { |
| var exiterr error |
| if exitCode, exiterr = getExitCode(err); exiterr != nil { |
| // TODO: Fix this so we check the error's text. |
| // we've failed to retrieve exit code, so we set it to 127 |
| exitCode = 127 |
| } |
| } |
| return |
| } |
| |
| func startCommand(cmd *exec.Cmd) (exitCode int, err error) { |
| exitCode = 0 |
| err = cmd.Start() |
| if err != nil { |
| var exiterr error |
| if exitCode, exiterr = getExitCode(err); exiterr != nil { |
| // TODO: Fix this so we check the error's text. |
| // we've failed to retrieve exit code, so we set it to 127 |
| exitCode = 127 |
| } |
| } |
| return |
| } |
| |
| func logDone(message string) { |
| fmt.Printf("[PASSED]: %s\n", message) |
| } |
| |
| func stripTrailingCharacters(target string) string { |
| target = strings.Trim(target, "\n") |
| target = strings.Trim(target, " ") |
| return target |
| } |
| |
| func errorOut(err error, t *testing.T, message string) { |
| if err != nil { |
| t.Fatal(message) |
| } |
| } |
| |
| func errorOutOnNonNilError(err error, t *testing.T, message string) { |
| if err == nil { |
| t.Fatalf(message) |
| } |
| } |
| |
| func nLines(s string) int { |
| return strings.Count(s, "\n") |
| } |