github.1git.de/docker/cli@v26.1.3+incompatible/cli/command/context/use_test.go (about) 1 package context 2 3 import ( 4 "bytes" 5 "errors" 6 "io" 7 "os" 8 "path/filepath" 9 "runtime" 10 "testing" 11 12 "github.com/docker/cli/cli/command" 13 "github.com/docker/cli/cli/config" 14 "github.com/docker/cli/cli/config/configfile" 15 "github.com/docker/cli/cli/flags" 16 "github.com/docker/docker/errdefs" 17 "gotest.tools/v3/assert" 18 is "gotest.tools/v3/assert/cmp" 19 ) 20 21 func TestUse(t *testing.T) { 22 configDir := t.TempDir() 23 configFilePath := filepath.Join(configDir, "config.json") 24 testCfg := configfile.New(configFilePath) 25 cli := makeFakeCli(t, withCliConfig(testCfg)) 26 err := RunCreate(cli, &CreateOptions{ 27 Name: "test", 28 Docker: map[string]string{}, 29 }) 30 assert.NilError(t, err) 31 assert.NilError(t, newUseCommand(cli).RunE(nil, []string{"test"})) 32 reloadedConfig, err := config.Load(configDir) 33 assert.NilError(t, err) 34 assert.Equal(t, "test", reloadedConfig.CurrentContext) 35 36 // switch back to default 37 cli.OutBuffer().Reset() 38 cli.ErrBuffer().Reset() 39 assert.NilError(t, newUseCommand(cli).RunE(nil, []string{"default"})) 40 reloadedConfig, err = config.Load(configDir) 41 assert.NilError(t, err) 42 assert.Equal(t, "", reloadedConfig.CurrentContext) 43 assert.Equal(t, "default\n", cli.OutBuffer().String()) 44 assert.Equal(t, "Current context is now \"default\"\n", cli.ErrBuffer().String()) 45 } 46 47 func TestUseNoExist(t *testing.T) { 48 cli := makeFakeCli(t) 49 err := newUseCommand(cli).RunE(nil, []string{"test"}) 50 assert.Check(t, is.ErrorType(err, errdefs.IsNotFound)) 51 } 52 53 // TestUseDefaultWithoutConfigFile verifies that the CLI does not create 54 // the default config file and directory when using the default context. 55 func TestUseDefaultWithoutConfigFile(t *testing.T) { 56 // We must use a temporary home-directory, because this test covers 57 // the _default_ configuration file. If we specify a custom configuration 58 // file, the CLI produces an error if the file doesn't exist. 59 tmpHomeDir := t.TempDir() 60 if runtime.GOOS == "windows" { 61 t.Setenv("USERPROFILE", tmpHomeDir) 62 } else { 63 t.Setenv("HOME", tmpHomeDir) 64 } 65 configDir := filepath.Join(tmpHomeDir, ".docker") 66 configFilePath := filepath.Join(configDir, "config.json") 67 68 // Verify config-dir and -file don't exist before 69 _, err := os.Stat(configDir) 70 assert.Check(t, errors.Is(err, os.ErrNotExist)) 71 _, err = os.Stat(configFilePath) 72 assert.Check(t, errors.Is(err, os.ErrNotExist)) 73 74 cli, err := command.NewDockerCli(command.WithCombinedStreams(io.Discard)) 75 assert.NilError(t, err) 76 assert.NilError(t, newUseCommand(cli).RunE(nil, []string{"default"})) 77 78 // Verify config-dir and -file don't exist after 79 _, err = os.Stat(configDir) 80 assert.Check(t, errors.Is(err, os.ErrNotExist)) 81 _, err = os.Stat(configFilePath) 82 assert.Check(t, errors.Is(err, os.ErrNotExist)) 83 } 84 85 func TestUseHostOverride(t *testing.T) { 86 t.Setenv("DOCKER_HOST", "tcp://ed:2375/") 87 88 configDir := t.TempDir() 89 configFilePath := filepath.Join(configDir, "config.json") 90 testCfg := configfile.New(configFilePath) 91 cli := makeFakeCli(t, withCliConfig(testCfg)) 92 err := RunCreate(cli, &CreateOptions{ 93 Name: "test", 94 Docker: map[string]string{}, 95 }) 96 assert.NilError(t, err) 97 98 cli.ResetOutputBuffers() 99 err = newUseCommand(cli).RunE(nil, []string{"test"}) 100 assert.NilError(t, err) 101 assert.Assert(t, is.Contains( 102 cli.ErrBuffer().String(), 103 `Warning: DOCKER_HOST environment variable overrides the active context.`, 104 )) 105 assert.Assert(t, is.Contains(cli.ErrBuffer().String(), `Current context is now "test"`)) 106 assert.Equal(t, cli.OutBuffer().String(), "test\n") 107 108 // setting DOCKER_HOST with the default context should not print a warning 109 cli.ResetOutputBuffers() 110 err = newUseCommand(cli).RunE(nil, []string{"default"}) 111 assert.NilError(t, err) 112 assert.Assert(t, is.Contains(cli.ErrBuffer().String(), `Current context is now "default"`)) 113 assert.Equal(t, cli.OutBuffer().String(), "default\n") 114 } 115 116 // An empty DOCKER_HOST used to break the 'context use' flow. 117 // So we have a test with fewer fakes that tests this flow holistically. 118 // https://github.com/docker/cli/issues/3667 119 func TestUseHostOverrideEmpty(t *testing.T) { 120 t.Setenv("DOCKER_HOST", "") 121 122 configDir := t.TempDir() 123 config.SetDir(configDir) 124 125 socketPath := "unix://" + filepath.Join(configDir, "docker.sock") 126 127 var out *bytes.Buffer 128 var cli *command.DockerCli 129 130 loadCli := func() { 131 out = bytes.NewBuffer(nil) 132 133 var err error 134 cli, err = command.NewDockerCli(command.WithCombinedStreams(out)) 135 assert.NilError(t, err) 136 assert.NilError(t, cli.Initialize(flags.NewClientOptions())) 137 } 138 loadCli() 139 err := RunCreate(cli, &CreateOptions{ 140 Name: "test", 141 Docker: map[string]string{"host": socketPath}, 142 }) 143 assert.NilError(t, err) 144 145 err = newUseCommand(cli).RunE(nil, []string{"test"}) 146 assert.NilError(t, err) 147 assert.Assert(t, !is.Contains(out.String(), "Warning")().Success()) 148 assert.Assert(t, is.Contains(out.String(), `Current context is now "test"`)) 149 150 loadCli() 151 err = newShowCommand(cli).RunE(nil, nil) 152 assert.NilError(t, err) 153 assert.Assert(t, is.Contains(out.String(), "test")) 154 155 apiclient := cli.Client() 156 assert.Equal(t, apiclient.DaemonHost(), socketPath) 157 }