| package container | |
| import ( | |
| "context" | |
| "runtime" | |
| "testing" | |
| "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" | |
| ocispec "github.com/opencontainers/image-spec/specs-go/v1" | |
| "gotest.tools/v3/assert" | |
| ) | |
| // TestContainerConfig holds container configuration struct that | |
| // are used in api calls. | |
| type TestContainerConfig struct { | |
| Name string | |
| Config *container.Config | |
| HostConfig *container.HostConfig | |
| NetworkingConfig *network.NetworkingConfig | |
| Platform *ocispec.Platform | |
| } | |
| // create creates a container with the specified options | |
| func create(ctx context.Context, t *testing.T, client client.APIClient, ops ...func(*TestContainerConfig)) (container.CreateResponse, error) { | |
| t.Helper() | |
| cmd := []string{"top"} | |
| if runtime.GOOS == "windows" { | |
| cmd = []string{"sleep", "240"} | |
| } | |
| config := &TestContainerConfig{ | |
| Config: &container.Config{ | |
| Image: "busybox", | |
| Cmd: cmd, | |
| }, | |
| HostConfig: &container.HostConfig{}, | |
| NetworkingConfig: &network.NetworkingConfig{}, | |
| } | |
| for _, op := range ops { | |
| op(config) | |
| } | |
| return client.ContainerCreate(ctx, config.Config, config.HostConfig, config.NetworkingConfig, config.Platform, config.Name) | |
| } | |
| // Create creates a container with the specified options, asserting that there was no error | |
| func Create(ctx context.Context, t *testing.T, client client.APIClient, ops ...func(*TestContainerConfig)) string { | |
| t.Helper() | |
| c, err := create(ctx, t, client, ops...) | |
| assert.NilError(t, err) | |
| return c.ID | |
| } | |
| // CreateExpectingErr creates a container, expecting an error with the specified message | |
| func CreateExpectingErr(ctx context.Context, t *testing.T, client client.APIClient, errMsg string, ops ...func(*TestContainerConfig)) { | |
| _, err := create(ctx, t, client, ops...) | |
| assert.ErrorContains(t, err, errMsg) | |
| } | |
| // Run creates and start a container with the specified options | |
| func Run(ctx context.Context, t *testing.T, client client.APIClient, ops ...func(*TestContainerConfig)) string { | |
| t.Helper() | |
| id := Create(ctx, t, client, ops...) | |
| err := client.ContainerStart(ctx, id, types.ContainerStartOptions{}) | |
| assert.NilError(t, err) | |
| return id | |
| } | |
| func Remove(ctx context.Context, t *testing.T, apiClient client.APIClient, container string, options types.ContainerRemoveOptions) { | |
| t.Helper() | |
| err := apiClient.ContainerRemove(ctx, container, options) | |
| assert.NilError(t, err) | |
| } | |
| func Inspect(ctx context.Context, t *testing.T, apiClient client.APIClient, containerRef string) types.ContainerJSON { | |
| t.Helper() | |
| c, err := apiClient.ContainerInspect(ctx, containerRef) | |
| assert.NilError(t, err) | |
| return c | |
| } |