package docker import ( "context" "errors" "testing" "github.com/docker/buildx/driver" "github.com/docker/buildx/util/progress" "github.com/moby/buildkit/client" dockerclient "github.com/moby/moby/client" "github.com/stretchr/testify/require" ) var errContainerCreateCaptured = errors.New("container create captured") type containerCreateCapturingAPI struct { dockerclient.APIClient containerCreateOptions dockerclient.ContainerCreateOptions } func (c *containerCreateCapturingAPI) ImagePull(context.Context, string, dockerclient.ImagePullOptions) (dockerclient.ImagePullResponse, error) { return nil, errors.New("skip image pull in test") } func (c *containerCreateCapturingAPI) ImageInspect(context.Context, string, ...dockerclient.ImageInspectOption) (dockerclient.ImageInspectResult, error) { return dockerclient.ImageInspectResult{}, nil } func (c *containerCreateCapturingAPI) Info(context.Context, dockerclient.InfoOptions) (dockerclient.SystemInfoResult, error) { result := dockerclient.SystemInfoResult{} result.Info.CgroupDriver = "cgroupfs" return result, nil } func (c *containerCreateCapturingAPI) ContainerCreate(_ context.Context, options dockerclient.ContainerCreateOptions) (dockerclient.ContainerCreateResult, error) { c.containerCreateOptions = options return dockerclient.ContainerCreateResult{}, errContainerCreateCaptured } func TestCreateCgroupParent(t *testing.T) { tests := []struct { name string driverOpts map[string]string expectedCgroupParent string }{ { name: "cgroupfs default", expectedCgroupParent: "", }, { name: "explicit cgroup parent", driverOpts: map[string]string{"cgroup-parent": "/custom/buildx"}, expectedCgroupParent: "/custom/buildx", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { api := &containerCreateCapturingAPI{} drv, err := (&factory{}).New(context.Background(), driver.InitConfig{ Name: "buildx-test", DockerAPI: api, DriverOpts: tt.driverOpts, }) require.NoError(t, err) d := drv.(*Driver) d.gpus = nil err = progress.Wrap("test", func(*client.SolveStatus) {}, func(l progress.SubLogger) error { return d.create(context.Background(), l) }) require.ErrorIs(t, err, errContainerCreateCaptured) require.NotNil(t, api.containerCreateOptions.HostConfig) require.Equal(t, tt.expectedCgroupParent, api.containerCreateOptions.HostConfig.CgroupParent) }) } }