integration/container/stop_test.go
7c6ef280
 package container
 
 import (
 	"context"
 	"fmt"
 	"strings"
 	"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/client"
 	"github.com/docker/docker/integration/util/request"
 	"github.com/gotestyourself/gotestyourself/icmd"
 	"github.com/gotestyourself/gotestyourself/poll"
 	"github.com/gotestyourself/gotestyourself/skip"
 	"github.com/stretchr/testify/require"
 )
 
 func TestDeleteDevicemapper(t *testing.T) {
 	skip.IfCondition(t, testEnv.DaemonInfo.Driver != "devicemapper")
 
 	defer setupTest(t)()
 	client := request.NewAPIClient(t)
 	ctx := context.Background()
 
 	foo, err := client.ContainerCreate(ctx,
 		&container.Config{
 			Cmd:   []string{"echo"},
 			Image: "busybox",
 		},
 		&container.HostConfig{},
 		&network.NetworkingConfig{},
 		"foo",
 	)
 	require.NoError(t, err)
 
 	err = client.ContainerStart(ctx, foo.ID, types.ContainerStartOptions{})
 	require.NoError(t, err)
 
 	inspect, err := client.ContainerInspect(ctx, foo.ID)
 	require.NoError(t, err)
 
 	poll.WaitOn(t, containerIsStopped(ctx, client, foo.ID), poll.WithDelay(100*time.Millisecond))
 
 	deviceID := inspect.GraphDriver.Data["DeviceId"]
 
 	// Find pool name from device name
 	deviceName := inspect.GraphDriver.Data["DeviceName"]
 	devicePrefix := deviceName[:strings.LastIndex(deviceName, "-")]
 	devicePool := fmt.Sprintf("/dev/mapper/%s-pool", devicePrefix)
 
 	result := icmd.RunCommand("dmsetup", "message", devicePool, "0", fmt.Sprintf("delete %s", deviceID))
 	result.Assert(t, icmd.Success)
 
 	err = client.ContainerRemove(ctx, foo.ID, types.ContainerRemoveOptions{})
 	require.NoError(t, err)
 }
 
 func containerIsStopped(ctx context.Context, client client.APIClient, containerID 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.Running:
 			return poll.Success()
 		default:
 			return poll.Continue("waiting for container to be stopped")
 		}
 	}
 }