event_test.go 3.7 KB

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