integration/container/health_test.go
5be2f2be
 package container
 
 import (
 	"context"
 	"testing"
 	"time"
 
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/api/types/container"
 	"github.com/docker/docker/api/types/network"
 	"github.com/docker/docker/api/types/strslice"
 	"github.com/docker/docker/client"
 	"github.com/docker/docker/integration/util/request"
 	"github.com/gotestyourself/gotestyourself/poll"
 	"github.com/stretchr/testify/require"
 )
 
 // TestHealthCheckWorkdir verifies that health-checks inherit the containers'
 // working-dir.
 func TestHealthCheckWorkdir(t *testing.T) {
 	defer setupTest(t)()
 	ctx := context.Background()
 	client := request.NewAPIClient(t)
 
 	c, err := client.ContainerCreate(ctx,
 		&container.Config{
 			Image:      "busybox",
 			Tty:        true,
 			WorkingDir: "/foo",
 			Cmd:        strslice.StrSlice([]string{"top"}),
 			Healthcheck: &container.HealthConfig{
 				Test:     []string{"CMD-SHELL", "if [ \"$PWD\" = \"/foo\" ]; then exit 0; else exit 1; fi;"},
 				Interval: 50 * time.Millisecond,
 				Retries:  3,
 			},
 		},
 		&container.HostConfig{},
 		&network.NetworkingConfig{},
 		"healthtest",
 	)
 	require.NoError(t, err)
 	err = client.ContainerStart(ctx, c.ID, types.ContainerStartOptions{})
 	require.NoError(t, err)
 
 	poll.WaitOn(t, pollForHealthStatus(ctx, client, c.ID, types.Healthy), poll.WithDelay(100*time.Millisecond))
 }
 
 func pollForHealthStatus(ctx context.Context, client client.APIClient, containerID string, healthStatus string) func(log poll.LogT) poll.Result {
 	return func(log poll.LogT) poll.Result {
 		inspect, err := client.ContainerInspect(ctx, containerID)
 
 		switch {
 		case err != nil:
 			return poll.Error(err)
 		case inspect.State.Health.Status == healthStatus:
 			return poll.Success()
 		default:
 			return poll.Continue("waiting for container to become %s", healthStatus)
 		}
 	}
 }