github.com/haalcala/mattermost-server-change-repo@v0.0.0-20210713015153-16753fbeee5f/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  }
    26  
    27  func testSystemStore(t *testing.T, ss store.Store) {
    28  	system := &model.System{Name: model.NewId(), Value: "value"}
    29  	err := ss.System().Save(system)
    30  	require.NoError(t, err)
    31  
    32  	systems, _ := ss.System().Get()
    33  
    34  	require.Equal(t, system.Value, systems[system.Name])
    35  
    36  	system.Value = "value2"
    37  	err = ss.System().Update(system)
    38  	require.NoError(t, err)
    39  
    40  	systems2, _ := ss.System().Get()
    41  	require.Equal(t, system.Value, systems2[system.Name])
    42  
    43  	rsystem, _ := ss.System().GetByName(system.Name)
    44  	require.Equal(t, system.Value, rsystem.Value)
    45  }
    46  
    47  func testSystemStoreSaveOrUpdate(t *testing.T, ss store.Store) {
    48  	system := &model.System{Name: model.NewId(), Value: "value"}
    49  
    50  	err := ss.System().SaveOrUpdate(system)
    51  	require.NoError(t, err)
    52  
    53  	system.Value = "value2"
    54  
    55  	err = ss.System().SaveOrUpdate(system)
    56  	require.NoError(t, err)
    57  }
    58  
    59  func testSystemStoreSaveOrUpdateWithWarnMetricHandling(t *testing.T, ss store.Store) {
    60  	system := &model.System{Name: model.NewId(), Value: "value"}
    61  
    62  	err := ss.System().SaveOrUpdateWithWarnMetricHandling(system)
    63  	require.NoError(t, err)
    64  
    65  	_, err = ss.System().GetByName(model.SYSTEM_WARN_METRIC_LAST_RUN_TIMESTAMP_KEY)
    66  	assert.Error(t, err)
    67  
    68  	system.Name = "warn_metric_number_of_active_users_100"
    69  	system.Value = model.WARN_METRIC_STATUS_RUNONCE
    70  	err = ss.System().SaveOrUpdateWithWarnMetricHandling(system)
    71  	require.NoError(t, err)
    72  
    73  	val1, nerr := ss.System().GetByName(model.SYSTEM_WARN_METRIC_LAST_RUN_TIMESTAMP_KEY)
    74  	assert.NoError(t, nerr)
    75  
    76  	system.Name = "warn_metric_number_of_active_users_100"
    77  	system.Value = model.WARN_METRIC_STATUS_ACK
    78  	err = ss.System().SaveOrUpdateWithWarnMetricHandling(system)
    79  	require.NoError(t, err)
    80  
    81  	val2, nerr := ss.System().GetByName(model.SYSTEM_WARN_METRIC_LAST_RUN_TIMESTAMP_KEY)
    82  	assert.NoError(t, nerr)
    83  	assert.Equal(t, val1, val2)
    84  }
    85  
    86  func testSystemStorePermanentDeleteByName(t *testing.T, ss store.Store) {
    87  	s1 := &model.System{Name: model.NewId(), Value: "value"}
    88  	s2 := &model.System{Name: model.NewId(), Value: "value"}
    89  
    90  	err := ss.System().Save(s1)
    91  	require.NoError(t, err)
    92  	err = ss.System().Save(s2)
    93  	require.NoError(t, err)
    94  
    95  	_, err = ss.System().GetByName(s1.Name)
    96  	assert.NoError(t, err)
    97  
    98  	_, err = ss.System().GetByName(s2.Name)
    99  	assert.NoError(t, err)
   100  
   101  	_, err = ss.System().PermanentDeleteByName(s1.Name)
   102  	assert.NoError(t, err)
   103  
   104  	_, err = ss.System().GetByName(s1.Name)
   105  	assert.Error(t, err)
   106  
   107  	_, err = ss.System().GetByName(s2.Name)
   108  	assert.NoError(t, err)
   109  
   110  	_, err = ss.System().PermanentDeleteByName(s2.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.Error(t, err)
   118  }
   119  
   120  func testInsertIfExists(t *testing.T, ss store.Store) {
   121  	t.Run("Serial", func(t *testing.T) {
   122  		s1 := &model.System{Name: model.SYSTEM_CLUSTER_ENCRYPTION_KEY, Value: "somekey"}
   123  
   124  		s2, err := ss.System().InsertIfExists(s1)
   125  		require.NoError(t, err)
   126  		assert.Equal(t, s1.Value, s2.Value)
   127  
   128  		s1New := &model.System{Name: model.SYSTEM_CLUSTER_ENCRYPTION_KEY, Value: "anotherKey"}
   129  
   130  		s3, err := ss.System().InsertIfExists(s1New)
   131  		require.NoError(t, err)
   132  		assert.Equal(t, s1.Value, s3.Value)
   133  	})
   134  
   135  	t.Run("Concurrent", func(t *testing.T) {
   136  		var s2, s3 *model.System
   137  		var wg sync.WaitGroup
   138  		wg.Add(2)
   139  		go func() {
   140  			defer wg.Done()
   141  			s1 := &model.System{Name: model.SYSTEM_CLUSTER_ENCRYPTION_KEY, Value: "firstKey"}
   142  			var err error
   143  			s2, err = ss.System().InsertIfExists(s1)
   144  			require.NoError(t, err)
   145  		}()
   146  
   147  		go func() {
   148  			defer wg.Done()
   149  			s1 := &model.System{Name: model.SYSTEM_CLUSTER_ENCRYPTION_KEY, Value: "secondKey"}
   150  			var err error
   151  			s3, err = ss.System().InsertIfExists(s1)
   152  			require.NoError(t, err)
   153  		}()
   154  		wg.Wait()
   155  		assert.Equal(t, s2.Value, s3.Value)
   156  	})
   157  }