package container // import "github.com/docker/docker/integration/container"

import (
	"context"
	"fmt"
	"os"
	"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"
	"github.com/docker/docker/internal/test/environment"
	"github.com/stretchr/testify/require"
)

var testEnv *environment.Execution

func TestMain(m *testing.M) {
	var err error
	testEnv, err = environment.New()
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
	err = environment.EnsureFrozenImagesLinux(testEnv)
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	testEnv.Print()
	os.Exit(m.Run())
}

func setupTest(t *testing.T) func() {
	environment.ProtectAll(t, testEnv)
	return func() { testEnv.Clean(t) }
}

type containerConstructor func(config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig)

func createSimpleContainer(ctx context.Context, t *testing.T, client client.APIClient, name string, f ...containerConstructor) string {
	config := &container.Config{
		Cmd:   []string{"top"},
		Image: "busybox",
	}
	hostConfig := &container.HostConfig{}
	networkingConfig := &network.NetworkingConfig{}

	for _, fn := range f {
		fn(config, hostConfig, networkingConfig)
	}

	c, err := client.ContainerCreate(ctx, config, hostConfig, networkingConfig, name)
	require.NoError(t, err)

	return c.ID
}

func runSimpleContainer(ctx context.Context, t *testing.T, client client.APIClient, name string, f ...containerConstructor) string {
	cID := createSimpleContainer(ctx, t, client, name, f...)

	err := client.ContainerStart(ctx, cID, types.ContainerStartOptions{})
	require.NoError(t, err)

	return cID
}