110 lines
2.4 KiB
Go
110 lines
2.4 KiB
Go
![]() |
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)
|
||
|
}
|
||
|
}
|