github.com/cs3org/reva/v2@v2.27.7/pkg/storage/utils/decomposedfs/mtimesyncedcache/mtimesyncedcache_test.go (about)

     1  package mtimesyncedcache_test
     2  
     3  import (
     4  	"errors"
     5  	"time"
     6  
     7  	. "github.com/onsi/ginkgo/v2"
     8  	. "github.com/onsi/gomega"
     9  
    10  	"github.com/cs3org/reva/v2/pkg/storage/utils/decomposedfs/mtimesyncedcache"
    11  )
    12  
    13  var _ = Describe("Mtimesyncedcache", func() {
    14  	var (
    15  		cache mtimesyncedcache.Cache[string, string]
    16  
    17  		key   = "key"
    18  		value = "value"
    19  	)
    20  
    21  	BeforeEach(func() {
    22  		cache = mtimesyncedcache.New[string, string]()
    23  	})
    24  
    25  	Describe("Store", func() {
    26  		It("stores a value", func() {
    27  			time := time.Now()
    28  
    29  			err := cache.Store(key, time, value)
    30  			Expect(err).ToNot(HaveOccurred())
    31  		})
    32  	})
    33  
    34  	Describe("Load", func() {
    35  		It("loads the stored value", func() {
    36  			err := cache.Store(key, time.Now(), value)
    37  			Expect(err).ToNot(HaveOccurred())
    38  
    39  			v, ok := cache.Load(key)
    40  			Expect(ok).To(BeTrue())
    41  			Expect(v).To(Equal(value))
    42  		})
    43  
    44  		It("reports when the key doesn't exist", func() {
    45  			_, ok := cache.Load("doesnotexist")
    46  			Expect(ok).To(BeFalse())
    47  		})
    48  	})
    49  
    50  	Describe("LoadOrStore", func() {
    51  		It("does not update the cache if the cache is up to date", func() {
    52  			cachedTime := time.Now().Add(-1 * time.Hour)
    53  			err := cache.Store(key, cachedTime, value)
    54  			Expect(err).ToNot(HaveOccurred())
    55  
    56  			newvalue := "yaaay"
    57  			v, err := cache.LoadOrStore(key, cachedTime, func() (string, error) {
    58  				return newvalue, nil
    59  			})
    60  			Expect(err).ToNot(HaveOccurred())
    61  			Expect(v).To(Equal(value))
    62  
    63  			v, err = cache.LoadOrStore(key, time.Now().Add(-2*time.Hour), func() (string, error) {
    64  				return newvalue, nil
    65  			})
    66  			Expect(err).ToNot(HaveOccurred())
    67  			Expect(v).To(Equal(value))
    68  		})
    69  
    70  		It("updates the cache if the cache is outdated", func() {
    71  			outdatedTime := time.Now().Add(-1 * time.Hour)
    72  			err := cache.Store(key, outdatedTime, value)
    73  			Expect(err).ToNot(HaveOccurred())
    74  
    75  			newvalue := "yaaay"
    76  			v, err := cache.LoadOrStore(key, time.Now(), func() (string, error) {
    77  				return newvalue, nil
    78  			})
    79  			Expect(err).ToNot(HaveOccurred())
    80  			Expect(v).To(Equal(newvalue))
    81  		})
    82  
    83  		It("stores the value if the key doesn't exist yet", func() {
    84  			newvalue := "yaaay"
    85  			v, err := cache.LoadOrStore(key, time.Now(), func() (string, error) {
    86  				return newvalue, nil
    87  			})
    88  			Expect(err).ToNot(HaveOccurred())
    89  			Expect(v).To(Equal(newvalue))
    90  		})
    91  
    92  		It("sets the mtime when storing the value", func() {
    93  			newTime := time.Now()
    94  
    95  			newvalue := "yaaay"
    96  			v, err := cache.LoadOrStore(key, newTime, func() (string, error) {
    97  				return newvalue, nil
    98  			})
    99  			Expect(err).ToNot(HaveOccurred())
   100  			Expect(v).To(Equal(newvalue))
   101  
   102  			newvalue2 := "asdfasdf"
   103  			v, err = cache.LoadOrStore(key, newTime, func() (string, error) {
   104  				return newvalue2, nil
   105  			})
   106  			Expect(err).ToNot(HaveOccurred())
   107  			Expect(v).To(Equal(newvalue))
   108  		})
   109  
   110  		It("passes on error from the store func", func() {
   111  			v, err := cache.LoadOrStore(key, time.Now(), func() (string, error) {
   112  				return "", errors.New("baa")
   113  			})
   114  			Expect(v).To(Equal(""))
   115  			Expect(err.Error()).To(Equal("baa"))
   116  
   117  		})
   118  	})
   119  })