diff --git a/integration/build/build_squash_test.go b/integration/build/build_squash_test.go index 827988fe75..2b4c6bdbc7 100644 --- a/integration/build/build_squash_test.go +++ b/integration/build/build_squash_test.go @@ -17,6 +17,7 @@ import ( "github.com/docker/docker/testutil/fakecontext" "gotest.tools/v3/assert" is "gotest.tools/v3/assert/cmp" + "gotest.tools/v3/poll" "gotest.tools/v3/skip" ) @@ -86,6 +87,8 @@ func TestBuildSquashParent(t *testing.T) { container.WithImage(name), container.WithCmd("/bin/sh", "-c", "cat /hello"), ) + + poll.WaitOn(t, container.IsStopped(ctx, client, cid)) reader, err := client.ContainerLogs(ctx, cid, containertypes.LogsOptions{ ShowStdout: true, }) diff --git a/integration/build/build_userns_linux_test.go b/integration/build/build_userns_linux_test.go index e295624d51..d4bf7b1cb0 100644 --- a/integration/build/build_userns_linux_test.go +++ b/integration/build/build_userns_linux_test.go @@ -19,6 +19,7 @@ import ( "github.com/docker/docker/testutil/fakecontext" "github.com/docker/docker/testutil/fixtures/load" "gotest.tools/v3/assert" + "gotest.tools/v3/poll" "gotest.tools/v3/skip" ) @@ -118,6 +119,8 @@ func TestBuildUserNamespaceValidateCapabilitiesAreV2(t *testing.T) { container.WithImage(imageTag), container.WithCmd("/sbin/getcap", "-n", "/bin/sleep"), ) + + poll.WaitOn(t, container.IsStopped(ctx, clientNoUserRemap, cid)) logReader, err := clientNoUserRemap.ContainerLogs(ctx, cid, containertypes.LogsOptions{ ShowStdout: true, }) diff --git a/integration/container/cdi_test.go b/integration/container/cdi_test.go index dc5b33ecd1..5d734145ed 100644 --- a/integration/container/cdi_test.go +++ b/integration/container/cdi_test.go @@ -15,6 +15,7 @@ import ( "github.com/docker/docker/testutil/daemon" "gotest.tools/v3/assert" is "gotest.tools/v3/assert/cmp" + "gotest.tools/v3/poll" "gotest.tools/v3/skip" ) @@ -53,6 +54,7 @@ func TestCreateWithCDIDevices(t *testing.T) { } assert.Check(t, is.DeepEqual(inspect.HostConfig.DeviceRequests, expectedRequests)) + poll.WaitOn(t, container.IsStopped(ctx, apiClient, id)) reader, err := apiClient.ContainerLogs(ctx, id, containertypes.LogsOptions{ ShowStdout: true, }) diff --git a/integration/container/diff_test.go b/integration/container/diff_test.go index 29068c2513..e1af08b953 100644 --- a/integration/container/diff_test.go +++ b/integration/container/diff_test.go @@ -23,6 +23,7 @@ func TestDiff(t *testing.T) { {Kind: containertypes.ChangeAdd, Path: "/foo/bar"}, } + poll.WaitOn(t, container.IsStopped(ctx, apiClient, cID)) items, err := apiClient.ContainerDiff(ctx, cID) assert.NilError(t, err) assert.DeepEqual(t, expected, items) diff --git a/integration/container/nat_test.go b/integration/container/nat_test.go index 0f3fe80b7d..5219548fc5 100644 --- a/integration/container/nat_test.go +++ b/integration/container/nat_test.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "net" + "strconv" "strings" "testing" "time" @@ -25,13 +26,25 @@ func TestNetworkNat(t *testing.T) { ctx := setupTest(t) - msg := "it works" - startServerContainer(ctx, t, msg, 8080) + const msg = "it works" + const port = 8080 + startServerContainer(ctx, t, msg, port) endpoint := getExternalAddress(t) - conn, err := net.Dial("tcp", net.JoinHostPort(endpoint.String(), "8080")) - assert.NilError(t, err) - defer conn.Close() + + var conn net.Conn + addr := net.JoinHostPort(endpoint.String(), strconv.Itoa(port)) + poll.WaitOn(t, func(t poll.LogT) poll.Result { + var err error + conn, err = net.Dial("tcp", addr) + if err != nil { + return poll.Continue("waiting for %s to be accessible: %v", addr, err) + } + return poll.Success() + }) + defer func() { + assert.Check(t, conn.Close()) + }() data, err := io.ReadAll(conn) assert.NilError(t, err) @@ -40,16 +53,26 @@ func TestNetworkNat(t *testing.T) { func TestNetworkLocalhostTCPNat(t *testing.T) { skip.If(t, testEnv.IsRemoteDaemon) - skip.If(t, testEnv.GitHubActions, "FIXME: https://github.com/moby/moby/issues/41561") ctx := setupTest(t) - msg := "hi yall" - startServerContainer(ctx, t, msg, 8081) + const msg = "hi yall" + const port = 8081 + startServerContainer(ctx, t, msg, port) - conn, err := net.Dial("tcp", "localhost:8081") - assert.NilError(t, err) - defer conn.Close() + var conn net.Conn + addr := net.JoinHostPort("localhost", strconv.Itoa(port)) + poll.WaitOn(t, func(t poll.LogT) poll.Result { + var err error + conn, err = net.Dial("tcp", addr) + if err != nil { + return poll.Continue("waiting for %s to be accessible: %v", addr, err) + } + return poll.Success() + }) + defer func() { + assert.Check(t, conn.Close()) + }() data, err := io.ReadAll(conn) assert.NilError(t, err) diff --git a/integration/image/commit_test.go b/integration/image/commit_test.go index 160b4b0199..408a397d56 100644 --- a/integration/image/commit_test.go +++ b/integration/image/commit_test.go @@ -10,6 +10,7 @@ import ( "github.com/docker/docker/testutil/daemon" "gotest.tools/v3/assert" is "gotest.tools/v3/assert/cmp" + "gotest.tools/v3/poll" "gotest.tools/v3/skip" ) @@ -61,7 +62,8 @@ func TestUsernsCommit(t *testing.T) { clientUserRemap := dUserRemap.NewClientT(t) defer clientUserRemap.Close() - container.Run(ctx, t, clientUserRemap, container.WithName(t.Name()), container.WithImage("busybox"), container.WithCmd("sh", "-c", "echo hello world > /hello.txt && chown 1000:1000 /hello.txt")) + cID := container.Run(ctx, t, clientUserRemap, container.WithName(t.Name()), container.WithImage("busybox"), container.WithCmd("sh", "-c", "echo hello world > /hello.txt && chown 1000:1000 /hello.txt")) + poll.WaitOn(t, container.IsStopped(ctx, clientUserRemap, cID)) img, err := clientUserRemap.ContainerCommit(ctx, t.Name(), containertypes.CommitOptions{}) assert.NilError(t, err) diff --git a/integration/networking/port_mapping_linux_test.go b/integration/networking/port_mapping_linux_test.go index 684c047cab..297ef0f5ee 100644 --- a/integration/networking/port_mapping_linux_test.go +++ b/integration/networking/port_mapping_linux_test.go @@ -25,6 +25,7 @@ import ( "gotest.tools/v3/assert" is "gotest.tools/v3/assert/cmp" "gotest.tools/v3/icmd" + "gotest.tools/v3/poll" "gotest.tools/v3/skip" ) @@ -254,8 +255,16 @@ func TestProxy4To6(t *testing.T) { inspect := container.Inspect(ctx, t, c, serverId) hostPort := inspect.NetworkSettings.Ports["80/tcp"][0].HostPort - resp, err := http.Get("http://[::1]:" + hostPort) - assert.NilError(t, err) + var resp *http.Response + addr := "http://[::1]:" + hostPort + poll.WaitOn(t, func(t poll.LogT) poll.Result { + var err error + resp, err = http.Get(addr) // #nosec G107 -- Ignore "Potential HTTP request made with variable url" + if err != nil { + return poll.Continue("waiting for %s to be accessible: %v", addr, err) + } + return poll.Success() + }) assert.Check(t, is.Equal(resp.StatusCode, 404)) } diff --git a/integration/plugin/logging/read_test.go b/integration/plugin/logging/read_test.go index 52b0fe6b0b..ff3d620572 100644 --- a/integration/plugin/logging/read_test.go +++ b/integration/plugin/logging/read_test.go @@ -9,10 +9,12 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" + testContainer "github.com/docker/docker/integration/internal/container" "github.com/docker/docker/pkg/stdcopy" "github.com/docker/docker/testutil" "github.com/docker/docker/testutil/daemon" "gotest.tools/v3/assert" + "gotest.tools/v3/poll" ) // TestReadPluginNoRead tests that reads are supported even if the plugin isn't capable. @@ -65,6 +67,7 @@ func TestReadPluginNoRead(t *testing.T) { err = client.ContainerStart(ctx, c.ID, container.StartOptions{}) assert.Assert(t, err) + poll.WaitOn(t, testContainer.IsStopped(ctx, client, c.ID)) logs, err := client.ContainerLogs(ctx, c.ID, container.LogsOptions{ShowStdout: true}) if !test.logsSupported { assert.Assert(t, err != nil)