github.com/docker/app@v0.9.1-beta3.0.20210611140623-a48f773ab002/e2e/main_test.go (about)

     1  package e2e
     2  
     3  import (
     4  	"encoding/json"
     5  	"flag"
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  	"runtime"
    10  	"testing"
    11  
    12  	"github.com/deislabs/cnab-go/credentials"
    13  	"github.com/docker/app/internal/store"
    14  	dockerConfigFile "github.com/docker/cli/cli/config/configfile"
    15  	"gotest.tools/assert"
    16  	"gotest.tools/icmd"
    17  )
    18  
    19  var (
    20  	e2ePath       = flag.String("e2e-path", ".", "Set path to the e2e directory")
    21  	dockerCliPath = os.Getenv("DOCKERCLI_BINARY")
    22  	dockerCli     dockerCliCommand
    23  )
    24  
    25  type dockerCliCommand struct {
    26  	path         string
    27  	cliPluginDir string
    28  }
    29  
    30  type ConfigFileOperator func(configFile *dockerConfigFile.ConfigFile)
    31  
    32  func (d dockerCliCommand) createTestCmd(ops ...ConfigFileOperator) (icmd.Cmd, func()) {
    33  	configDir, err := ioutil.TempDir("", "config")
    34  	if err != nil {
    35  		panic(err)
    36  	}
    37  	configFilePath := filepath.Join(configDir, "config.json")
    38  	config := dockerConfigFile.ConfigFile{
    39  		CLIPluginsExtraDirs: []string{
    40  			d.cliPluginDir,
    41  		},
    42  		Filename: configFilePath,
    43  	}
    44  	for _, op := range ops {
    45  		op(&config)
    46  	}
    47  	configFile, err := os.Create(configFilePath)
    48  	if err != nil {
    49  		panic(err)
    50  	}
    51  	defer configFile.Close()
    52  	err = json.NewEncoder(configFile).Encode(config)
    53  	if err != nil {
    54  		panic(err)
    55  	}
    56  	cleanup := func() {
    57  		os.RemoveAll(configDir)
    58  	}
    59  	env := append(os.Environ(),
    60  		"DOCKER_CONFIG="+configDir,
    61  		"DOCKER_CLI_EXPERIMENTAL=enabled") // TODO: Remove this once docker app plugin is no more experimental
    62  	return icmd.Cmd{Env: env}, cleanup
    63  }
    64  
    65  func (d dockerCliCommand) Command(args ...string) []string {
    66  	return append([]string{d.path}, args...)
    67  }
    68  
    69  func withCredentialSet(t *testing.T, context string, creds *credentials.CredentialSet) ConfigFileOperator {
    70  	t.Helper()
    71  	return func(config *dockerConfigFile.ConfigFile) {
    72  		configDir := filepath.Dir(config.Filename)
    73  		appstore, err := store.NewApplicationStore(configDir)
    74  		assert.NilError(t, err)
    75  
    76  		credstore, err := appstore.CredentialStore(context)
    77  		assert.NilError(t, err)
    78  
    79  		err = credstore.Store(creds)
    80  		assert.NilError(t, err)
    81  	}
    82  }
    83  
    84  func TestMain(m *testing.M) {
    85  	flag.Parse()
    86  	if err := os.Chdir(*e2ePath); err != nil {
    87  		panic(err)
    88  	}
    89  	cwd, err := os.Getwd()
    90  	if err != nil {
    91  		panic(err)
    92  	}
    93  	dockerApp := os.Getenv("DOCKERAPP_BINARY")
    94  	if dockerApp == "" {
    95  		dockerApp = filepath.Join(cwd, "../bin/docker-app")
    96  	}
    97  	dockerApp, err = filepath.Abs(dockerApp)
    98  	if err != nil {
    99  		panic(err)
   100  	}
   101  	if dockerCliPath == "" {
   102  		dockerCliPath = "docker"
   103  	} else {
   104  		dockerCliPath, err = filepath.Abs(dockerCliPath)
   105  		if err != nil {
   106  			panic(err)
   107  		}
   108  	}
   109  	// Prepare docker cli to call the docker-app plugin binary:
   110  	// - Create a symbolic link with the dockerApp binary to the plugin directory
   111  	cliPluginDir, err := ioutil.TempDir("", "configContent")
   112  	if err != nil {
   113  		panic(err)
   114  	}
   115  	defer os.RemoveAll(cliPluginDir)
   116  	createDockerAppSymLink(dockerApp, cliPluginDir)
   117  
   118  	dockerCli = dockerCliCommand{path: dockerCliPath, cliPluginDir: cliPluginDir}
   119  	os.Exit(m.Run())
   120  }
   121  
   122  func createDockerAppSymLink(dockerApp, configDir string) {
   123  	dockerAppExecName := "docker-app"
   124  	if runtime.GOOS == "windows" {
   125  		dockerAppExecName += ".exe"
   126  	}
   127  	if err := os.Symlink(dockerApp, filepath.Join(configDir, dockerAppExecName)); err != nil {
   128  		panic(err)
   129  	}
   130  }