github.com/slene/docker@v1.8.0-rc1/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  	"os/exec"
     9  	"path/filepath"
    10  	"runtime"
    11  
    12  	"github.com/docker/docker/autogen/dockerversion"
    13  	"github.com/docker/docker/pkg/homedir"
    14  	"github.com/go-check/check"
    15  )
    16  
    17  func (s *DockerSuite) TestConfigHttpHeader(c *check.C) {
    18  	testRequires(c, UnixCli) // Can't set/unset HOME on windows right now
    19  	// We either need a level of Go that supports Unsetenv (for cases
    20  	// when HOME/USERPROFILE isn't set), or we need to be able to use
    21  	// os/user but user.Current() only works if we aren't statically compiling
    22  
    23  	var headers map[string][]string
    24  
    25  	server := httptest.NewServer(http.HandlerFunc(
    26  		func(w http.ResponseWriter, r *http.Request) {
    27  			headers = r.Header
    28  		}))
    29  	defer server.Close()
    30  
    31  	homeKey := homedir.Key()
    32  	homeVal := homedir.Get()
    33  	tmpDir, _ := ioutil.TempDir("", "fake-home")
    34  	defer os.RemoveAll(tmpDir)
    35  
    36  	dotDocker := filepath.Join(tmpDir, ".docker")
    37  	os.Mkdir(dotDocker, 0600)
    38  	tmpCfg := filepath.Join(dotDocker, "config.json")
    39  
    40  	defer func() { os.Setenv(homeKey, homeVal) }()
    41  	os.Setenv(homeKey, tmpDir)
    42  
    43  	data := `{
    44  		"HttpHeaders": { "MyHeader": "MyValue" }
    45  	}`
    46  
    47  	err := ioutil.WriteFile(tmpCfg, []byte(data), 0600)
    48  	if err != nil {
    49  		c.Fatalf("Err creating file(%s): %v", tmpCfg, err)
    50  	}
    51  
    52  	cmd := exec.Command(dockerBinary, "-H="+server.URL[7:], "ps")
    53  	out, _, _ := runCommandWithOutput(cmd)
    54  
    55  	if headers["User-Agent"] == nil {
    56  		c.Fatalf("Missing User-Agent: %q\nout:%v", headers, out)
    57  	}
    58  
    59  	if headers["User-Agent"][0] != "Docker-Client/"+dockerversion.VERSION+" ("+runtime.GOOS+")" {
    60  		c.Fatalf("Badly formatted User-Agent: %q\nout:%v", headers, out)
    61  	}
    62  
    63  	if headers["Myheader"] == nil || headers["Myheader"][0] != "MyValue" {
    64  		c.Fatalf("Missing/bad header: %q\nout:%v", headers, out)
    65  	}
    66  }
    67  
    68  func (s *DockerSuite) TestConfigDir(c *check.C) {
    69  	cDir, _ := ioutil.TempDir("", "fake-home")
    70  
    71  	// First make sure pointing to empty dir doesn't generate an error
    72  	out, rc := dockerCmd(c, "--config", cDir, "ps")
    73  
    74  	if rc != 0 {
    75  		c.Fatalf("ps1 didn't work:\nrc:%d\nout%s", rc, out)
    76  	}
    77  
    78  	// Test with env var too
    79  	cmd := exec.Command(dockerBinary, "ps")
    80  	cmd.Env = append(os.Environ(), "DOCKER_CONFIG="+cDir)
    81  	out, rc, err := runCommandWithOutput(cmd)
    82  
    83  	if rc != 0 || err != nil {
    84  		c.Fatalf("ps2 didn't work:\nrc:%d\nout%s\nerr:%v", rc, out, err)
    85  	}
    86  
    87  	// Start a server so we can check to see if the config file was
    88  	// loaded properly
    89  	var headers map[string][]string
    90  
    91  	server := httptest.NewServer(http.HandlerFunc(
    92  		func(w http.ResponseWriter, r *http.Request) {
    93  			headers = r.Header
    94  		}))
    95  	defer server.Close()
    96  
    97  	// Create a dummy config file in our new config dir
    98  	data := `{
    99  		"HttpHeaders": { "MyHeader": "MyValue" }
   100  	}`
   101  
   102  	tmpCfg := filepath.Join(cDir, "config.json")
   103  	err = ioutil.WriteFile(tmpCfg, []byte(data), 0600)
   104  	if err != nil {
   105  		c.Fatalf("Err creating file(%s): %v", tmpCfg, err)
   106  	}
   107  
   108  	cmd = exec.Command(dockerBinary, "--config", cDir, "-H="+server.URL[7:], "ps")
   109  	out, _, _ = runCommandWithOutput(cmd)
   110  
   111  	if headers["Myheader"] == nil || headers["Myheader"][0] != "MyValue" {
   112  		c.Fatalf("ps3 - Missing header: %q\nout:%v", headers, out)
   113  	}
   114  
   115  	// Reset headers and try again using env var this time
   116  	headers = map[string][]string{}
   117  	cmd = exec.Command(dockerBinary, "-H="+server.URL[7:], "ps")
   118  	cmd.Env = append(os.Environ(), "DOCKER_CONFIG="+cDir)
   119  	out, _, _ = runCommandWithOutput(cmd)
   120  
   121  	if headers["Myheader"] == nil || headers["Myheader"][0] != "MyValue" {
   122  		c.Fatalf("ps4 - Missing header: %q\nout:%v", headers, out)
   123  	}
   124  
   125  	// Reset headers and make sure flag overrides the env var
   126  	headers = map[string][]string{}
   127  	cmd = exec.Command(dockerBinary, "--config", cDir, "-H="+server.URL[7:], "ps")
   128  	cmd.Env = append(os.Environ(), "DOCKER_CONFIG=MissingDir")
   129  	out, _, _ = runCommandWithOutput(cmd)
   130  
   131  	if headers["Myheader"] == nil || headers["Myheader"][0] != "MyValue" {
   132  		c.Fatalf("ps5 - Missing header: %q\nout:%v", headers, out)
   133  	}
   134  
   135  	// Reset headers and make sure flag overrides the env var.
   136  	// Almost same as previous but make sure the "MissingDir" isn't
   137  	// ignore - we don't want to default back to the env var.
   138  	headers = map[string][]string{}
   139  	cmd = exec.Command(dockerBinary, "--config", "MissingDir", "-H="+server.URL[7:], "ps")
   140  	cmd.Env = append(os.Environ(), "DOCKER_CONFIG="+cDir)
   141  	out, _, _ = runCommandWithOutput(cmd)
   142  
   143  	if headers["Myheader"] != nil {
   144  		c.Fatalf("ps6 - Headers are there but shouldn't be: %q\nout:%v", headers, out)
   145  	}
   146  
   147  }