diff --git a/cli/config/config.go b/cli/config/config.go index 38f9ebecc..f473b4139 100644 --- a/cli/config/config.go +++ b/cli/config/config.go @@ -34,6 +34,8 @@ import ( "path/filepath" "github.com/pkg/errors" + + "github.com/docker/api/context/store" ) // LoadFile loads the docker configuration @@ -56,7 +58,7 @@ func WriteCurrentContext(dir string, name string) error { return err } // Match existing CLI behavior - if name == "default" { + if name == store.DefaultContextName { delete(m, currentContextKey) } else { m[currentContextKey] = name diff --git a/cli/config/config_test.go b/cli/config/config_test.go new file mode 100644 index 000000000..a0d8ac217 --- /dev/null +++ b/cli/config/config_test.go @@ -0,0 +1,103 @@ +/* + Copyright (c) 2020 Docker Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH + THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +package config + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" +) + +var sampleConfig = []byte(`{ + "otherField": "value", + "currentContext": "moby" +}`) + +type ConfigTestSuite struct { + suite.Suite + configDir string +} + +func (s *ConfigTestSuite) BeforeTest(suite, test string) { + d, _ := ioutil.TempDir("", "") + s.configDir = d +} + +func (s *ConfigTestSuite) AfterTest(suite, test string) { + err := os.RemoveAll(s.configDir) + require.NoError(s.T(), err) +} + +func writeSampleConfig(t *testing.T, d string) { + err := ioutil.WriteFile(filepath.Join(d, ConfigFileName), sampleConfig, 0644) + require.NoError(t, err) +} + +func (s *ConfigTestSuite) TestLoadFile() { + writeSampleConfig(s.T(), s.configDir) + f, err := LoadFile(s.configDir) + require.NoError(s.T(), err) + require.Equal(s.T(), "moby", f.CurrentContext) +} + +func (s *ConfigTestSuite) TestOverWriteCurrentContext() { + writeSampleConfig(s.T(), s.configDir) + f, err := LoadFile(s.configDir) + require.NoError(s.T(), err) + require.Equal(s.T(), "moby", f.CurrentContext) + + err = WriteCurrentContext(s.configDir, "overwrite") + require.NoError(s.T(), err) + f, err = LoadFile(s.configDir) + require.NoError(s.T(), err) + require.Equal(s.T(), "overwrite", f.CurrentContext) + + m := map[string]interface{}{} + err = loadFile(filepath.Join(s.configDir, ConfigFileName), &m) + require.NoError(s.T(), err) + require.Equal(s.T(), "overwrite", m["currentContext"]) + require.Equal(s.T(), "value", m["otherField"]) +} + +// TestWriteDefaultContextToEmptyConfig tests a specific case seen on the CI: +// panic when setting context to default with empty config file +func (s *ConfigTestSuite) TestWriteDefaultContextToEmptyConfig() { + err := WriteCurrentContext(s.configDir, "default") + require.NoError(s.T(), err) + d, err := ioutil.ReadFile(filepath.Join(s.configDir, ConfigFileName)) + require.NoError(s.T(), err) + require.Equal(s.T(), string(d), "{}") +} + +func TestConfig(t *testing.T) { + suite.Run(t, new(ConfigTestSuite)) +} diff --git a/server/server.go b/server/server.go index b24e2c206..2ae9b1a4d 100644 --- a/server/server.go +++ b/server/server.go @@ -59,7 +59,6 @@ func New() *grpc.Server { return s } - //CreateListener creates a listener either on tcp://, or local listener, supporting unix:// for unix socket or npipe:// for named pipes on windows func CreateListener(address string) (net.Listener, error) { if strings.HasPrefix(address, "tcp://") {