utils.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package main
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io"
  7. "os"
  8. "os/exec"
  9. "reflect"
  10. "strings"
  11. "syscall"
  12. "testing"
  13. "time"
  14. )
  15. func getExitCode(err error) (int, error) {
  16. exitCode := 0
  17. if exiterr, ok := err.(*exec.ExitError); ok {
  18. if procExit := exiterr.Sys().(syscall.WaitStatus); ok {
  19. return procExit.ExitStatus(), nil
  20. }
  21. }
  22. return exitCode, fmt.Errorf("failed to get exit code")
  23. }
  24. func runCommandWithOutput(cmd *exec.Cmd) (output string, exitCode int, err error) {
  25. exitCode = 0
  26. out, err := cmd.CombinedOutput()
  27. if err != nil {
  28. var exiterr error
  29. if exitCode, exiterr = getExitCode(err); exiterr != nil {
  30. // TODO: Fix this so we check the error's text.
  31. // we've failed to retrieve exit code, so we set it to 127
  32. exitCode = 127
  33. }
  34. }
  35. output = string(out)
  36. return
  37. }
  38. func runCommandWithStdoutStderr(cmd *exec.Cmd) (stdout string, stderr string, exitCode int, err error) {
  39. exitCode = 0
  40. var stderrBuffer bytes.Buffer
  41. stderrPipe, err := cmd.StderrPipe()
  42. if err != nil {
  43. return "", "", -1, err
  44. }
  45. go io.Copy(&stderrBuffer, stderrPipe)
  46. out, err := cmd.Output()
  47. if err != nil {
  48. var exiterr error
  49. if exitCode, exiterr = getExitCode(err); exiterr != nil {
  50. // TODO: Fix this so we check the error's text.
  51. // we've failed to retrieve exit code, so we set it to 127
  52. exitCode = 127
  53. }
  54. }
  55. stdout = string(out)
  56. stderr = string(stderrBuffer.Bytes())
  57. return
  58. }
  59. func runCommand(cmd *exec.Cmd) (exitCode int, err error) {
  60. exitCode = 0
  61. err = cmd.Run()
  62. if err != nil {
  63. var exiterr error
  64. if exitCode, exiterr = getExitCode(err); exiterr != nil {
  65. // TODO: Fix this so we check the error's text.
  66. // we've failed to retrieve exit code, so we set it to 127
  67. exitCode = 127
  68. }
  69. }
  70. return
  71. }
  72. func startCommand(cmd *exec.Cmd) (exitCode int, err error) {
  73. exitCode = 0
  74. err = cmd.Start()
  75. if err != nil {
  76. var exiterr error
  77. if exitCode, exiterr = getExitCode(err); exiterr != nil {
  78. // TODO: Fix this so we check the error's text.
  79. // we've failed to retrieve exit code, so we set it to 127
  80. exitCode = 127
  81. }
  82. }
  83. return
  84. }
  85. func logDone(message string) {
  86. fmt.Printf("[PASSED]: %s\n", message)
  87. }
  88. func stripTrailingCharacters(target string) string {
  89. target = strings.Trim(target, "\n")
  90. target = strings.Trim(target, " ")
  91. return target
  92. }
  93. func errorOut(err error, t *testing.T, message string) {
  94. if err != nil {
  95. t.Fatal(message)
  96. }
  97. }
  98. func errorOutOnNonNilError(err error, t *testing.T, message string) {
  99. if err == nil {
  100. t.Fatalf(message)
  101. }
  102. }
  103. func nLines(s string) int {
  104. return strings.Count(s, "\n")
  105. }
  106. func unmarshalJSON(data []byte, result interface{}) error {
  107. err := json.Unmarshal(data, result)
  108. if err != nil {
  109. return err
  110. }
  111. return nil
  112. }
  113. func deepEqual(expected interface{}, result interface{}) bool {
  114. return reflect.DeepEqual(result, expected)
  115. }
  116. func convertSliceOfStringsToMap(input []string) map[string]struct{} {
  117. output := make(map[string]struct{})
  118. for _, v := range input {
  119. output[v] = struct{}{}
  120. }
  121. return output
  122. }
  123. func waitForContainer(contId string, args ...string) error {
  124. args = append([]string{"run", "--name", contId}, args...)
  125. cmd := exec.Command(dockerBinary, args...)
  126. if _, err := runCommand(cmd); err != nil {
  127. return err
  128. }
  129. if err := waitRun(contId); err != nil {
  130. return err
  131. }
  132. return nil
  133. }
  134. func waitRun(contId string) error {
  135. after := time.After(5 * time.Second)
  136. for {
  137. cmd := exec.Command(dockerBinary, "inspect", "-f", "{{.State.Running}}", contId)
  138. out, _, err := runCommandWithOutput(cmd)
  139. if err != nil {
  140. return fmt.Errorf("error executing docker inspect: %v", err)
  141. }
  142. if strings.Contains(out, "true") {
  143. break
  144. }
  145. select {
  146. case <-after:
  147. return fmt.Errorf("container did not come up in time")
  148. default:
  149. }
  150. time.Sleep(100 * time.Millisecond)
  151. }
  152. return nil
  153. }
  154. func compareDirectoryEntries(e1 []os.FileInfo, e2 []os.FileInfo) error {
  155. var (
  156. e1Entries = make(map[string]struct{})
  157. e2Entries = make(map[string]struct{})
  158. )
  159. for _, e := range e1 {
  160. e1Entries[e.Name()] = struct{}{}
  161. }
  162. for _, e := range e2 {
  163. e2Entries[e.Name()] = struct{}{}
  164. }
  165. if !reflect.DeepEqual(e1Entries, e2Entries) {
  166. return fmt.Errorf("entries differ")
  167. }
  168. return nil
  169. }