container_wait_test.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package client // import "github.com/docker/docker/client"
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "fmt"
  7. "io"
  8. "log"
  9. "net/http"
  10. "strings"
  11. "testing"
  12. "time"
  13. "github.com/docker/docker/api/types/container"
  14. "github.com/docker/docker/errdefs"
  15. "gotest.tools/v3/assert"
  16. is "gotest.tools/v3/assert/cmp"
  17. )
  18. func TestContainerWaitError(t *testing.T) {
  19. client := &Client{
  20. client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
  21. }
  22. resultC, errC := client.ContainerWait(context.Background(), "nothing", "")
  23. select {
  24. case result := <-resultC:
  25. t.Fatalf("expected to not get a wait result, got %d", result.StatusCode)
  26. case err := <-errC:
  27. assert.Check(t, is.ErrorType(err, errdefs.IsSystem))
  28. }
  29. }
  30. func TestContainerWait(t *testing.T) {
  31. expectedURL := "/containers/container_id/wait"
  32. client := &Client{
  33. client: newMockClient(func(req *http.Request) (*http.Response, error) {
  34. if !strings.HasPrefix(req.URL.Path, expectedURL) {
  35. return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL)
  36. }
  37. b, err := json.Marshal(container.WaitResponse{
  38. StatusCode: 15,
  39. })
  40. if err != nil {
  41. return nil, err
  42. }
  43. return &http.Response{
  44. StatusCode: http.StatusOK,
  45. Body: io.NopCloser(bytes.NewReader(b)),
  46. }, nil
  47. }),
  48. }
  49. resultC, errC := client.ContainerWait(context.Background(), "container_id", "")
  50. select {
  51. case err := <-errC:
  52. t.Fatal(err)
  53. case result := <-resultC:
  54. if result.StatusCode != 15 {
  55. t.Fatalf("expected a status code equal to '15', got %d", result.StatusCode)
  56. }
  57. }
  58. }
  59. func TestContainerWaitProxyInterrupt(t *testing.T) {
  60. expectedURL := "/v1.30/containers/container_id/wait"
  61. msg := "copying response body from Docker: unexpected EOF"
  62. client := &Client{
  63. version: "1.30",
  64. client: newMockClient(func(req *http.Request) (*http.Response, error) {
  65. if !strings.HasPrefix(req.URL.Path, expectedURL) {
  66. return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL)
  67. }
  68. return &http.Response{
  69. StatusCode: http.StatusOK,
  70. Body: io.NopCloser(strings.NewReader(msg)),
  71. }, nil
  72. }),
  73. }
  74. resultC, errC := client.ContainerWait(context.Background(), "container_id", "")
  75. select {
  76. case err := <-errC:
  77. if !strings.Contains(err.Error(), msg) {
  78. t.Fatalf("Expected: %s, Actual: %s", msg, err.Error())
  79. }
  80. case result := <-resultC:
  81. t.Fatalf("Unexpected result: %v", result)
  82. }
  83. }
  84. func TestContainerWaitProxyInterruptLong(t *testing.T) {
  85. expectedURL := "/v1.30/containers/container_id/wait"
  86. msg := strings.Repeat("x", containerWaitErrorMsgLimit*5)
  87. client := &Client{
  88. version: "1.30",
  89. client: newMockClient(func(req *http.Request) (*http.Response, error) {
  90. if !strings.HasPrefix(req.URL.Path, expectedURL) {
  91. return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL)
  92. }
  93. return &http.Response{
  94. StatusCode: http.StatusOK,
  95. Body: io.NopCloser(strings.NewReader(msg)),
  96. }, nil
  97. }),
  98. }
  99. resultC, errC := client.ContainerWait(context.Background(), "container_id", "")
  100. select {
  101. case err := <-errC:
  102. // LimitReader limiting isn't exact, because of how the Readers do chunking.
  103. if len(err.Error()) > containerWaitErrorMsgLimit*2 {
  104. t.Fatalf("Expected error to be limited around %d, actual length: %d", containerWaitErrorMsgLimit, len(err.Error()))
  105. }
  106. case result := <-resultC:
  107. t.Fatalf("Unexpected result: %v", result)
  108. }
  109. }
  110. func ExampleClient_ContainerWait_withTimeout() {
  111. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  112. defer cancel()
  113. client, _ := NewClientWithOpts(FromEnv)
  114. _, errC := client.ContainerWait(ctx, "container_id", "")
  115. if err := <-errC; err != nil {
  116. log.Fatal(err)
  117. }
  118. }