docker_cli_wait_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package main
  2. import (
  3. "bytes"
  4. "os/exec"
  5. "strings"
  6. "time"
  7. "github.com/go-check/check"
  8. )
  9. // non-blocking wait with 0 exit code
  10. func (s *DockerSuite) TestWaitNonBlockedExitZero(c *check.C) {
  11. testRequires(c, DaemonIsLinux)
  12. out, _ := dockerCmd(c, "run", "-d", "busybox", "sh", "-c", "true")
  13. containerID := strings.TrimSpace(out)
  14. if err := waitInspect(containerID, "{{.State.Running}}", "false", 1); err != nil {
  15. c.Fatal("Container should have stopped by now")
  16. }
  17. out, _ = dockerCmd(c, "wait", containerID)
  18. if strings.TrimSpace(out) != "0" {
  19. c.Fatal("failed to set up container", out)
  20. }
  21. }
  22. // blocking wait with 0 exit code
  23. func (s *DockerSuite) TestWaitBlockedExitZero(c *check.C) {
  24. testRequires(c, DaemonIsLinux)
  25. out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "trap 'exit 0' TERM; while true; do sleep 0.01; done")
  26. containerID := strings.TrimSpace(out)
  27. c.Assert(waitRun(containerID), check.IsNil)
  28. chWait := make(chan string)
  29. go func() {
  30. out, _, _ := runCommandWithOutput(exec.Command(dockerBinary, "wait", containerID))
  31. chWait <- out
  32. }()
  33. time.Sleep(100 * time.Millisecond)
  34. dockerCmd(c, "stop", containerID)
  35. select {
  36. case status := <-chWait:
  37. if strings.TrimSpace(status) != "0" {
  38. c.Fatalf("expected exit 0, got %s", status)
  39. }
  40. case <-time.After(2 * time.Second):
  41. c.Fatal("timeout waiting for `docker wait` to exit")
  42. }
  43. }
  44. // non-blocking wait with random exit code
  45. func (s *DockerSuite) TestWaitNonBlockedExitRandom(c *check.C) {
  46. testRequires(c, DaemonIsLinux)
  47. out, _ := dockerCmd(c, "run", "-d", "busybox", "sh", "-c", "exit 99")
  48. containerID := strings.TrimSpace(out)
  49. if err := waitInspect(containerID, "{{.State.Running}}", "false", 1); err != nil {
  50. c.Fatal("Container should have stopped by now")
  51. }
  52. out, _ = dockerCmd(c, "wait", containerID)
  53. if strings.TrimSpace(out) != "99" {
  54. c.Fatal("failed to set up container", out)
  55. }
  56. }
  57. // blocking wait with random exit code
  58. func (s *DockerSuite) TestWaitBlockedExitRandom(c *check.C) {
  59. testRequires(c, DaemonIsLinux)
  60. out, _ := dockerCmd(c, "run", "-d", "busybox", "/bin/sh", "-c", "trap 'exit 99' TERM; while true; do sleep 0.01; done")
  61. containerID := strings.TrimSpace(out)
  62. c.Assert(waitRun(containerID), check.IsNil)
  63. chWait := make(chan error)
  64. waitCmd := exec.Command(dockerBinary, "wait", containerID)
  65. waitCmdOut := bytes.NewBuffer(nil)
  66. waitCmd.Stdout = waitCmdOut
  67. if err := waitCmd.Start(); err != nil {
  68. c.Fatal(err)
  69. }
  70. go func() {
  71. chWait <- waitCmd.Wait()
  72. }()
  73. dockerCmd(c, "stop", containerID)
  74. select {
  75. case err := <-chWait:
  76. if err != nil {
  77. c.Fatal(err)
  78. }
  79. status, err := waitCmdOut.ReadString('\n')
  80. if err != nil {
  81. c.Fatal(err)
  82. }
  83. if strings.TrimSpace(status) != "99" {
  84. c.Fatalf("expected exit 99, got %s", status)
  85. }
  86. case <-time.After(2 * time.Second):
  87. waitCmd.Process.Kill()
  88. c.Fatal("timeout waiting for `docker wait` to exit")
  89. }
  90. }