github.com/panekj/cli@v0.0.0-20230304125325-467dd2f3797e/cli/command/defaultcontextstore_test.go (about) 1 package command 2 3 import ( 4 "crypto/rand" 5 "testing" 6 7 "github.com/docker/cli/cli/config/configfile" 8 "github.com/docker/cli/cli/context/docker" 9 "github.com/docker/cli/cli/context/store" 10 cliflags "github.com/docker/cli/cli/flags" 11 "github.com/docker/docker/errdefs" 12 "github.com/docker/go-connections/tlsconfig" 13 "gotest.tools/v3/assert" 14 is "gotest.tools/v3/assert/cmp" 15 "gotest.tools/v3/golden" 16 ) 17 18 type endpoint struct { 19 Foo string `json:"a_very_recognizable_field_name"` 20 } 21 22 type testContext struct { 23 Bar string `json:"another_very_recognizable_field_name"` 24 } 25 26 var testCfg = store.NewConfig(func() interface{} { return &testContext{} }, 27 store.EndpointTypeGetter("ep1", func() interface{} { return &endpoint{} }), 28 store.EndpointTypeGetter("ep2", func() interface{} { return &endpoint{} }), 29 ) 30 31 func testDefaultMetadata() store.Metadata { 32 return store.Metadata{ 33 Endpoints: map[string]interface{}{ 34 "ep1": endpoint{Foo: "bar"}, 35 }, 36 Metadata: testContext{Bar: "baz"}, 37 Name: DefaultContextName, 38 } 39 } 40 41 func testStore(t *testing.T, meta store.Metadata, tls store.ContextTLSData) store.Store { 42 t.Helper() 43 return &ContextStoreWithDefault{ 44 Store: store.New(t.TempDir(), testCfg), 45 Resolver: func() (*DefaultContext, error) { 46 return &DefaultContext{ 47 Meta: meta, 48 TLS: tls, 49 }, nil 50 }, 51 } 52 } 53 54 func TestDefaultContextInitializer(t *testing.T) { 55 cli, err := NewDockerCli() 56 assert.NilError(t, err) 57 t.Setenv("DOCKER_HOST", "ssh://someswarmserver") 58 cli.configFile = &configfile.ConfigFile{} 59 ctx, err := ResolveDefaultContext(&cliflags.ClientOptions{ 60 TLS: true, 61 TLSOptions: &tlsconfig.Options{ 62 CAFile: "./testdata/ca.pem", 63 }, 64 }, DefaultContextStoreConfig()) 65 assert.NilError(t, err) 66 assert.Equal(t, "default", ctx.Meta.Name) 67 assert.DeepEqual(t, "ssh://someswarmserver", ctx.Meta.Endpoints[docker.DockerEndpoint].(docker.EndpointMeta).Host) 68 golden.Assert(t, string(ctx.TLS.Endpoints[docker.DockerEndpoint].Files["ca.pem"]), "ca.pem") 69 } 70 71 func TestExportDefaultImport(t *testing.T) { 72 file1 := make([]byte, 1500) 73 rand.Read(file1) 74 file2 := make([]byte, 3700) 75 rand.Read(file2) 76 s := testStore(t, testDefaultMetadata(), store.ContextTLSData{ 77 Endpoints: map[string]store.EndpointTLSData{ 78 "ep2": { 79 Files: map[string][]byte{ 80 "file1": file1, 81 "file2": file2, 82 }, 83 }, 84 }, 85 }) 86 r := store.Export("default", s) 87 defer r.Close() 88 err := store.Import("dest", s, r) 89 assert.NilError(t, err) 90 91 srcMeta, err := s.GetMetadata("default") 92 assert.NilError(t, err) 93 destMeta, err := s.GetMetadata("dest") 94 assert.NilError(t, err) 95 assert.DeepEqual(t, destMeta.Metadata, srcMeta.Metadata) 96 assert.DeepEqual(t, destMeta.Endpoints, srcMeta.Endpoints) 97 98 srcFileList, err := s.ListTLSFiles("default") 99 assert.NilError(t, err) 100 destFileList, err := s.ListTLSFiles("dest") 101 assert.NilError(t, err) 102 assert.Equal(t, 1, len(destFileList)) 103 assert.Equal(t, 1, len(srcFileList)) 104 assert.Equal(t, 2, len(destFileList["ep2"])) 105 assert.Equal(t, 2, len(srcFileList["ep2"])) 106 107 srcData1, err := s.GetTLSData("default", "ep2", "file1") 108 assert.NilError(t, err) 109 assert.DeepEqual(t, file1, srcData1) 110 srcData2, err := s.GetTLSData("default", "ep2", "file2") 111 assert.NilError(t, err) 112 assert.DeepEqual(t, file2, srcData2) 113 114 destData1, err := s.GetTLSData("dest", "ep2", "file1") 115 assert.NilError(t, err) 116 assert.DeepEqual(t, file1, destData1) 117 destData2, err := s.GetTLSData("dest", "ep2", "file2") 118 assert.NilError(t, err) 119 assert.DeepEqual(t, file2, destData2) 120 } 121 122 func TestListDefaultContext(t *testing.T) { 123 meta := testDefaultMetadata() 124 s := testStore(t, meta, store.ContextTLSData{}) 125 result, err := s.List() 126 assert.NilError(t, err) 127 assert.Equal(t, 1, len(result)) 128 assert.DeepEqual(t, meta, result[0]) 129 } 130 131 func TestGetDefaultContextStorageInfo(t *testing.T) { 132 s := testStore(t, testDefaultMetadata(), store.ContextTLSData{}) 133 result := s.GetStorageInfo(DefaultContextName) 134 assert.Equal(t, "<IN MEMORY>", result.MetadataPath) 135 assert.Equal(t, "<IN MEMORY>", result.TLSPath) 136 } 137 138 func TestGetDefaultContextMetadata(t *testing.T) { 139 meta := testDefaultMetadata() 140 s := testStore(t, meta, store.ContextTLSData{}) 141 result, err := s.GetMetadata(DefaultContextName) 142 assert.NilError(t, err) 143 assert.Equal(t, DefaultContextName, result.Name) 144 assert.DeepEqual(t, meta.Metadata, result.Metadata) 145 assert.DeepEqual(t, meta.Endpoints, result.Endpoints) 146 } 147 148 func TestErrCreateDefault(t *testing.T) { 149 meta := testDefaultMetadata() 150 s := testStore(t, meta, store.ContextTLSData{}) 151 err := s.CreateOrUpdate(store.Metadata{ 152 Endpoints: map[string]interface{}{ 153 "ep1": endpoint{Foo: "bar"}, 154 }, 155 Metadata: testContext{Bar: "baz"}, 156 Name: "default", 157 }) 158 assert.Check(t, is.ErrorType(err, errdefs.IsInvalidParameter)) 159 assert.Error(t, err, "default context cannot be created nor updated") 160 } 161 162 func TestErrRemoveDefault(t *testing.T) { 163 meta := testDefaultMetadata() 164 s := testStore(t, meta, store.ContextTLSData{}) 165 err := s.Remove("default") 166 assert.Check(t, is.ErrorType(err, errdefs.IsInvalidParameter)) 167 assert.Error(t, err, "default context cannot be removed") 168 } 169 170 func TestErrTLSDataError(t *testing.T) { 171 meta := testDefaultMetadata() 172 s := testStore(t, meta, store.ContextTLSData{}) 173 _, err := s.GetTLSData("default", "noop", "noop") 174 assert.Check(t, is.ErrorType(err, errdefs.IsNotFound)) 175 }