github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/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 } 25 26 func testSystemStore(t *testing.T, ss store.Store) { 27 system := &model.System{Name: model.NewId(), Value: "value"} 28 err := ss.System().Save(system) 29 require.Nil(t, err) 30 31 systems, _ := ss.System().Get() 32 33 require.Equal(t, system.Value, systems[system.Name]) 34 35 system.Value = "value2" 36 err = ss.System().Update(system) 37 require.Nil(t, err) 38 39 systems2, _ := ss.System().Get() 40 require.Equal(t, system.Value, systems2[system.Name]) 41 42 rsystem, _ := ss.System().GetByName(system.Name) 43 require.Equal(t, system.Value, rsystem.Value) 44 } 45 46 func testSystemStoreSaveOrUpdate(t *testing.T, ss store.Store) { 47 system := &model.System{Name: model.NewId(), Value: "value"} 48 49 err := ss.System().SaveOrUpdate(system) 50 require.Nil(t, err) 51 52 system.Value = "value2" 53 54 err = ss.System().SaveOrUpdate(system) 55 require.Nil(t, err) 56 } 57 58 func testSystemStorePermanentDeleteByName(t *testing.T, ss store.Store) { 59 s1 := &model.System{Name: model.NewId(), Value: "value"} 60 s2 := &model.System{Name: model.NewId(), Value: "value"} 61 62 err := ss.System().Save(s1) 63 require.Nil(t, err) 64 err = ss.System().Save(s2) 65 require.Nil(t, err) 66 67 _, err = ss.System().GetByName(s1.Name) 68 assert.Nil(t, err) 69 70 _, err = ss.System().GetByName(s2.Name) 71 assert.Nil(t, err) 72 73 _, err = ss.System().PermanentDeleteByName(s1.Name) 74 assert.Nil(t, err) 75 76 _, err = ss.System().GetByName(s1.Name) 77 assert.NotNil(t, err) 78 79 _, err = ss.System().GetByName(s2.Name) 80 assert.Nil(t, err) 81 82 _, err = ss.System().PermanentDeleteByName(s2.Name) 83 assert.Nil(t, err) 84 85 _, err = ss.System().GetByName(s1.Name) 86 assert.NotNil(t, err) 87 88 _, err = ss.System().GetByName(s2.Name) 89 assert.NotNil(t, err) 90 } 91 92 func testInsertIfExists(t *testing.T, ss store.Store) { 93 t.Run("Serial", func(t *testing.T) { 94 s1 := &model.System{Name: model.SYSTEM_CLUSTER_ENCRYPTION_KEY, Value: "somekey"} 95 96 s2, err := ss.System().InsertIfExists(s1) 97 require.Nil(t, err) 98 assert.Equal(t, s1.Value, s2.Value) 99 100 s1New := &model.System{Name: model.SYSTEM_CLUSTER_ENCRYPTION_KEY, Value: "anotherKey"} 101 102 s3, err := ss.System().InsertIfExists(s1New) 103 require.Nil(t, err) 104 assert.Equal(t, s1.Value, s3.Value) 105 }) 106 107 t.Run("Concurrent", func(t *testing.T) { 108 var s2, s3 *model.System 109 var wg sync.WaitGroup 110 wg.Add(2) 111 go func() { 112 defer wg.Done() 113 s1 := &model.System{Name: model.SYSTEM_CLUSTER_ENCRYPTION_KEY, Value: "firstKey"} 114 var err *model.AppError 115 s2, err = ss.System().InsertIfExists(s1) 116 require.Nil(t, err) 117 }() 118 119 go func() { 120 defer wg.Done() 121 s1 := &model.System{Name: model.SYSTEM_CLUSTER_ENCRYPTION_KEY, Value: "secondKey"} 122 var err *model.AppError 123 s3, err = ss.System().InsertIfExists(s1) 124 require.Nil(t, err) 125 }() 126 wg.Wait() 127 assert.Equal(t, s2.Value, s3.Value) 128 }) 129 }