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  })