github.com/haalcala/mattermost-server-change-repo@v0.0.0-20210713015153-16753fbeee5f/store/localcachelayer/layer_test.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package localcachelayer
     5  
     6  import (
     7  	"os"
     8  	"sync"
     9  	"testing"
    10  
    11  	"github.com/mattermost/mattermost-server/v5/model"
    12  	"github.com/mattermost/mattermost-server/v5/store"
    13  	"github.com/mattermost/mattermost-server/v5/store/sqlstore"
    14  	"github.com/mattermost/mattermost-server/v5/store/storetest"
    15  )
    16  
    17  type storeType struct {
    18  	Name        string
    19  	SqlSettings *model.SqlSettings
    20  	SqlStore    *sqlstore.SqlStore
    21  	Store       store.Store
    22  }
    23  
    24  var storeTypes []*storeType
    25  
    26  func newStoreType(name, driver string) *storeType {
    27  	return &storeType{
    28  		Name:        name,
    29  		SqlSettings: storetest.MakeSqlSettings(driver),
    30  	}
    31  }
    32  
    33  func StoreTest(t *testing.T, f func(*testing.T, store.Store)) {
    34  	defer func() {
    35  		if err := recover(); err != nil {
    36  			tearDownStores()
    37  			panic(err)
    38  		}
    39  	}()
    40  	for _, st := range storeTypes {
    41  		st := st
    42  		t.Run(st.Name, func(t *testing.T) {
    43  			if testing.Short() {
    44  				t.SkipNow()
    45  			}
    46  			f(t, st.Store)
    47  		})
    48  	}
    49  }
    50  
    51  func StoreTestWithSqlStore(t *testing.T, f func(*testing.T, store.Store, storetest.SqlStore)) {
    52  	defer func() {
    53  		if err := recover(); err != nil {
    54  			tearDownStores()
    55  			panic(err)
    56  		}
    57  	}()
    58  	for _, st := range storeTypes {
    59  		st := st
    60  		t.Run(st.Name, func(t *testing.T) {
    61  			if testing.Short() {
    62  				t.SkipNow()
    63  			}
    64  			f(t, st.Store, st.SqlStore)
    65  		})
    66  	}
    67  }
    68  
    69  func initStores() {
    70  	if testing.Short() {
    71  		return
    72  	}
    73  
    74  	// In CI, we already run the entire test suite for both mysql and postgres in parallel.
    75  	// So we just run the tests for the current database set.
    76  	if os.Getenv("IS_CI") == "true" {
    77  		switch os.Getenv("MM_SQLSETTINGS_DRIVERNAME") {
    78  		case "mysql":
    79  			storeTypes = append(storeTypes, newStoreType("LocalCache+MySQL", model.DATABASE_DRIVER_MYSQL))
    80  		case "postgres":
    81  			storeTypes = append(storeTypes, newStoreType("LocalCache+PostgreSQL", model.DATABASE_DRIVER_POSTGRES))
    82  		}
    83  	} else {
    84  		storeTypes = append(storeTypes, newStoreType("LocalCache+MySQL", model.DATABASE_DRIVER_MYSQL),
    85  			newStoreType("LocalCache+PostgreSQL", model.DATABASE_DRIVER_POSTGRES))
    86  	}
    87  
    88  	defer func() {
    89  		if err := recover(); err != nil {
    90  			tearDownStores()
    91  			panic(err)
    92  		}
    93  	}()
    94  	var wg sync.WaitGroup
    95  	for _, st := range storeTypes {
    96  		st := st
    97  		wg.Add(1)
    98  		go func() {
    99  			var err error
   100  			defer wg.Done()
   101  			st.SqlStore = sqlstore.New(*st.SqlSettings, nil)
   102  			st.Store, err = NewLocalCacheLayer(st.SqlStore, nil, nil, getMockCacheProvider())
   103  			if err != nil {
   104  				panic(err)
   105  			}
   106  			st.Store.DropAllTables()
   107  			st.Store.MarkSystemRanUnitTests()
   108  		}()
   109  	}
   110  	wg.Wait()
   111  }
   112  
   113  var tearDownStoresOnce sync.Once
   114  
   115  func tearDownStores() {
   116  	if testing.Short() {
   117  		return
   118  	}
   119  	tearDownStoresOnce.Do(func() {
   120  		var wg sync.WaitGroup
   121  		wg.Add(len(storeTypes))
   122  		for _, st := range storeTypes {
   123  			st := st
   124  			go func() {
   125  				if st.Store != nil {
   126  					st.Store.Close()
   127  				}
   128  				if st.SqlSettings != nil {
   129  					storetest.CleanupSqlSettings(st.SqlSettings)
   130  				}
   131  				wg.Done()
   132  			}()
   133  		}
   134  		wg.Wait()
   135  	})
   136  }