utils.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package main
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io"
  6. "os/exec"
  7. "strings"
  8. "syscall"
  9. "testing"
  10. )
  11. func getExitCode(err error) (int, error) {
  12. exitCode := 0
  13. if exiterr, ok := err.(*exec.ExitError); ok {
  14. if procExit := exiterr.Sys().(syscall.WaitStatus); ok {
  15. return procExit.ExitStatus(), nil
  16. }
  17. }
  18. return exitCode, fmt.Errorf("failed to get exit code")
  19. }
  20. func runCommandWithOutput(cmd *exec.Cmd) (output string, exitCode int, err error) {
  21. exitCode = 0
  22. out, err := cmd.CombinedOutput()
  23. if err != nil {
  24. var exiterr error
  25. if exitCode, exiterr = getExitCode(err); exiterr != nil {
  26. // TODO: Fix this so we check the error's text.
  27. // we've failed to retrieve exit code, so we set it to 127
  28. exitCode = 127
  29. }
  30. }
  31. output = string(out)
  32. return
  33. }
  34. func runCommandWithStdoutStderr(cmd *exec.Cmd) (stdout string, stderr string, exitCode int, err error) {
  35. exitCode = 0
  36. var stderrBuffer bytes.Buffer
  37. stderrPipe, err := cmd.StderrPipe()
  38. if err != nil {
  39. return "", "", -1, err
  40. }
  41. go io.Copy(&stderrBuffer, stderrPipe)
  42. out, err := cmd.Output()
  43. if err != nil {
  44. var exiterr error
  45. if exitCode, exiterr = getExitCode(err); exiterr != nil {
  46. // TODO: Fix this so we check the error's text.
  47. // we've failed to retrieve exit code, so we set it to 127
  48. exitCode = 127
  49. }
  50. }
  51. stdout = string(out)
  52. stderr = string(stderrBuffer.Bytes())
  53. return
  54. }
  55. func runCommand(cmd *exec.Cmd) (exitCode int, err error) {
  56. exitCode = 0
  57. err = cmd.Run()
  58. if err != nil {
  59. var exiterr error
  60. if exitCode, exiterr = getExitCode(err); exiterr != nil {
  61. // TODO: Fix this so we check the error's text.
  62. // we've failed to retrieve exit code, so we set it to 127
  63. exitCode = 127
  64. }
  65. }
  66. return
  67. }
  68. func startCommand(cmd *exec.Cmd) (exitCode int, err error) {
  69. exitCode = 0
  70. err = cmd.Start()
  71. if err != nil {
  72. var exiterr error
  73. if exitCode, exiterr = getExitCode(err); exiterr != nil {
  74. // TODO: Fix this so we check the error's text.
  75. // we've failed to retrieve exit code, so we set it to 127
  76. exitCode = 127
  77. }
  78. }
  79. return
  80. }
  81. func logDone(message string) {
  82. fmt.Printf("[PASSED]: %s\n", message)
  83. }
  84. func stripTrailingCharacters(target string) string {
  85. target = strings.Trim(target, "\n")
  86. target = strings.Trim(target, " ")
  87. return target
  88. }
  89. func errorOut(err error, t *testing.T, message string) {
  90. if err != nil {
  91. t.Fatal(message)
  92. }
  93. }
  94. func errorOutOnNonNilError(err error, t *testing.T, message string) {
  95. if err == nil {
  96. t.Fatalf(message)
  97. }
  98. }
  99. func nLines(s string) int {
  100. return strings.Count(s, "\n")
  101. }