github.com/rita33cool1/iot-system-gateway@v0.0.0-20200911033302-e65bde238cc5/docker-engine/integration/system/event_test.go (about) 1 package system // import "github.com/docker/docker/integration/system" 2 3 import ( 4 "context" 5 "encoding/json" 6 "io" 7 "net/http" 8 "net/url" 9 "strconv" 10 "testing" 11 "time" 12 13 "github.com/docker/docker/api/types" 14 "github.com/docker/docker/api/types/filters" 15 "github.com/docker/docker/api/types/strslice" 16 req "github.com/docker/docker/integration-cli/request" 17 "github.com/docker/docker/integration/internal/container" 18 "github.com/docker/docker/integration/internal/request" 19 "github.com/docker/docker/pkg/jsonmessage" 20 "github.com/gotestyourself/gotestyourself/assert" 21 is "github.com/gotestyourself/gotestyourself/assert/cmp" 22 ) 23 24 func TestEvents(t *testing.T) { 25 defer setupTest(t)() 26 ctx := context.Background() 27 client := request.NewAPIClient(t) 28 29 cID := container.Run(t, ctx, client) 30 31 id, err := client.ContainerExecCreate(ctx, cID, 32 types.ExecConfig{ 33 Cmd: strslice.StrSlice([]string{"echo", "hello"}), 34 }, 35 ) 36 assert.NilError(t, err) 37 38 filters := filters.NewArgs( 39 filters.Arg("container", cID), 40 filters.Arg("event", "exec_die"), 41 ) 42 msg, errors := client.Events(ctx, types.EventsOptions{ 43 Filters: filters, 44 }) 45 46 err = client.ContainerExecStart(ctx, id.ID, 47 types.ExecStartCheck{ 48 Detach: true, 49 Tty: false, 50 }, 51 ) 52 assert.NilError(t, err) 53 54 select { 55 case m := <-msg: 56 assert.Equal(t, m.Type, "container") 57 assert.Equal(t, m.Actor.ID, cID) 58 assert.Equal(t, m.Action, "exec_die") 59 assert.Equal(t, m.Actor.Attributes["execID"], id.ID) 60 assert.Equal(t, m.Actor.Attributes["exitCode"], "0") 61 case err = <-errors: 62 t.Fatal(err) 63 case <-time.After(time.Second * 3): 64 t.Fatal("timeout hit") 65 } 66 67 } 68 69 // Test case for #18888: Events messages have been switched from generic 70 // `JSONMessage` to `events.Message` types. The switch does not break the 71 // backward compatibility so old `JSONMessage` could still be used. 72 // This test verifies that backward compatibility maintains. 73 func TestEventsBackwardsCompatible(t *testing.T) { 74 defer setupTest(t)() 75 ctx := context.Background() 76 client := request.NewAPIClient(t) 77 78 since := request.DaemonTime(ctx, t, client, testEnv) 79 ts := strconv.FormatInt(since.Unix(), 10) 80 81 cID := container.Create(t, ctx, client) 82 83 // In case there is no events, the API should have responded immediately (not blocking), 84 // The test here makes sure the response time is less than 3 sec. 85 expectedTime := time.Now().Add(3 * time.Second) 86 emptyResp, emptyBody, err := req.Get("/events") 87 assert.NilError(t, err) 88 defer emptyBody.Close() 89 assert.Check(t, is.DeepEqual(http.StatusOK, emptyResp.StatusCode)) 90 assert.Check(t, time.Now().Before(expectedTime), "timeout waiting for events api to respond, should have responded immediately") 91 92 // We also test to make sure the `events.Message` is compatible with `JSONMessage` 93 q := url.Values{} 94 q.Set("since", ts) 95 _, body, err := req.Get("/events?" + q.Encode()) 96 assert.NilError(t, err) 97 defer body.Close() 98 99 dec := json.NewDecoder(body) 100 var containerCreateEvent *jsonmessage.JSONMessage 101 for { 102 var event jsonmessage.JSONMessage 103 if err := dec.Decode(&event); err != nil { 104 if err == io.EOF { 105 break 106 } 107 t.Fatal(err) 108 } 109 if event.Status == "create" && event.ID == cID { 110 containerCreateEvent = &event 111 break 112 } 113 } 114 115 assert.Check(t, containerCreateEvent != nil) 116 assert.Check(t, is.Equal("create", containerCreateEvent.Status)) 117 assert.Check(t, is.Equal(cID, containerCreateEvent.ID)) 118 assert.Check(t, is.Equal("busybox", containerCreateEvent.From)) 119 }