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