2014-02-25 11:17:48 -05:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
2014-07-08 16:25:22 -04:00
|
|
|
"encoding/json"
|
2014-02-25 11:17:48 -05:00
|
|
|
"fmt"
|
|
|
|
"io"
|
|
|
|
"os/exec"
|
2014-07-08 16:25:22 -04:00
|
|
|
"reflect"
|
2014-02-25 11:17:48 -05:00
|
|
|
"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)
|
|
|
|
}
|
|
|
|
}
|
2014-04-03 20:57:41 -04:00
|
|
|
|
|
|
|
func nLines(s string) int {
|
|
|
|
return strings.Count(s, "\n")
|
|
|
|
}
|
2014-07-08 16:25:22 -04:00
|
|
|
|
|
|
|
func unmarshalJSON(data []byte, result interface{}) error {
|
|
|
|
err := json.Unmarshal(data, result)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func deepEqual(expected interface{}, result interface{}) bool {
|
|
|
|
return reflect.DeepEqual(result, expected)
|
|
|
|
}
|
|
|
|
|
|
|
|
func convertSliceOfStringsToMap(input []string) map[string]struct{} {
|
|
|
|
output := make(map[string]struct{})
|
|
|
|
for _, v := range input {
|
|
|
|
output[v] = struct{}{}
|
|
|
|
}
|
|
|
|
return output
|
|
|
|
}
|