events_test.go 3.7 KB

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