Merge pull request #50777 from thaJeztah/28.x_backport_remove_TestEventsBackwardsCompatible

[28.x backport] integration/system: remove TestEventsBackwardsCompatible, add TestEventsNonBlocking
This commit is contained in:
Sebastiaan van Stijn
2025-08-21 16:43:30 +02:00
committed by GitHub

View File

@@ -2,12 +2,9 @@ package system
import (
"context"
"encoding/json"
"errors"
"io"
"net/http"
"net/url"
"strconv"
"testing"
"time"
@@ -17,7 +14,6 @@ import (
"github.com/docker/docker/api/types/mount"
"github.com/docker/docker/api/types/volume"
"github.com/docker/docker/integration/internal/container"
"github.com/docker/docker/pkg/jsonmessage"
"github.com/docker/docker/testutil/request"
"gotest.tools/v3/assert"
is "gotest.tools/v3/assert/cmp"
@@ -63,56 +59,19 @@ func TestEventsExecDie(t *testing.T) {
}
}
// Test case for #18888: Events messages have been switched from generic
// `JSONMessage` to `events.Message` types. The switch does not break the
// backward compatibility so old `JSONMessage` could still be used.
// This test verifies that backward compatibility maintains.
func TestEventsBackwardsCompatible(t *testing.T) {
skip.If(t, testEnv.DaemonInfo.OSType == "windows", "Windows doesn't support back-compat messages")
// TestEventsNonBlocking verifies that the API responds immediately (not blocking),
// if there are no events.
func TestEventsNonBlocking(t *testing.T) {
ctx := setupTest(t)
apiClient := testEnv.APIClient()
since := request.DaemonTime(ctx, t, apiClient, testEnv)
ts := strconv.FormatInt(since.Unix(), 10)
cID := container.Create(ctx, t, apiClient)
// In case there is no events, the API should have responded immediately (not blocking),
// The test here makes sure the response time is less than 3 sec.
// makes sure the API responds immediately (we use "less than 3 sec" to
// have some grace-period).
expectedTime := time.Now().Add(3 * time.Second)
emptyResp, emptyBody, err := request.Get(ctx, "/events")
assert.NilError(t, err)
defer emptyBody.Close()
assert.Check(t, is.DeepEqual(http.StatusOK, emptyResp.StatusCode))
assert.Check(t, time.Now().Before(expectedTime), "timeout waiting for events api to respond, should have responded immediately")
// We also test to make sure the `events.Message` is compatible with `JSONMessage`
q := url.Values{}
q.Set("since", ts)
_, body, err := request.Get(ctx, "/events?"+q.Encode())
assert.NilError(t, err)
defer body.Close()
dec := json.NewDecoder(body)
var containerCreateEvent *jsonmessage.JSONMessage
for {
var event jsonmessage.JSONMessage
if err := dec.Decode(&event); err != nil {
if err == io.EOF {
break
}
assert.NilError(t, err)
}
if event.Status == "create" && event.ID == cID {
containerCreateEvent = &event
break
}
}
assert.Assert(t, containerCreateEvent != nil)
assert.Check(t, is.Equal("create", containerCreateEvent.Status))
assert.Check(t, is.Equal(cID, containerCreateEvent.ID))
assert.Check(t, is.Equal("busybox", containerCreateEvent.From))
}
// TestEventsVolumeCreate verifies that volume create events are only fired