events_test.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. package client // import "github.com/docker/docker/client"
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "fmt"
  7. "io"
  8. "net/http"
  9. "strings"
  10. "testing"
  11. "github.com/docker/docker/api/types"
  12. "github.com/docker/docker/api/types/events"
  13. "github.com/docker/docker/api/types/filters"
  14. "github.com/docker/docker/errdefs"
  15. "gotest.tools/v3/assert"
  16. is "gotest.tools/v3/assert/cmp"
  17. )
  18. func TestEventsErrorInOptions(t *testing.T) {
  19. errorCases := []struct {
  20. options types.EventsOptions
  21. expectedError string
  22. }{
  23. {
  24. options: types.EventsOptions{
  25. Since: "2006-01-02TZ",
  26. },
  27. expectedError: `parsing time "2006-01-02TZ"`,
  28. },
  29. {
  30. options: types.EventsOptions{
  31. Until: "2006-01-02TZ",
  32. },
  33. expectedError: `parsing time "2006-01-02TZ"`,
  34. },
  35. }
  36. for _, e := range errorCases {
  37. client := &Client{
  38. client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
  39. }
  40. _, errs := client.Events(context.Background(), e.options)
  41. err := <-errs
  42. if err == nil || !strings.Contains(err.Error(), e.expectedError) {
  43. t.Fatalf("expected an error %q, got %v", e.expectedError, err)
  44. }
  45. }
  46. }
  47. func TestEventsErrorFromServer(t *testing.T) {
  48. client := &Client{
  49. client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
  50. }
  51. _, errs := client.Events(context.Background(), types.EventsOptions{})
  52. err := <-errs
  53. assert.Check(t, is.ErrorType(err, errdefs.IsSystem))
  54. }
  55. func TestEvents(t *testing.T) {
  56. const expectedURL = "/events"
  57. fltrs := filters.NewArgs(filters.Arg("type", string(events.ContainerEventType)))
  58. expectedFiltersJSON := fmt.Sprintf(`{"type":{"%s":true}}`, events.ContainerEventType)
  59. eventsCases := []struct {
  60. options types.EventsOptions
  61. events []events.Message
  62. expectedEvents map[string]bool
  63. expectedQueryParams map[string]string
  64. }{
  65. {
  66. options: types.EventsOptions{
  67. Filters: fltrs,
  68. },
  69. expectedQueryParams: map[string]string{
  70. "filters": expectedFiltersJSON,
  71. },
  72. events: []events.Message{},
  73. expectedEvents: make(map[string]bool),
  74. },
  75. {
  76. options: types.EventsOptions{
  77. Filters: fltrs,
  78. },
  79. expectedQueryParams: map[string]string{
  80. "filters": expectedFiltersJSON,
  81. },
  82. events: []events.Message{
  83. {
  84. Type: events.BuilderEventType,
  85. Actor: events.Actor{ID: "1"},
  86. Action: events.ActionCreate,
  87. },
  88. {
  89. Type: events.BuilderEventType,
  90. Actor: events.Actor{ID: "1"},
  91. Action: events.ActionDie,
  92. },
  93. {
  94. Type: events.BuilderEventType,
  95. Actor: events.Actor{ID: "1"},
  96. Action: events.ActionCreate,
  97. },
  98. },
  99. expectedEvents: map[string]bool{
  100. "1": true,
  101. "2": true,
  102. "3": true,
  103. },
  104. },
  105. }
  106. for _, eventsCase := range eventsCases {
  107. client := &Client{
  108. client: newMockClient(func(req *http.Request) (*http.Response, error) {
  109. if !strings.HasPrefix(req.URL.Path, expectedURL) {
  110. return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL)
  111. }
  112. query := req.URL.Query()
  113. for key, expected := range eventsCase.expectedQueryParams {
  114. actual := query.Get(key)
  115. if actual != expected {
  116. return nil, fmt.Errorf("%s not set in URL query properly. Expected '%s', got %s", key, expected, actual)
  117. }
  118. }
  119. buffer := new(bytes.Buffer)
  120. for _, e := range eventsCase.events {
  121. b, _ := json.Marshal(e)
  122. buffer.Write(b)
  123. }
  124. return &http.Response{
  125. StatusCode: http.StatusOK,
  126. Body: io.NopCloser(buffer),
  127. }, nil
  128. }),
  129. }
  130. messages, errs := client.Events(context.Background(), eventsCase.options)
  131. loop:
  132. for {
  133. select {
  134. case err := <-errs:
  135. if err != nil && err != io.EOF {
  136. t.Fatal(err)
  137. }
  138. break loop
  139. case e := <-messages:
  140. _, ok := eventsCase.expectedEvents[e.Actor.ID]
  141. if !ok {
  142. t.Fatalf("event received not expected with action %s & id %s", e.Action, e.Actor.ID)
  143. }
  144. }
  145. }
  146. }
  147. }