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  }