github.com/mattermost/mattermost-server/v5@v5.39.3/config/migrate_test.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package config 5 6 import ( 7 "io/ioutil" 8 "os" 9 "path" 10 "testing" 11 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/require" 14 15 "github.com/mattermost/mattermost-server/v5/model" 16 ) 17 18 type cleanUpFn func(store *Store) 19 20 func TestMigrate(t *testing.T) { 21 if testing.Short() { 22 t.Skip("skipping migration test in short mode") 23 } 24 files := []string{ 25 "IdpCertificateFile", 26 "PublicCertificateFile", 27 "PrivateKeyFile", 28 "internal.crt", 29 "internal2.crt", 30 } 31 filesData := make([]string, len(files)) 32 for i := range files { 33 // Generate random data for each file, ensuring that stale data from a past test 34 // won't generate a false positive. 35 filesData[i] = model.NewId() 36 } 37 38 setup := func(t *testing.T) { 39 os.Clearenv() 40 t.Helper() 41 42 tempDir, err := ioutil.TempDir("", "TestMigrate") 43 require.NoError(t, err) 44 t.Cleanup(func() { 45 os.RemoveAll(tempDir) 46 }) 47 48 err = os.Chdir(tempDir) 49 require.NoError(t, err) 50 51 truncateTables(t) 52 } 53 54 setupSource := func(t *testing.T, source *Store) cleanUpFn { 55 t.Helper() 56 57 cfg := source.Get() 58 originalCfg := cfg.Clone() 59 cfg.ServiceSettings.SiteURL = model.NewString("http://example.com") 60 cfg.SamlSettings.IdpCertificateFile = &files[0] 61 cfg.SamlSettings.PublicCertificateFile = &files[1] 62 cfg.SamlSettings.PrivateKeyFile = &files[2] 63 cfg.PluginSettings.SignaturePublicKeyFiles = []string{ 64 files[3], 65 files[4], 66 } 67 cfg.SqlSettings.DataSourceReplicas = []string{ 68 "mysql://mmuser:password@tcp(replicahost:3306)/mattermost", 69 } 70 cfg.SqlSettings.DataSourceSearchReplicas = []string{ 71 "mysql://mmuser:password@tcp(searchreplicahost:3306)/mattermost", 72 } 73 74 _, _, err := source.Set(cfg) 75 require.NoError(t, err) 76 77 for i, file := range files { 78 err = source.SetFile(file, []byte(filesData[i])) 79 require.NoError(t, err) 80 } 81 82 return func(store *Store) { 83 _, _, err := store.Set(originalCfg) 84 require.NoError(t, err) 85 } 86 } 87 88 assertDestination := func(t *testing.T, destination *Store, source *Store) { 89 t.Helper() 90 91 for i, file := range files { 92 hasFile, err := destination.HasFile(file) 93 require.NoError(t, err) 94 require.Truef(t, hasFile, "destination missing file %s", file) 95 96 actualData, err := destination.GetFile(file) 97 require.NoError(t, err) 98 assert.Equalf(t, []byte(filesData[i]), actualData, "destination has wrong contents for file %s", file) 99 } 100 101 assert.Equal(t, source.Get(), destination.Get()) 102 } 103 104 t.Run("database to file", func(t *testing.T) { 105 setup(t) 106 107 pwd, err := os.Getwd() 108 require.NoError(t, err) 109 110 sqlSettings := mainHelper.GetSQLSettings() 111 destinationDSN := path.Join(pwd, "config-custom.json") 112 sourceDSN := getDsn(*sqlSettings.DriverName, *sqlSettings.DataSource) 113 114 sourcedb, err := NewDatabaseStore(sourceDSN) 115 require.NoError(t, err) 116 source, err := NewStoreFromBacking(sourcedb, nil, false) 117 require.NoError(t, err) 118 defer source.Close() 119 120 cleanUp := setupSource(t, source) 121 err = Migrate(sourceDSN, destinationDSN) 122 require.NoError(t, err) 123 124 destinationfile, err := NewFileStore(destinationDSN) 125 require.NoError(t, err) 126 destination, err := NewStoreFromBacking(destinationfile, nil, false) 127 require.NoError(t, err) 128 defer destination.Close() 129 defer cleanUp(destination) 130 131 assertDestination(t, destination, source) 132 }) 133 134 t.Run("file to database", func(t *testing.T) { 135 setup(t) 136 137 pwd, err := os.Getwd() 138 require.NoError(t, err) 139 140 sqlSettings := mainHelper.GetSQLSettings() 141 sourceDSN := path.Join(pwd, "config-custom.json") 142 destinationDSN := getDsn(*sqlSettings.DriverName, *sqlSettings.DataSource) 143 144 sourcefile, err := NewFileStore(sourceDSN) 145 require.NoError(t, err) 146 source, err := NewStoreFromBacking(sourcefile, nil, false) 147 require.NoError(t, err) 148 defer source.Close() 149 150 cleanUp := setupSource(t, source) 151 err = Migrate(sourceDSN, destinationDSN) 152 require.NoError(t, err) 153 154 destinationdb, err := NewDatabaseStore(destinationDSN) 155 require.NoError(t, err) 156 destination, err := NewStoreFromBacking(destinationdb, nil, false) 157 require.NoError(t, err) 158 defer destination.Close() 159 defer cleanUp(destination) 160 161 assertDestination(t, destination, source) 162 }) 163 }