github.com/ali-iotechsys/cli@v20.10.0+incompatible/cli/context/store/store_test.go (about) 1 package store 2 3 import ( 4 "archive/tar" 5 "archive/zip" 6 "bufio" 7 "bytes" 8 "crypto/rand" 9 "encoding/json" 10 "io" 11 "io/ioutil" 12 "os" 13 "path" 14 "testing" 15 16 "gotest.tools/v3/assert" 17 ) 18 19 type endpoint struct { 20 Foo string `json:"a_very_recognizable_field_name"` 21 } 22 23 type context struct { 24 Bar string `json:"another_very_recognizable_field_name"` 25 } 26 27 var testCfg = NewConfig(func() interface{} { return &context{} }, 28 EndpointTypeGetter("ep1", func() interface{} { return &endpoint{} }), 29 EndpointTypeGetter("ep2", func() interface{} { return &endpoint{} }), 30 ) 31 32 func TestExportImport(t *testing.T) { 33 testDir, err := ioutil.TempDir("", t.Name()) 34 assert.NilError(t, err) 35 defer os.RemoveAll(testDir) 36 s := New(testDir, testCfg) 37 err = s.CreateOrUpdate( 38 Metadata{ 39 Endpoints: map[string]interface{}{ 40 "ep1": endpoint{Foo: "bar"}, 41 }, 42 Metadata: context{Bar: "baz"}, 43 Name: "source", 44 }) 45 assert.NilError(t, err) 46 file1 := make([]byte, 1500) 47 rand.Read(file1) 48 file2 := make([]byte, 3700) 49 rand.Read(file2) 50 err = s.ResetEndpointTLSMaterial("source", "ep1", &EndpointTLSData{ 51 Files: map[string][]byte{ 52 "file1": file1, 53 "file2": file2, 54 }, 55 }) 56 assert.NilError(t, err) 57 r := Export("source", s) 58 defer r.Close() 59 err = Import("dest", s, r) 60 assert.NilError(t, err) 61 srcMeta, err := s.GetMetadata("source") 62 assert.NilError(t, err) 63 destMeta, err := s.GetMetadata("dest") 64 assert.NilError(t, err) 65 assert.DeepEqual(t, destMeta.Metadata, srcMeta.Metadata) 66 assert.DeepEqual(t, destMeta.Endpoints, srcMeta.Endpoints) 67 srcFileList, err := s.ListTLSFiles("source") 68 assert.NilError(t, err) 69 destFileList, err := s.ListTLSFiles("dest") 70 assert.NilError(t, err) 71 assert.Equal(t, 1, len(destFileList)) 72 assert.Equal(t, 1, len(srcFileList)) 73 assert.Equal(t, 2, len(destFileList["ep1"])) 74 assert.Equal(t, 2, len(srcFileList["ep1"])) 75 srcData1, err := s.GetTLSData("source", "ep1", "file1") 76 assert.NilError(t, err) 77 assert.DeepEqual(t, file1, srcData1) 78 srcData2, err := s.GetTLSData("source", "ep1", "file2") 79 assert.NilError(t, err) 80 assert.DeepEqual(t, file2, srcData2) 81 destData1, err := s.GetTLSData("dest", "ep1", "file1") 82 assert.NilError(t, err) 83 assert.DeepEqual(t, file1, destData1) 84 destData2, err := s.GetTLSData("dest", "ep1", "file2") 85 assert.NilError(t, err) 86 assert.DeepEqual(t, file2, destData2) 87 } 88 89 func TestRemove(t *testing.T) { 90 testDir, err := ioutil.TempDir("", t.Name()) 91 assert.NilError(t, err) 92 defer os.RemoveAll(testDir) 93 s := New(testDir, testCfg) 94 err = s.CreateOrUpdate( 95 Metadata{ 96 Endpoints: map[string]interface{}{ 97 "ep1": endpoint{Foo: "bar"}, 98 }, 99 Metadata: context{Bar: "baz"}, 100 Name: "source", 101 }) 102 assert.NilError(t, err) 103 assert.NilError(t, s.ResetEndpointTLSMaterial("source", "ep1", &EndpointTLSData{ 104 Files: map[string][]byte{ 105 "file1": []byte("test-data"), 106 }, 107 })) 108 assert.NilError(t, s.Remove("source")) 109 _, err = s.GetMetadata("source") 110 assert.Check(t, IsErrContextDoesNotExist(err)) 111 f, err := s.ListTLSFiles("source") 112 assert.NilError(t, err) 113 assert.Equal(t, 0, len(f)) 114 } 115 116 func TestListEmptyStore(t *testing.T) { 117 testDir, err := ioutil.TempDir("", t.Name()) 118 assert.NilError(t, err) 119 defer os.RemoveAll(testDir) 120 store := New(testDir, testCfg) 121 result, err := store.List() 122 assert.NilError(t, err) 123 assert.Check(t, len(result) == 0) 124 } 125 126 func TestErrHasCorrectContext(t *testing.T) { 127 testDir, err := ioutil.TempDir("", t.Name()) 128 assert.NilError(t, err) 129 defer os.RemoveAll(testDir) 130 store := New(testDir, testCfg) 131 _, err = store.GetMetadata("no-exists") 132 assert.ErrorContains(t, err, "no-exists") 133 assert.Check(t, IsErrContextDoesNotExist(err)) 134 } 135 136 func TestDetectImportContentType(t *testing.T) { 137 testDir, err := ioutil.TempDir("", t.Name()) 138 assert.NilError(t, err) 139 defer os.RemoveAll(testDir) 140 141 buf := new(bytes.Buffer) 142 r := bufio.NewReader(buf) 143 ct, err := getImportContentType(r) 144 assert.NilError(t, err) 145 assert.Assert(t, zipType != ct) 146 } 147 148 func TestImportTarInvalid(t *testing.T) { 149 testDir, err := ioutil.TempDir("", t.Name()) 150 assert.NilError(t, err) 151 defer os.RemoveAll(testDir) 152 153 tf := path.Join(testDir, "test.context") 154 155 f, err := os.Create(tf) 156 assert.NilError(t, err) 157 defer f.Close() 158 159 tw := tar.NewWriter(f) 160 hdr := &tar.Header{ 161 Name: "dummy-file", 162 Mode: 0600, 163 Size: int64(len("hello world")), 164 } 165 err = tw.WriteHeader(hdr) 166 assert.NilError(t, err) 167 _, err = tw.Write([]byte("hello world")) 168 assert.NilError(t, err) 169 err = tw.Close() 170 assert.NilError(t, err) 171 172 source, err := os.Open(tf) 173 assert.NilError(t, err) 174 defer source.Close() 175 var r io.Reader = source 176 s := New(testDir, testCfg) 177 err = Import("tarInvalid", s, r) 178 assert.ErrorContains(t, err, "invalid context: no metadata found") 179 } 180 181 func TestImportZip(t *testing.T) { 182 testDir, err := ioutil.TempDir("", t.Name()) 183 assert.NilError(t, err) 184 defer os.RemoveAll(testDir) 185 186 zf := path.Join(testDir, "test.zip") 187 188 f, err := os.Create(zf) 189 assert.NilError(t, err) 190 defer f.Close() 191 w := zip.NewWriter(f) 192 193 meta, err := json.Marshal(Metadata{ 194 Endpoints: map[string]interface{}{ 195 "ep1": endpoint{Foo: "bar"}, 196 }, 197 Metadata: context{Bar: "baz"}, 198 Name: "source", 199 }) 200 assert.NilError(t, err) 201 var files = []struct { 202 Name, Body string 203 }{ 204 {"meta.json", string(meta)}, 205 {path.Join("tls", "docker", "ca.pem"), string([]byte("ca.pem"))}, 206 } 207 208 for _, file := range files { 209 f, err := w.Create(file.Name) 210 assert.NilError(t, err) 211 _, err = f.Write([]byte(file.Body)) 212 assert.NilError(t, err) 213 } 214 215 err = w.Close() 216 assert.NilError(t, err) 217 218 source, err := os.Open(zf) 219 assert.NilError(t, err) 220 ct, err := getImportContentType(bufio.NewReader(source)) 221 assert.NilError(t, err) 222 assert.Equal(t, zipType, ct) 223 224 source, _ = os.Open(zf) 225 defer source.Close() 226 var r io.Reader = source 227 s := New(testDir, testCfg) 228 err = Import("zipTest", s, r) 229 assert.NilError(t, err) 230 } 231 232 func TestImportZipInvalid(t *testing.T) { 233 testDir, err := ioutil.TempDir("", t.Name()) 234 assert.NilError(t, err) 235 defer os.RemoveAll(testDir) 236 237 zf := path.Join(testDir, "test.zip") 238 239 f, err := os.Create(zf) 240 assert.NilError(t, err) 241 defer f.Close() 242 w := zip.NewWriter(f) 243 244 df, err := w.Create("dummy-file") 245 assert.NilError(t, err) 246 _, err = df.Write([]byte("hello world")) 247 assert.NilError(t, err) 248 err = w.Close() 249 assert.NilError(t, err) 250 251 source, err := os.Open(zf) 252 assert.NilError(t, err) 253 defer source.Close() 254 var r io.Reader = source 255 s := New(testDir, testCfg) 256 err = Import("zipInvalid", s, r) 257 assert.ErrorContains(t, err, "invalid context: no metadata found") 258 }