From b7337625759bd1c6ba4601b785ea40775610e314 Mon Sep 17 00:00:00 2001 From: Siyuan Liu Date: Tue, 26 May 2020 23:16:07 -0400 Subject: [PATCH] provide and implement a new cache provider (#14496) * provide and implement a new cache provider * make interface more flexible * let Connect and Close return error Co-authored-by: mattermod --- services/cache2/provider.go | 51 ++++++++++++++++++++++ services/cache2/provider_test.go | 72 ++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 services/cache2/provider.go create mode 100644 services/cache2/provider_test.go diff --git a/services/cache2/provider.go b/services/cache2/provider.go new file mode 100644 index 0000000000..284c43993e --- /dev/null +++ b/services/cache2/provider.go @@ -0,0 +1,51 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +package cache2 + +import "time" + +// CacheOptions contains options for initializaing a cache +type CacheOptions struct { + Size int + DefaultExpiry time.Duration + Name string + InvalidateClusterEvent string +} + +// Provider is a provider for Cache +type Provider interface { + // NewCache creates a new cache with given options. + NewCache(opts *CacheOptions) Cache + // Connect opens a new connection to the cache using specific provider parameters. + Connect() error + // Close releases any resources used by the cache provider. + Close() error +} + +type cacheProvider struct { +} + +// NewProvider creates a new CacheProvider +func NewProvider() Provider { + return &cacheProvider{} +} + +// NewCache creates a new cache with given opts +func (c *cacheProvider) NewCache(opts *CacheOptions) Cache { + return NewLRU(&LRUOptions{ + Size: opts.Size, + DefaultExpiry: opts.DefaultExpiry, + InvalidateClusterEvent: opts.InvalidateClusterEvent, + }) +} + +// Connect opens a new connection to the cache using specific provider parameters. +func (c *cacheProvider) Connect() error { + return nil +} + +// Close releases any resources used by the cache provider. +func (c *cacheProvider) Close() error { + return nil +} diff --git a/services/cache2/provider_test.go b/services/cache2/provider_test.go new file mode 100644 index 0000000000..5a22d3af00 --- /dev/null +++ b/services/cache2/provider_test.go @@ -0,0 +1,72 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +package cache2 + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestNewCache(t *testing.T) { + t.Run("with only size option given", func(t *testing.T) { + p := NewProvider() + + size := 1 + c := p.NewCache(&CacheOptions{ + Size: size, + }) + + err := c.Set("key1", "val1") + require.Nil(t, err) + err = c.Set("key2", "val2") + require.Nil(t, err) + l, err := c.Len() + require.Nil(t, err) + require.Equal(t, size, l) + }) + + t.Run("with all options specified", func(t *testing.T) { + p := NewProvider() + + size := 1 + expiry := 1 * time.Second + event := "clusterEvent" + c := p.NewCache(&CacheOptions{ + Size: size, + Name: "name", + DefaultExpiry: expiry, + InvalidateClusterEvent: event, + }) + + require.Equal(t, event, c.GetInvalidateClusterEvent()) + + err := c.SetWithDefaultExpiry("key1", "val1") + require.Nil(t, err) + err = c.SetWithDefaultExpiry("key2", "val2") + require.Nil(t, err) + l, err := c.Len() + require.Nil(t, err) + require.Equal(t, size, l) + + time.Sleep(expiry + 1*time.Second) + + var v string + err = c.Get("key1", &v) + require.Equal(t, ErrKeyNotFound, err) + err = c.Get("key2", &v) + require.Equal(t, ErrKeyNotFound, err) + }) +} + +func TestConnectClose(t *testing.T) { + p := NewProvider() + + err := p.Connect() + require.Nil(t, err) + + err = p.Close() + require.Nil(t, err) +}