docker_cli_wait_test.go 3.4 KB

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