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 }