github.com/haalcala/mattermost-server-change-repo/v5@v5.33.2/services/cache/provider_test.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package cache
     5  
     6  import (
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  func TestNewCache(t *testing.T) {
    14  	t.Run("with only size option given", func(t *testing.T) {
    15  		p := NewProvider()
    16  
    17  		size := 1
    18  		c, err := p.NewCache(&CacheOptions{
    19  			Size: size,
    20  		})
    21  		require.NoError(t, err)
    22  
    23  		err = c.Set("key1", "val1")
    24  		require.NoError(t, err)
    25  		err = c.Set("key2", "val2")
    26  		require.NoError(t, err)
    27  		err = c.Set("key3", "val3")
    28  		require.NoError(t, err)
    29  		l, err := c.Len()
    30  		require.NoError(t, err)
    31  		require.Equal(t, size, l)
    32  	})
    33  
    34  	t.Run("with only size option given", func(t *testing.T) {
    35  		p := NewProvider()
    36  
    37  		size := 1
    38  		c, err := p.NewCache(&CacheOptions{
    39  			Size: size,
    40  		})
    41  		require.NoError(t, err)
    42  
    43  		err = c.Set("key1", "val1")
    44  		require.NoError(t, err)
    45  		err = c.Set("key2", "val2")
    46  		require.NoError(t, err)
    47  		err = c.Set("key3", "val3")
    48  		require.NoError(t, err)
    49  		l, err := c.Len()
    50  		require.NoError(t, err)
    51  		require.Equal(t, size, l)
    52  	})
    53  
    54  	t.Run("with all options specified", func(t *testing.T) {
    55  		p := NewProvider()
    56  
    57  		size := 1
    58  		expiry := 1 * time.Second
    59  		event := "clusterEvent"
    60  		c, err := p.NewCache(&CacheOptions{
    61  			Size:                   size,
    62  			Name:                   "name",
    63  			DefaultExpiry:          expiry,
    64  			InvalidateClusterEvent: event,
    65  		})
    66  		require.NoError(t, err)
    67  
    68  		require.Equal(t, event, c.GetInvalidateClusterEvent())
    69  
    70  		err = c.SetWithDefaultExpiry("key1", "val1")
    71  		require.NoError(t, err)
    72  		err = c.SetWithDefaultExpiry("key2", "val2")
    73  		require.NoError(t, err)
    74  		err = c.SetWithDefaultExpiry("key3", "val3")
    75  		require.NoError(t, err)
    76  		l, err := c.Len()
    77  		require.NoError(t, err)
    78  		require.Equal(t, size, l)
    79  
    80  		time.Sleep(expiry + 1*time.Second)
    81  
    82  		var v string
    83  		err = c.Get("key1", &v)
    84  		require.Equal(t, ErrKeyNotFound, err)
    85  		err = c.Get("key2", &v)
    86  		require.Equal(t, ErrKeyNotFound, err)
    87  		err = c.Get("key3", &v)
    88  		require.Equal(t, ErrKeyNotFound, err)
    89  	})
    90  }
    91  
    92  func TestNewCache_Striped(t *testing.T) {
    93  	t.Run("with only size option given", func(t *testing.T) {
    94  		p := NewProvider()
    95  
    96  		size := 1
    97  		c, err := p.NewCache(&CacheOptions{
    98  			Size:           size,
    99  			Striped:        true,
   100  			StripedBuckets: 1,
   101  		})
   102  		require.NoError(t, err)
   103  
   104  		err = c.Set("key1", "val1")
   105  		require.NoError(t, err)
   106  		err = c.Set("key2", "val2")
   107  		require.NoError(t, err)
   108  		err = c.Set("key3", "val3")
   109  		require.NoError(t, err)
   110  		l, err := c.Len()
   111  		require.NoError(t, err)
   112  		require.Equal(t, size+1, l) // +10% from striping
   113  	})
   114  
   115  	t.Run("with only size option given", func(t *testing.T) {
   116  		p := NewProvider()
   117  
   118  		size := 1
   119  		c, err := p.NewCache(&CacheOptions{
   120  			Size:           size,
   121  			Striped:        true,
   122  			StripedBuckets: 1,
   123  		})
   124  		require.NoError(t, err)
   125  
   126  		err = c.Set("key1", "val1")
   127  		require.NoError(t, err)
   128  		err = c.Set("key2", "val2")
   129  		require.NoError(t, err)
   130  		err = c.Set("key3", "val3")
   131  		require.NoError(t, err)
   132  		l, err := c.Len()
   133  		require.NoError(t, err)
   134  		require.Equal(t, size+1, l) // +10% rounded up from striped lru
   135  	})
   136  
   137  	t.Run("with all options specified", func(t *testing.T) {
   138  		p := NewProvider()
   139  
   140  		size := 1
   141  		expiry := 1 * time.Second
   142  		event := "clusterEvent"
   143  		c, err := p.NewCache(&CacheOptions{
   144  			Size:                   size,
   145  			Name:                   "name",
   146  			DefaultExpiry:          expiry,
   147  			InvalidateClusterEvent: event,
   148  			Striped:                true,
   149  			StripedBuckets:         1,
   150  		})
   151  		require.NoError(t, err)
   152  
   153  		require.Equal(t, event, c.GetInvalidateClusterEvent())
   154  
   155  		err = c.SetWithDefaultExpiry("key1", "val1")
   156  		require.NoError(t, err)
   157  		err = c.SetWithDefaultExpiry("key2", "val2")
   158  		require.NoError(t, err)
   159  		err = c.SetWithDefaultExpiry("key3", "val3")
   160  		require.NoError(t, err)
   161  		l, err := c.Len()
   162  		require.NoError(t, err)
   163  		require.Equal(t, size+1, l) // +10% from striping
   164  
   165  		time.Sleep(expiry + 1*time.Second)
   166  
   167  		var v string
   168  		err = c.Get("key1", &v)
   169  		require.Equal(t, ErrKeyNotFound, err)
   170  		err = c.Get("key2", &v)
   171  		require.Equal(t, ErrKeyNotFound, err)
   172  		err = c.Get("key3", &v)
   173  		require.Equal(t, ErrKeyNotFound, err)
   174  	})
   175  }
   176  
   177  func TestConnectClose(t *testing.T) {
   178  	p := NewProvider()
   179  
   180  	err := p.Connect()
   181  	require.NoError(t, err)
   182  
   183  	err = p.Close()
   184  	require.NoError(t, err)
   185  }