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 }