github.com/mattermost/mattermost-server/v5@v5.39.3/store/storetest/system_store.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package storetest
     5  
     6  import (
     7  	"sync"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  
    13  	"github.com/mattermost/mattermost-server/v5/model"
    14  	"github.com/mattermost/mattermost-server/v5/store"
    15  )
    16  
    17  func TestSystemStore(t *testing.T, ss store.Store) {
    18  	t.Run("", func(t *testing.T) { testSystemStore(t, ss) })
    19  	t.Run("SaveOrUpdate", func(t *testing.T) { testSystemStoreSaveOrUpdate(t, ss) })
    20  	t.Run("PermanentDeleteByName", func(t *testing.T) { testSystemStorePermanentDeleteByName(t, ss) })
    21  	t.Run("InsertIfExists", func(t *testing.T) {
    22  		testInsertIfExists(t, ss)
    23  	})
    24  	t.Run("SaveOrUpdateWithWarnMetricHandling", func(t *testing.T) { testSystemStoreSaveOrUpdateWithWarnMetricHandling(t, ss) })
    25  	t.Run("GetByNameNoEntries", func(t *testing.T) { testSystemStoreGetByNameNoEntries(t, ss) })
    26  }
    27  
    28  func testSystemStore(t *testing.T, ss store.Store) {
    29  	system := &model.System{Name: model.NewId(), Value: "value"}
    30  	err := ss.System().Save(system)
    31  	require.NoError(t, err)
    32  
    33  	systems, _ := ss.System().Get()
    34  
    35  	require.Equal(t, system.Value, systems[system.Name])
    36  
    37  	system.Value = "value2"
    38  	err = ss.System().Update(system)
    39  	require.NoError(t, err)
    40  
    41  	systems2, _ := ss.System().Get()
    42  	require.Equal(t, system.Value, systems2[system.Name])
    43  
    44  	rsystem, _ := ss.System().GetByName(system.Name)
    45  	require.Equal(t, system.Value, rsystem.Value)
    46  }
    47  
    48  func testSystemStoreSaveOrUpdate(t *testing.T, ss store.Store) {
    49  	system := &model.System{Name: model.NewId(), Value: "value"}
    50  
    51  	err := ss.System().SaveOrUpdate(system)
    52  	require.NoError(t, err)
    53  
    54  	system.Value = "value2"
    55  
    56  	err = ss.System().SaveOrUpdate(system)
    57  	require.NoError(t, err)
    58  }
    59  
    60  func testSystemStoreSaveOrUpdateWithWarnMetricHandling(t *testing.T, ss store.Store) {
    61  	system := &model.System{Name: model.NewId(), Value: "value"}
    62  
    63  	err := ss.System().SaveOrUpdateWithWarnMetricHandling(system)
    64  	require.NoError(t, err)
    65  
    66  	_, err = ss.System().GetByName(model.SYSTEM_WARN_METRIC_LAST_RUN_TIMESTAMP_KEY)
    67  	assert.Error(t, err)
    68  
    69  	system.Name = "warn_metric_number_of_active_users_100"
    70  	system.Value = model.WARN_METRIC_STATUS_RUNONCE
    71  	err = ss.System().SaveOrUpdateWithWarnMetricHandling(system)
    72  	require.NoError(t, err)
    73  
    74  	val1, nerr := ss.System().GetByName(model.SYSTEM_WARN_METRIC_LAST_RUN_TIMESTAMP_KEY)
    75  	assert.NoError(t, nerr)
    76  
    77  	system.Name = "warn_metric_number_of_active_users_100"
    78  	system.Value = model.WARN_METRIC_STATUS_ACK
    79  	err = ss.System().SaveOrUpdateWithWarnMetricHandling(system)
    80  	require.NoError(t, err)
    81  
    82  	val2, nerr := ss.System().GetByName(model.SYSTEM_WARN_METRIC_LAST_RUN_TIMESTAMP_KEY)
    83  	assert.NoError(t, nerr)
    84  	assert.Equal(t, val1, val2)
    85  }
    86  
    87  func testSystemStoreGetByNameNoEntries(t *testing.T, ss store.Store) {
    88  	res, nErr := ss.System().GetByName(model.SYSTEM_FIRST_ADMIN_VISIT_MARKETPLACE)
    89  	_, ok := nErr.(*store.ErrNotFound)
    90  	require.Error(t, nErr)
    91  	assert.True(t, ok)
    92  	assert.Nil(t, res)
    93  }
    94  
    95  func testSystemStorePermanentDeleteByName(t *testing.T, ss store.Store) {
    96  	s1 := &model.System{Name: model.NewId(), Value: "value"}
    97  	s2 := &model.System{Name: model.NewId(), Value: "value"}
    98  
    99  	err := ss.System().Save(s1)
   100  	require.NoError(t, err)
   101  	err = ss.System().Save(s2)
   102  	require.NoError(t, err)
   103  
   104  	_, err = ss.System().GetByName(s1.Name)
   105  	assert.NoError(t, err)
   106  
   107  	_, err = ss.System().GetByName(s2.Name)
   108  	assert.NoError(t, err)
   109  
   110  	_, err = ss.System().PermanentDeleteByName(s1.Name)
   111  	assert.NoError(t, err)
   112  
   113  	_, err = ss.System().GetByName(s1.Name)
   114  	assert.Error(t, err)
   115  
   116  	_, err = ss.System().GetByName(s2.Name)
   117  	assert.NoError(t, err)
   118  
   119  	_, err = ss.System().PermanentDeleteByName(s2.Name)
   120  	assert.NoError(t, err)
   121  
   122  	_, err = ss.System().GetByName(s1.Name)
   123  	assert.Error(t, err)
   124  
   125  	_, err = ss.System().GetByName(s2.Name)
   126  	assert.Error(t, err)
   127  }
   128  
   129  func testInsertIfExists(t *testing.T, ss store.Store) {
   130  	t.Run("Serial", func(t *testing.T) {
   131  		s1 := &model.System{Name: model.SYSTEM_CLUSTER_ENCRYPTION_KEY, Value: "somekey"}
   132  
   133  		s2, err := ss.System().InsertIfExists(s1)
   134  		require.NoError(t, err)
   135  		assert.Equal(t, s1.Value, s2.Value)
   136  
   137  		s1New := &model.System{Name: model.SYSTEM_CLUSTER_ENCRYPTION_KEY, Value: "anotherKey"}
   138  
   139  		s3, err := ss.System().InsertIfExists(s1New)
   140  		require.NoError(t, err)
   141  		assert.Equal(t, s1.Value, s3.Value)
   142  	})
   143  
   144  	t.Run("Concurrent", func(t *testing.T) {
   145  		var s2, s3 *model.System
   146  		var wg sync.WaitGroup
   147  		wg.Add(2)
   148  		go func() {
   149  			defer wg.Done()
   150  			s1 := &model.System{Name: model.SYSTEM_CLUSTER_ENCRYPTION_KEY, Value: "firstKey"}
   151  			var err error
   152  			s2, err = ss.System().InsertIfExists(s1)
   153  			require.NoError(t, err)
   154  		}()
   155  
   156  		go func() {
   157  			defer wg.Done()
   158  			s1 := &model.System{Name: model.SYSTEM_CLUSTER_ENCRYPTION_KEY, Value: "secondKey"}
   159  			var err error
   160  			s3, err = ss.System().InsertIfExists(s1)
   161  			require.NoError(t, err)
   162  		}()
   163  		wg.Wait()
   164  		assert.Equal(t, s2.Value, s3.Value)
   165  	})
   166  }