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  }