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 }