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 }