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  }