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