github.com/docker/docker@v299999999.0.0-20200612211812-aaf470eca7b5+incompatible/integration/container/health_test.go (about)

     1  package container // import "github.com/docker/docker/integration/container"
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/docker/docker/api/types"
     9  	containertypes "github.com/docker/docker/api/types/container"
    10  	"github.com/docker/docker/client"
    11  	"github.com/docker/docker/integration/internal/container"
    12  	"gotest.tools/v3/assert"
    13  	"gotest.tools/v3/poll"
    14  	"gotest.tools/v3/skip"
    15  )
    16  
    17  // TestHealthCheckWorkdir verifies that health-checks inherit the containers'
    18  // working-dir.
    19  func TestHealthCheckWorkdir(t *testing.T) {
    20  	skip.If(t, testEnv.OSType == "windows", "FIXME")
    21  	defer setupTest(t)()
    22  	ctx := context.Background()
    23  	client := testEnv.APIClient()
    24  
    25  	cID := container.Run(ctx, t, client, container.WithTty(true), container.WithWorkingDir("/foo"), func(c *container.TestContainerConfig) {
    26  		c.Config.Healthcheck = &containertypes.HealthConfig{
    27  			Test:     []string{"CMD-SHELL", "if [ \"$PWD\" = \"/foo\" ]; then exit 0; else exit 1; fi;"},
    28  			Interval: 50 * time.Millisecond,
    29  			Retries:  3,
    30  		}
    31  	})
    32  
    33  	poll.WaitOn(t, pollForHealthStatus(ctx, client, cID, types.Healthy), poll.WithDelay(100*time.Millisecond))
    34  }
    35  
    36  // GitHub #37263
    37  // Do not stop healthchecks just because we sent a signal to the container
    38  func TestHealthKillContainer(t *testing.T) {
    39  	skip.If(t, testEnv.OSType == "windows", "Windows only supports SIGKILL and SIGTERM? See https://github.com/moby/moby/issues/39574")
    40  	defer setupTest(t)()
    41  
    42  	ctx := context.Background()
    43  	client := testEnv.APIClient()
    44  
    45  	id := container.Run(ctx, t, client, func(c *container.TestContainerConfig) {
    46  		c.Config.Healthcheck = &containertypes.HealthConfig{
    47  			Test:     []string{"CMD-SHELL", "sleep 1"},
    48  			Interval: time.Second,
    49  			Retries:  5,
    50  		}
    51  	})
    52  
    53  	ctxPoll, cancel := context.WithTimeout(ctx, 30*time.Second)
    54  	defer cancel()
    55  	poll.WaitOn(t, pollForHealthStatus(ctxPoll, client, id, "healthy"), poll.WithDelay(100*time.Millisecond))
    56  
    57  	err := client.ContainerKill(ctx, id, "SIGUSR1")
    58  	assert.NilError(t, err)
    59  
    60  	ctxPoll, cancel = context.WithTimeout(ctx, 30*time.Second)
    61  	defer cancel()
    62  	poll.WaitOn(t, pollForHealthStatus(ctxPoll, client, id, "healthy"), poll.WithDelay(100*time.Millisecond))
    63  }
    64  
    65  func pollForHealthStatus(ctx context.Context, client client.APIClient, containerID string, healthStatus string) func(log poll.LogT) poll.Result {
    66  	return func(log poll.LogT) poll.Result {
    67  		inspect, err := client.ContainerInspect(ctx, containerID)
    68  
    69  		switch {
    70  		case err != nil:
    71  			return poll.Error(err)
    72  		case inspect.State.Health.Status == healthStatus:
    73  			return poll.Success()
    74  		default:
    75  			return poll.Continue("waiting for container to become %s", healthStatus)
    76  		}
    77  	}
    78  }