github.com/jfrerich/mattermost-server@v5.8.0-rc2+incompatible/store/sqlstore/store_test.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package sqlstore
     5  
     6  import (
     7  	"os"
     8  	"sync"
     9  	"testing"
    10  
    11  	"github.com/mattermost/mattermost-server/mlog"
    12  	"github.com/mattermost/mattermost-server/model"
    13  	"github.com/mattermost/mattermost-server/store"
    14  	"github.com/mattermost/mattermost-server/store/storetest"
    15  	"github.com/mattermost/mattermost-server/utils"
    16  )
    17  
    18  type storeType struct {
    19  	Name        string
    20  	SqlSettings *model.SqlSettings
    21  	SqlSupplier *SqlSupplier
    22  	Store       store.Store
    23  }
    24  
    25  var storeTypes []*storeType
    26  
    27  func StoreTest(t *testing.T, f func(*testing.T, store.Store)) {
    28  	defer func() {
    29  		if err := recover(); err != nil {
    30  			tearDownStores()
    31  			panic(err)
    32  		}
    33  	}()
    34  	for _, st := range storeTypes {
    35  		st := st
    36  		t.Run(st.Name, func(t *testing.T) { f(t, st.Store) })
    37  	}
    38  }
    39  
    40  func StoreTestWithSqlSupplier(t *testing.T, f func(*testing.T, store.Store, storetest.SqlSupplier)) {
    41  	defer func() {
    42  		if err := recover(); err != nil {
    43  			tearDownStores()
    44  			panic(err)
    45  		}
    46  	}()
    47  	for _, st := range storeTypes {
    48  		st := st
    49  		t.Run(st.Name, func(t *testing.T) { f(t, st.Store, st.SqlSupplier) })
    50  	}
    51  }
    52  
    53  func initStores() {
    54  	storeTypes = append(storeTypes, &storeType{
    55  		Name:        "MySQL",
    56  		SqlSettings: storetest.MakeSqlSettings(model.DATABASE_DRIVER_MYSQL),
    57  	})
    58  	storeTypes = append(storeTypes, &storeType{
    59  		Name:        "PostgreSQL",
    60  		SqlSettings: storetest.MakeSqlSettings(model.DATABASE_DRIVER_POSTGRES),
    61  	})
    62  
    63  	defer func() {
    64  		if err := recover(); err != nil {
    65  			tearDownStores()
    66  			panic(err)
    67  		}
    68  	}()
    69  	var wg sync.WaitGroup
    70  	for _, st := range storeTypes {
    71  		st := st
    72  		wg.Add(1)
    73  		go func() {
    74  			defer wg.Done()
    75  			st.SqlSupplier = NewSqlSupplier(*st.SqlSettings, nil)
    76  			st.Store = store.NewLayeredStore(st.SqlSupplier, nil, nil)
    77  			st.Store.DropAllTables()
    78  			st.Store.MarkSystemRanUnitTests()
    79  		}()
    80  	}
    81  	wg.Wait()
    82  }
    83  
    84  var tearDownStoresOnce sync.Once
    85  
    86  func tearDownStores() {
    87  	tearDownStoresOnce.Do(func() {
    88  		var wg sync.WaitGroup
    89  		wg.Add(len(storeTypes))
    90  		for _, st := range storeTypes {
    91  			st := st
    92  			go func() {
    93  				if st.Store != nil {
    94  					st.Store.Close()
    95  				}
    96  				wg.Done()
    97  			}()
    98  		}
    99  		wg.Wait()
   100  	})
   101  }
   102  
   103  func TestMain(m *testing.M) {
   104  	// Setup a global logger to catch tests logging outside of app context
   105  	// The global logger will be stomped by apps initalizing but that's fine for testing. Ideally this won't happen.
   106  	mlog.InitGlobalLogger(mlog.NewLogger(&mlog.LoggerConfiguration{
   107  		EnableConsole: true,
   108  		ConsoleJson:   true,
   109  		ConsoleLevel:  "error",
   110  		EnableFile:    false,
   111  	}))
   112  
   113  	utils.TranslationsPreInit()
   114  
   115  	status := 0
   116  
   117  	initStores()
   118  	defer func() {
   119  		tearDownStores()
   120  		os.Exit(status)
   121  	}()
   122  
   123  	status = m.Run()
   124  }