github.com/fabiokung/docker@v0.11.2-0.20170222101415-4534dcd49497/integration-cli/docker_cli_config_test.go (about) 1 package main 2 3 import ( 4 "io/ioutil" 5 "net/http" 6 "net/http/httptest" 7 "os" 8 "path/filepath" 9 "runtime" 10 11 "github.com/docker/docker/api" 12 "github.com/docker/docker/dockerversion" 13 "github.com/docker/docker/integration-cli/checker" 14 "github.com/docker/docker/pkg/homedir" 15 icmd "github.com/docker/docker/pkg/testutil/cmd" 16 "github.com/go-check/check" 17 ) 18 19 func (s *DockerSuite) TestConfigHTTPHeader(c *check.C) { 20 testRequires(c, UnixCli) // Can't set/unset HOME on windows right now 21 // We either need a level of Go that supports Unsetenv (for cases 22 // when HOME/USERPROFILE isn't set), or we need to be able to use 23 // os/user but user.Current() only works if we aren't statically compiling 24 25 var headers map[string][]string 26 27 server := httptest.NewServer(http.HandlerFunc( 28 func(w http.ResponseWriter, r *http.Request) { 29 w.Header().Set("API-Version", api.DefaultVersion) 30 headers = r.Header 31 })) 32 defer server.Close() 33 34 homeKey := homedir.Key() 35 homeVal := homedir.Get() 36 tmpDir, err := ioutil.TempDir("", "fake-home") 37 c.Assert(err, checker.IsNil) 38 defer os.RemoveAll(tmpDir) 39 40 dotDocker := filepath.Join(tmpDir, ".docker") 41 os.Mkdir(dotDocker, 0600) 42 tmpCfg := filepath.Join(dotDocker, "config.json") 43 44 defer func() { os.Setenv(homeKey, homeVal) }() 45 os.Setenv(homeKey, tmpDir) 46 47 data := `{ 48 "HttpHeaders": { "MyHeader": "MyValue" } 49 }` 50 51 err = ioutil.WriteFile(tmpCfg, []byte(data), 0600) 52 c.Assert(err, checker.IsNil) 53 54 result := icmd.RunCommand(dockerBinary, "-H="+server.URL[7:], "ps") 55 result.Assert(c, icmd.Expected{ 56 ExitCode: 1, 57 Error: "exit status 1", 58 }) 59 60 c.Assert(headers["User-Agent"], checker.NotNil, check.Commentf("Missing User-Agent")) 61 62 c.Assert(headers["User-Agent"][0], checker.Equals, "Docker-Client/"+dockerversion.Version+" ("+runtime.GOOS+")", check.Commentf("Badly formatted User-Agent,out:%v", result.Combined())) 63 64 c.Assert(headers["Myheader"], checker.NotNil) 65 c.Assert(headers["Myheader"][0], checker.Equals, "MyValue", check.Commentf("Missing/bad header,out:%v", result.Combined())) 66 67 } 68 69 func (s *DockerSuite) TestConfigDir(c *check.C) { 70 cDir, err := ioutil.TempDir("", "fake-home") 71 c.Assert(err, checker.IsNil) 72 defer os.RemoveAll(cDir) 73 74 // First make sure pointing to empty dir doesn't generate an error 75 dockerCmd(c, "--config", cDir, "ps") 76 77 // Test with env var too 78 icmd.RunCmd(icmd.Cmd{ 79 Command: []string{dockerBinary, "ps"}, 80 Env: appendBaseEnv(true, "DOCKER_CONFIG="+cDir), 81 }).Assert(c, icmd.Success) 82 83 // Start a server so we can check to see if the config file was 84 // loaded properly 85 var headers map[string][]string 86 87 server := httptest.NewServer(http.HandlerFunc( 88 func(w http.ResponseWriter, r *http.Request) { 89 headers = r.Header 90 })) 91 defer server.Close() 92 93 // Create a dummy config file in our new config dir 94 data := `{ 95 "HttpHeaders": { "MyHeader": "MyValue" } 96 }` 97 98 tmpCfg := filepath.Join(cDir, "config.json") 99 err = ioutil.WriteFile(tmpCfg, []byte(data), 0600) 100 c.Assert(err, checker.IsNil, check.Commentf("Err creating file")) 101 102 env := appendBaseEnv(false) 103 104 icmd.RunCmd(icmd.Cmd{ 105 Command: []string{dockerBinary, "--config", cDir, "-H=" + server.URL[7:], "ps"}, 106 Env: env, 107 }).Assert(c, icmd.Expected{ 108 ExitCode: 1, 109 Error: "exit status 1", 110 }) 111 c.Assert(headers["Myheader"], checker.NotNil) 112 c.Assert(headers["Myheader"][0], checker.Equals, "MyValue", check.Commentf("ps3 - Missing header")) 113 114 // Reset headers and try again using env var this time 115 headers = map[string][]string{} 116 icmd.RunCmd(icmd.Cmd{ 117 Command: []string{dockerBinary, "--config", cDir, "-H=" + server.URL[7:], "ps"}, 118 Env: append(env, "DOCKER_CONFIG="+cDir), 119 }).Assert(c, icmd.Expected{ 120 ExitCode: 1, 121 }) 122 c.Assert(headers["Myheader"], checker.NotNil) 123 c.Assert(headers["Myheader"][0], checker.Equals, "MyValue", check.Commentf("ps4 - Missing header")) 124 125 // FIXME(vdemeester) should be a unit test 126 // Reset headers and make sure flag overrides the env var 127 headers = map[string][]string{} 128 icmd.RunCmd(icmd.Cmd{ 129 Command: []string{dockerBinary, "--config", cDir, "-H=" + server.URL[7:], "ps"}, 130 Env: append(env, "DOCKER_CONFIG=MissingDir"), 131 }).Assert(c, icmd.Expected{ 132 ExitCode: 1, 133 }) 134 c.Assert(headers["Myheader"], checker.NotNil) 135 c.Assert(headers["Myheader"][0], checker.Equals, "MyValue", check.Commentf("ps5 - Missing header")) 136 137 // FIXME(vdemeester) should be a unit test 138 // Reset headers and make sure flag overrides the env var. 139 // Almost same as previous but make sure the "MissingDir" isn't 140 // ignore - we don't want to default back to the env var. 141 headers = map[string][]string{} 142 icmd.RunCmd(icmd.Cmd{ 143 Command: []string{dockerBinary, "--config", "MissingDir", "-H=" + server.URL[7:], "ps"}, 144 Env: append(env, "DOCKER_CONFIG="+cDir), 145 }).Assert(c, icmd.Expected{ 146 ExitCode: 1, 147 Error: "exit status 1", 148 }) 149 150 c.Assert(headers["Myheader"], checker.IsNil, check.Commentf("ps6 - Headers shouldn't be the expected value")) 151 }