github.com/cs3org/reva/v2@v2.27.7/pkg/storage/utils/decomposedfs/metadata/metadata_test.go (about) 1 // Copyright 2018-2021 CERN 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 // 15 // In applying this license, CERN does not waive the privileges and immunities 16 // granted to it by virtue of its status as an Intergovernmental Organization 17 // or submit itself to any jurisdiction. 18 19 package metadata_test 20 21 import ( 22 "context" 23 "os" 24 "path" 25 26 "github.com/cs3org/reva/v2/pkg/storage/cache" 27 "github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/metadata" 28 . "github.com/onsi/ginkgo/v2" 29 . "github.com/onsi/gomega" 30 ) 31 32 var _ = Describe("Backend", func() { 33 var ( 34 tmpdir string 35 file string 36 37 backend metadata.Backend 38 ) 39 40 BeforeEach(func() { 41 var err error 42 tmpdir, err = os.MkdirTemp(os.TempDir(), "XattrsBackendTest-") 43 Expect(err).ToNot(HaveOccurred()) 44 }) 45 46 JustBeforeEach(func() { 47 file = path.Join(tmpdir, "file") 48 }) 49 50 AfterEach(func() { 51 if tmpdir != "" { 52 os.RemoveAll(tmpdir) 53 } 54 }) 55 56 Describe("MessagePackBackend", func() { 57 BeforeEach(func() { 58 backend = metadata.NewMessagePackBackend(tmpdir, cache.Config{ 59 Database: tmpdir, 60 }) 61 }) 62 63 Describe("Set", func() { 64 It("sets an attribute", func() { 65 data := []byte(`bar\`) 66 err := backend.Set(context.Background(), file, "foo", data) 67 Expect(err).ToNot(HaveOccurred()) 68 69 readData, err := backend.Get(context.Background(), file, "foo") 70 Expect(err).ToNot(HaveOccurred()) 71 Expect(readData).To(Equal(data)) 72 }) 73 74 It("handles funny strings", func() { 75 data := []byte(`bar\`) 76 err := backend.Set(context.Background(), file, "foo", data) 77 Expect(err).ToNot(HaveOccurred()) 78 79 readData, err := backend.Get(context.Background(), file, "foo") 80 Expect(err).ToNot(HaveOccurred()) 81 Expect(readData).To(Equal(data)) 82 }) 83 84 It("updates an attribute", func() { 85 err := backend.Set(context.Background(), file, "foo", []byte("bar")) 86 Expect(err).ToNot(HaveOccurred()) 87 err = backend.Set(context.Background(), file, "foo", []byte("baz")) 88 Expect(err).ToNot(HaveOccurred()) 89 90 readData, err := backend.Get(context.Background(), file, "foo") 91 Expect(err).ToNot(HaveOccurred()) 92 Expect(readData).To(Equal([]byte("baz"))) 93 }) 94 95 It("sets an empty attribute", func() { 96 _, err := backend.Get(context.Background(), file, "foo") 97 Expect(err).To(HaveOccurred()) 98 99 err = backend.Set(context.Background(), file, "foo", []byte{}) 100 Expect(err).ToNot(HaveOccurred()) 101 102 v, err := backend.Get(context.Background(), file, "foo") 103 Expect(err).ToNot(HaveOccurred()) 104 Expect(v).To(Equal([]byte{})) 105 }) 106 }) 107 108 Describe("SetMultiple", func() { 109 It("sets attributes", func() { 110 data := map[string][]byte{"foo": []byte("bar"), "baz": []byte("qux")} 111 err := backend.SetMultiple(context.Background(), file, data, true) 112 Expect(err).ToNot(HaveOccurred()) 113 114 readData, err := backend.All(context.Background(), file) 115 Expect(err).ToNot(HaveOccurred()) 116 Expect(readData).To(Equal(data)) 117 }) 118 119 It("updates an attribute", func() { 120 err := backend.Set(context.Background(), file, "foo", []byte("something")) 121 122 data := map[string][]byte{"foo": []byte("bar"), "baz": []byte("qux")} 123 Expect(err).ToNot(HaveOccurred()) 124 err = backend.SetMultiple(context.Background(), file, data, true) 125 Expect(err).ToNot(HaveOccurred()) 126 127 readData, err := backend.All(context.Background(), file) 128 Expect(err).ToNot(HaveOccurred()) 129 Expect(readData).To(Equal(data)) 130 }) 131 }) 132 133 Describe("All", func() { 134 It("returns the entries", func() { 135 data := map[string][]byte{"foo": []byte("123"), "bar": []byte("baz")} 136 err := backend.SetMultiple(context.Background(), file, data, true) 137 Expect(err).ToNot(HaveOccurred()) 138 139 v, err := backend.All(context.Background(), file) 140 Expect(err).ToNot(HaveOccurred()) 141 Expect(len(v)).To(Equal(2)) 142 Expect(v["foo"]).To(Equal([]byte("123"))) 143 Expect(v["bar"]).To(Equal([]byte("baz"))) 144 }) 145 146 It("fails when the metafile does not exist", func() { 147 _, err := backend.All(context.Background(), file) 148 Expect(err).To(HaveOccurred()) 149 }) 150 }) 151 152 Describe("List", func() { 153 It("returns the entries", func() { 154 data := map[string][]byte{"foo": []byte("123"), "bar": []byte("baz")} 155 err := backend.SetMultiple(context.Background(), file, data, true) 156 Expect(err).ToNot(HaveOccurred()) 157 158 v, err := backend.List(context.Background(), file) 159 Expect(err).ToNot(HaveOccurred()) 160 Expect(v).To(ConsistOf("foo", "bar")) 161 }) 162 163 It("fails when the metafile does not exist", func() { 164 _, err := backend.List(context.Background(), file) 165 Expect(err).To(HaveOccurred()) 166 }) 167 }) 168 169 Describe("Get", func() { 170 It("returns the attribute", func() { 171 data := map[string][]byte{"foo": []byte("bar")} 172 err := backend.SetMultiple(context.Background(), file, data, true) 173 Expect(err).ToNot(HaveOccurred()) 174 175 v, err := backend.Get(context.Background(), file, "foo") 176 Expect(err).ToNot(HaveOccurred()) 177 Expect(v).To(Equal([]byte("bar"))) 178 }) 179 180 It("returns an error on unknown attributes", func() { 181 _, err := backend.Get(context.Background(), file, "foo") 182 Expect(err).To(HaveOccurred()) 183 }) 184 }) 185 186 Describe("GetInt64", func() { 187 It("returns the attribute", func() { 188 data := map[string][]byte{"foo": []byte("123")} 189 err := backend.SetMultiple(context.Background(), file, data, true) 190 Expect(err).ToNot(HaveOccurred()) 191 192 v, err := backend.GetInt64(context.Background(), file, "foo") 193 Expect(err).ToNot(HaveOccurred()) 194 Expect(v).To(Equal(int64(123))) 195 }) 196 197 It("returns an error on unknown attributes", func() { 198 _, err := backend.GetInt64(context.Background(), file, "foo") 199 Expect(err).To(HaveOccurred()) 200 }) 201 }) 202 203 Describe("Remove", func() { 204 It("deletes an attribute", func() { 205 data := map[string][]byte{"foo": []byte("bar")} 206 err := backend.SetMultiple(context.Background(), file, data, true) 207 Expect(err).ToNot(HaveOccurred()) 208 209 v, err := backend.Get(context.Background(), file, "foo") 210 Expect(err).ToNot(HaveOccurred()) 211 Expect(v).To(Equal([]byte("bar"))) 212 213 err = backend.Remove(context.Background(), file, "foo", true) 214 Expect(err).ToNot(HaveOccurred()) 215 216 _, err = backend.Get(context.Background(), file, "foo") 217 Expect(err).To(HaveOccurred()) 218 }) 219 }) 220 221 Describe("IsMetaFile", func() { 222 It("returns true", func() { 223 Expect(backend.IsMetaFile("foo.mpk")).To(BeTrue()) 224 }) 225 226 It("returns false", func() { 227 Expect(backend.IsMetaFile("foo.txt")).To(BeFalse()) 228 }) 229 }) 230 }) 231 })