github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/store/localcachelayer/channel_layer_test.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package localcachelayer 5 6 import ( 7 "testing" 8 9 "github.com/mattermost/mattermost-server/v5/model" 10 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/require" 13 14 "github.com/mattermost/mattermost-server/v5/store/storetest" 15 "github.com/mattermost/mattermost-server/v5/store/storetest/mocks" 16 ) 17 18 func TestChannelStore(t *testing.T) { 19 StoreTest(t, storetest.TestReactionStore) 20 } 21 22 func TestChannelStoreChannelMemberCountsCache(t *testing.T) { 23 countResult := int64(10) 24 25 t.Run("first call not cached, second cached and returning same data", func(t *testing.T) { 26 mockStore := getMockStore() 27 mockCacheProvider := getMockCacheProvider() 28 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 29 30 count, err := cachedStore.Channel().GetMemberCount("id", true) 31 require.Nil(t, err) 32 assert.Equal(t, count, countResult) 33 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 1) 34 count, err = cachedStore.Channel().GetMemberCount("id", true) 35 require.Nil(t, err) 36 assert.Equal(t, count, countResult) 37 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 1) 38 }) 39 40 t.Run("first call not cached, second force not cached", func(t *testing.T) { 41 mockStore := getMockStore() 42 mockCacheProvider := getMockCacheProvider() 43 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 44 45 cachedStore.Channel().GetMemberCount("id", true) 46 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 1) 47 cachedStore.Channel().GetMemberCount("id", false) 48 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 2) 49 }) 50 51 t.Run("first call force not cached, second not cached, third cached", func(t *testing.T) { 52 mockStore := getMockStore() 53 mockCacheProvider := getMockCacheProvider() 54 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 55 56 cachedStore.Channel().GetMemberCount("id", false) 57 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 1) 58 cachedStore.Channel().GetMemberCount("id", true) 59 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 2) 60 cachedStore.Channel().GetMemberCount("id", true) 61 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 2) 62 }) 63 64 t.Run("first call with GetMemberCountFromCache not cached, second cached and returning same data", func(t *testing.T) { 65 mockStore := getMockStore() 66 mockCacheProvider := getMockCacheProvider() 67 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 68 69 count := cachedStore.Channel().GetMemberCountFromCache("id") 70 assert.Equal(t, count, countResult) 71 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 1) 72 count = cachedStore.Channel().GetMemberCountFromCache("id") 73 assert.Equal(t, count, countResult) 74 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 1) 75 }) 76 77 t.Run("first call not cached, clear cache, second call not cached", func(t *testing.T) { 78 mockStore := getMockStore() 79 mockCacheProvider := getMockCacheProvider() 80 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 81 82 cachedStore.Channel().GetMemberCount("id", true) 83 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 1) 84 cachedStore.Channel().ClearCaches() 85 cachedStore.Channel().GetMemberCount("id", true) 86 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 2) 87 }) 88 89 t.Run("first call not cached, invalidate cache, second call not cached", func(t *testing.T) { 90 mockStore := getMockStore() 91 mockCacheProvider := getMockCacheProvider() 92 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 93 94 cachedStore.Channel().GetMemberCount("id", true) 95 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 1) 96 cachedStore.Channel().InvalidateMemberCount("id") 97 cachedStore.Channel().GetMemberCount("id", true) 98 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetMemberCount", 2) 99 }) 100 } 101 102 func TestChannelStoreChannelPinnedPostsCountsCache(t *testing.T) { 103 countResult := int64(10) 104 105 t.Run("first call not cached, second cached and returning same data", func(t *testing.T) { 106 mockStore := getMockStore() 107 mockCacheProvider := getMockCacheProvider() 108 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 109 110 count, err := cachedStore.Channel().GetPinnedPostCount("id", true) 111 require.Nil(t, err) 112 assert.Equal(t, count, countResult) 113 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 1) 114 count, err = cachedStore.Channel().GetPinnedPostCount("id", true) 115 require.Nil(t, err) 116 assert.Equal(t, count, countResult) 117 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 1) 118 }) 119 120 t.Run("first call not cached, second force not cached", func(t *testing.T) { 121 mockStore := getMockStore() 122 mockCacheProvider := getMockCacheProvider() 123 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 124 125 cachedStore.Channel().GetPinnedPostCount("id", true) 126 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 1) 127 cachedStore.Channel().GetPinnedPostCount("id", false) 128 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 2) 129 }) 130 131 t.Run("first call force not cached, second not cached, third cached", func(t *testing.T) { 132 mockStore := getMockStore() 133 mockCacheProvider := getMockCacheProvider() 134 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 135 136 cachedStore.Channel().GetPinnedPostCount("id", false) 137 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 1) 138 cachedStore.Channel().GetPinnedPostCount("id", true) 139 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 2) 140 cachedStore.Channel().GetPinnedPostCount("id", true) 141 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 2) 142 }) 143 144 t.Run("first call not cached, clear cache, second call not cached", func(t *testing.T) { 145 mockStore := getMockStore() 146 mockCacheProvider := getMockCacheProvider() 147 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 148 149 cachedStore.Channel().GetPinnedPostCount("id", true) 150 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 1) 151 cachedStore.Channel().ClearCaches() 152 cachedStore.Channel().GetPinnedPostCount("id", true) 153 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 2) 154 }) 155 156 t.Run("first call not cached, invalidate cache, second call not cached", func(t *testing.T) { 157 mockStore := getMockStore() 158 mockCacheProvider := getMockCacheProvider() 159 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 160 161 cachedStore.Channel().GetPinnedPostCount("id", true) 162 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 1) 163 cachedStore.Channel().InvalidatePinnedPostCount("id") 164 cachedStore.Channel().GetPinnedPostCount("id", true) 165 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetPinnedPostCount", 2) 166 }) 167 } 168 169 func TestChannelStoreGuestCountCache(t *testing.T) { 170 countResult := int64(12) 171 172 t.Run("first call not cached, second cached and returning same data", func(t *testing.T) { 173 mockStore := getMockStore() 174 mockCacheProvider := getMockCacheProvider() 175 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 176 177 count, err := cachedStore.Channel().GetGuestCount("id", true) 178 require.Nil(t, err) 179 assert.Equal(t, count, countResult) 180 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 1) 181 count, err = cachedStore.Channel().GetGuestCount("id", true) 182 require.Nil(t, err) 183 assert.Equal(t, count, countResult) 184 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 1) 185 }) 186 187 t.Run("first call not cached, second force not cached", func(t *testing.T) { 188 mockStore := getMockStore() 189 mockCacheProvider := getMockCacheProvider() 190 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 191 192 cachedStore.Channel().GetGuestCount("id", true) 193 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 1) 194 cachedStore.Channel().GetGuestCount("id", false) 195 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 2) 196 }) 197 198 t.Run("first call force not cached, second not cached, third cached", func(t *testing.T) { 199 mockStore := getMockStore() 200 mockCacheProvider := getMockCacheProvider() 201 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 202 203 cachedStore.Channel().GetGuestCount("id", false) 204 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 1) 205 cachedStore.Channel().GetGuestCount("id", true) 206 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 2) 207 cachedStore.Channel().GetGuestCount("id", true) 208 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 2) 209 }) 210 211 t.Run("first call not cached, clear cache, second call not cached", func(t *testing.T) { 212 mockStore := getMockStore() 213 mockCacheProvider := getMockCacheProvider() 214 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 215 216 cachedStore.Channel().GetGuestCount("id", true) 217 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 1) 218 cachedStore.Channel().ClearCaches() 219 cachedStore.Channel().GetGuestCount("id", true) 220 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 2) 221 }) 222 223 t.Run("first call not cached, invalidate cache, second call not cached", func(t *testing.T) { 224 mockStore := getMockStore() 225 mockCacheProvider := getMockCacheProvider() 226 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 227 228 cachedStore.Channel().GetGuestCount("id", true) 229 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 1) 230 cachedStore.Channel().InvalidateGuestCount("id") 231 cachedStore.Channel().GetGuestCount("id", true) 232 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "GetGuestCount", 2) 233 }) 234 } 235 236 func TestChannelStoreChannel(t *testing.T) { 237 channelId := "channel1" 238 fakeChannel := model.Channel{Id: channelId} 239 t.Run("first call by id not cached, second cached and returning same data", func(t *testing.T) { 240 mockStore := getMockStore() 241 mockCacheProvider := getMockCacheProvider() 242 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 243 244 channel, err := cachedStore.Channel().Get(channelId, true) 245 require.Nil(t, err) 246 assert.Equal(t, channel, &fakeChannel) 247 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 1) 248 channel, err = cachedStore.Channel().Get(channelId, true) 249 require.Nil(t, err) 250 assert.Equal(t, channel, &fakeChannel) 251 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 1) 252 }) 253 254 t.Run("first call not cached, second force no cached", func(t *testing.T) { 255 mockStore := getMockStore() 256 mockCacheProvider := getMockCacheProvider() 257 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 258 259 cachedStore.Channel().Get(channelId, true) 260 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 1) 261 cachedStore.Channel().Get(channelId, false) 262 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 2) 263 }) 264 265 t.Run("first call force no cached, second not cached, third cached", func(t *testing.T) { 266 mockStore := getMockStore() 267 mockCacheProvider := getMockCacheProvider() 268 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 269 cachedStore.Channel().Get(channelId, false) 270 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 1) 271 cachedStore.Channel().Get(channelId, true) 272 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 2) 273 cachedStore.Channel().Get(channelId, true) 274 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 2) 275 }) 276 277 t.Run("first call not cached, clear cache, second call not cached", func(t *testing.T) { 278 mockStore := getMockStore() 279 mockCacheProvider := getMockCacheProvider() 280 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 281 282 cachedStore.Channel().Get(channelId, true) 283 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 1) 284 cachedStore.Channel().ClearCaches() 285 cachedStore.Channel().Get(channelId, true) 286 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 2) 287 }) 288 289 t.Run("first call not cached, invalidate cache, second call not cached", func(t *testing.T) { 290 mockStore := getMockStore() 291 mockCacheProvider := getMockCacheProvider() 292 cachedStore := NewLocalCacheLayer(mockStore, nil, nil, mockCacheProvider) 293 cachedStore.Channel().Get(channelId, true) 294 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 1) 295 cachedStore.Channel().InvalidateChannel(channelId) 296 cachedStore.Channel().Get(channelId, true) 297 mockStore.Channel().(*mocks.ChannelStore).AssertNumberOfCalls(t, "Get", 2) 298 }) 299 }