|
@@ -2,7 +2,9 @@ package client
|
|
|
|
|
|
import (
|
|
|
"bytes"
|
|
|
+ "encoding/json"
|
|
|
"fmt"
|
|
|
+ "io"
|
|
|
"io/ioutil"
|
|
|
"net/http"
|
|
|
"strings"
|
|
@@ -11,6 +13,7 @@ import (
|
|
|
"golang.org/x/net/context"
|
|
|
|
|
|
"github.com/docker/docker/api/types"
|
|
|
+ "github.com/docker/docker/api/types/events"
|
|
|
"github.com/docker/docker/api/types/filters"
|
|
|
)
|
|
|
|
|
@@ -36,7 +39,8 @@ func TestEventsErrorInOptions(t *testing.T) {
|
|
|
client := &Client{
|
|
|
client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
|
|
|
}
|
|
|
- _, err := client.Events(context.Background(), e.options)
|
|
|
+ _, errs := client.Events(context.Background(), e.options)
|
|
|
+ err := <-errs
|
|
|
if err == nil || !strings.Contains(err.Error(), e.expectedError) {
|
|
|
t.Fatalf("expected an error %q, got %v", e.expectedError, err)
|
|
|
}
|
|
@@ -47,39 +51,36 @@ func TestEventsErrorFromServer(t *testing.T) {
|
|
|
client := &Client{
|
|
|
client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
|
|
|
}
|
|
|
- _, err := client.Events(context.Background(), types.EventsOptions{})
|
|
|
+ _, errs := client.Events(context.Background(), types.EventsOptions{})
|
|
|
+ err := <-errs
|
|
|
if err == nil || err.Error() != "Error response from daemon: Server error" {
|
|
|
t.Fatalf("expected a Server Error, got %v", err)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
func TestEvents(t *testing.T) {
|
|
|
+
|
|
|
expectedURL := "/events"
|
|
|
|
|
|
filters := filters.NewArgs()
|
|
|
- filters.Add("label", "label1")
|
|
|
- filters.Add("label", "label2")
|
|
|
- expectedFiltersJSON := `{"label":{"label1":true,"label2":true}}`
|
|
|
+ filters.Add("type", events.ContainerEventType)
|
|
|
+ expectedFiltersJSON := fmt.Sprintf(`{"type":{"%s":true}}`, events.ContainerEventType)
|
|
|
|
|
|
eventsCases := []struct {
|
|
|
options types.EventsOptions
|
|
|
+ events []events.Message
|
|
|
+ expectedEvents map[string]bool
|
|
|
expectedQueryParams map[string]string
|
|
|
}{
|
|
|
{
|
|
|
options: types.EventsOptions{
|
|
|
- Since: "invalid but valid",
|
|
|
- },
|
|
|
- expectedQueryParams: map[string]string{
|
|
|
- "since": "invalid but valid",
|
|
|
- },
|
|
|
- },
|
|
|
- {
|
|
|
- options: types.EventsOptions{
|
|
|
- Until: "invalid but valid",
|
|
|
+ Filters: filters,
|
|
|
},
|
|
|
expectedQueryParams: map[string]string{
|
|
|
- "until": "invalid but valid",
|
|
|
+ "filters": expectedFiltersJSON,
|
|
|
},
|
|
|
+ events: []events.Message{},
|
|
|
+ expectedEvents: make(map[string]bool),
|
|
|
},
|
|
|
{
|
|
|
options: types.EventsOptions{
|
|
@@ -88,6 +89,28 @@ func TestEvents(t *testing.T) {
|
|
|
expectedQueryParams: map[string]string{
|
|
|
"filters": expectedFiltersJSON,
|
|
|
},
|
|
|
+ events: []events.Message{
|
|
|
+ {
|
|
|
+ Type: "container",
|
|
|
+ ID: "1",
|
|
|
+ Action: "create",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Type: "container",
|
|
|
+ ID: "2",
|
|
|
+ Action: "die",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ Type: "container",
|
|
|
+ ID: "3",
|
|
|
+ Action: "create",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ expectedEvents: map[string]bool{
|
|
|
+ "1": true,
|
|
|
+ "2": true,
|
|
|
+ "3": true,
|
|
|
+ },
|
|
|
},
|
|
|
}
|
|
|
|
|
@@ -98,29 +121,45 @@ func TestEvents(t *testing.T) {
|
|
|
return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL)
|
|
|
}
|
|
|
query := req.URL.Query()
|
|
|
+
|
|
|
for key, expected := range eventsCase.expectedQueryParams {
|
|
|
actual := query.Get(key)
|
|
|
if actual != expected {
|
|
|
return nil, fmt.Errorf("%s not set in URL query properly. Expected '%s', got %s", key, expected, actual)
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ buffer := new(bytes.Buffer)
|
|
|
+
|
|
|
+ for _, e := range eventsCase.events {
|
|
|
+ b, _ := json.Marshal(e)
|
|
|
+ buffer.Write(b)
|
|
|
+ }
|
|
|
+
|
|
|
return &http.Response{
|
|
|
StatusCode: http.StatusOK,
|
|
|
- Body: ioutil.NopCloser(bytes.NewReader([]byte("response"))),
|
|
|
+ Body: ioutil.NopCloser(buffer),
|
|
|
}, nil
|
|
|
}),
|
|
|
}
|
|
|
- body, err := client.Events(context.Background(), eventsCase.options)
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
- defer body.Close()
|
|
|
- content, err := ioutil.ReadAll(body)
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
- if string(content) != "response" {
|
|
|
- t.Fatalf("expected response to contain 'response', got %s", string(content))
|
|
|
+
|
|
|
+ messages, errs := client.Events(context.Background(), eventsCase.options)
|
|
|
+
|
|
|
+ loop:
|
|
|
+ for {
|
|
|
+ select {
|
|
|
+ case err := <-errs:
|
|
|
+ if err != nil && err != io.EOF {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ break loop
|
|
|
+ case e := <-messages:
|
|
|
+ _, ok := eventsCase.expectedEvents[e.ID]
|
|
|
+ if !ok {
|
|
|
+ t.Fatalf("event received not expected with action %s & id %s", e.Action, e.ID)
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|