utils.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. package main
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io"
  7. "net/http"
  8. "net/http/httptest"
  9. "os"
  10. "os/exec"
  11. "reflect"
  12. "strings"
  13. "syscall"
  14. "testing"
  15. "time"
  16. "github.com/docker/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar"
  17. )
  18. func getExitCode(err error) (int, error) {
  19. exitCode := 0
  20. if exiterr, ok := err.(*exec.ExitError); ok {
  21. if procExit := exiterr.Sys().(syscall.WaitStatus); ok {
  22. return procExit.ExitStatus(), nil
  23. }
  24. }
  25. return exitCode, fmt.Errorf("failed to get exit code")
  26. }
  27. func runCommandWithOutput(cmd *exec.Cmd) (output string, exitCode int, err error) {
  28. exitCode = 0
  29. out, err := cmd.CombinedOutput()
  30. if err != nil {
  31. var exiterr error
  32. if exitCode, exiterr = getExitCode(err); exiterr != nil {
  33. // TODO: Fix this so we check the error's text.
  34. // we've failed to retrieve exit code, so we set it to 127
  35. exitCode = 127
  36. }
  37. }
  38. output = string(out)
  39. return
  40. }
  41. func runCommandWithStdoutStderr(cmd *exec.Cmd) (stdout string, stderr string, exitCode int, err error) {
  42. exitCode = 0
  43. var stderrBuffer bytes.Buffer
  44. stderrPipe, err := cmd.StderrPipe()
  45. if err != nil {
  46. return "", "", -1, err
  47. }
  48. go io.Copy(&stderrBuffer, stderrPipe)
  49. out, err := cmd.Output()
  50. if err != nil {
  51. var exiterr error
  52. if exitCode, exiterr = getExitCode(err); exiterr != nil {
  53. // TODO: Fix this so we check the error's text.
  54. // we've failed to retrieve exit code, so we set it to 127
  55. exitCode = 127
  56. }
  57. }
  58. stdout = string(out)
  59. stderr = string(stderrBuffer.Bytes())
  60. return
  61. }
  62. func runCommand(cmd *exec.Cmd) (exitCode int, err error) {
  63. exitCode = 0
  64. err = cmd.Run()
  65. if err != nil {
  66. var exiterr error
  67. if exitCode, exiterr = getExitCode(err); exiterr != nil {
  68. // TODO: Fix this so we check the error's text.
  69. // we've failed to retrieve exit code, so we set it to 127
  70. exitCode = 127
  71. }
  72. }
  73. return
  74. }
  75. func startCommand(cmd *exec.Cmd) (exitCode int, err error) {
  76. exitCode = 0
  77. err = cmd.Start()
  78. if err != nil {
  79. var exiterr error
  80. if exitCode, exiterr = getExitCode(err); exiterr != nil {
  81. // TODO: Fix this so we check the error's text.
  82. // we've failed to retrieve exit code, so we set it to 127
  83. exitCode = 127
  84. }
  85. }
  86. return
  87. }
  88. func logDone(message string) {
  89. fmt.Printf("[PASSED]: %s\n", message)
  90. }
  91. func stripTrailingCharacters(target string) string {
  92. target = strings.Trim(target, "\n")
  93. target = strings.Trim(target, " ")
  94. return target
  95. }
  96. func errorOut(err error, t *testing.T, message string) {
  97. if err != nil {
  98. t.Fatal(message)
  99. }
  100. }
  101. func errorOutOnNonNilError(err error, t *testing.T, message string) {
  102. if err == nil {
  103. t.Fatalf(message)
  104. }
  105. }
  106. func nLines(s string) int {
  107. return strings.Count(s, "\n")
  108. }
  109. func unmarshalJSON(data []byte, result interface{}) error {
  110. err := json.Unmarshal(data, result)
  111. if err != nil {
  112. return err
  113. }
  114. return nil
  115. }
  116. func deepEqual(expected interface{}, result interface{}) bool {
  117. return reflect.DeepEqual(result, expected)
  118. }
  119. func convertSliceOfStringsToMap(input []string) map[string]struct{} {
  120. output := make(map[string]struct{})
  121. for _, v := range input {
  122. output[v] = struct{}{}
  123. }
  124. return output
  125. }
  126. func waitForContainer(contId string, args ...string) error {
  127. args = append([]string{"run", "--name", contId}, args...)
  128. cmd := exec.Command(dockerBinary, args...)
  129. if _, err := runCommand(cmd); err != nil {
  130. return err
  131. }
  132. if err := waitRun(contId); err != nil {
  133. return err
  134. }
  135. return nil
  136. }
  137. func waitRun(contId string) error {
  138. after := time.After(5 * time.Second)
  139. for {
  140. cmd := exec.Command(dockerBinary, "inspect", "-f", "{{.State.Running}}", contId)
  141. out, _, err := runCommandWithOutput(cmd)
  142. if err != nil {
  143. return fmt.Errorf("error executing docker inspect: %v", err)
  144. }
  145. if strings.Contains(out, "true") {
  146. break
  147. }
  148. select {
  149. case <-after:
  150. return fmt.Errorf("container did not come up in time")
  151. default:
  152. }
  153. time.Sleep(100 * time.Millisecond)
  154. }
  155. return nil
  156. }
  157. func compareDirectoryEntries(e1 []os.FileInfo, e2 []os.FileInfo) error {
  158. var (
  159. e1Entries = make(map[string]struct{})
  160. e2Entries = make(map[string]struct{})
  161. )
  162. for _, e := range e1 {
  163. e1Entries[e.Name()] = struct{}{}
  164. }
  165. for _, e := range e2 {
  166. e2Entries[e.Name()] = struct{}{}
  167. }
  168. if !reflect.DeepEqual(e1Entries, e2Entries) {
  169. return fmt.Errorf("entries differ")
  170. }
  171. return nil
  172. }
  173. func ListTar(f io.Reader) ([]string, error) {
  174. tr := tar.NewReader(f)
  175. var entries []string
  176. for {
  177. th, err := tr.Next()
  178. if err == io.EOF {
  179. // end of tar archive
  180. return entries, nil
  181. }
  182. if err != nil {
  183. return entries, err
  184. }
  185. entries = append(entries, th.Name)
  186. }
  187. }
  188. type FileServer struct {
  189. *httptest.Server
  190. }
  191. func fileServer(files map[string]string) (*FileServer, error) {
  192. var handler http.HandlerFunc = func(w http.ResponseWriter, r *http.Request) {
  193. if filePath, found := files[r.URL.Path]; found {
  194. http.ServeFile(w, r, filePath)
  195. } else {
  196. http.Error(w, http.StatusText(404), 404)
  197. }
  198. }
  199. for _, file := range files {
  200. if _, err := os.Stat(file); err != nil {
  201. return nil, err
  202. }
  203. }
  204. server := httptest.NewServer(handler)
  205. return &FileServer{
  206. Server: server,
  207. }, nil
  208. }