github.com/lologarithm/mattermost-server@v5.3.2-0.20181002060438-c82a84ed765b+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  var storeTypes = []*struct {
    19  	Name        string
    20  	Func        func() (*storetest.RunningContainer, *model.SqlSettings, error)
    21  	Container   *storetest.RunningContainer
    22  	SqlSupplier *SqlSupplier
    23  	Store       store.Store
    24  }{
    25  	{
    26  		Name: "MySQL",
    27  		Func: storetest.NewMySQLContainer,
    28  	},
    29  	{
    30  		Name: "PostgreSQL",
    31  		Func: storetest.NewPostgreSQLContainer,
    32  	},
    33  }
    34  
    35  func StoreTest(t *testing.T, f func(*testing.T, store.Store)) {
    36  	defer func() {
    37  		if err := recover(); err != nil {
    38  			tearDownStores()
    39  			panic(err)
    40  		}
    41  	}()
    42  	for _, st := range storeTypes {
    43  		st := st
    44  		t.Run(st.Name, func(t *testing.T) { f(t, st.Store) })
    45  	}
    46  }
    47  
    48  func StoreTestWithSqlSupplier(t *testing.T, f func(*testing.T, store.Store, storetest.SqlSupplier)) {
    49  	defer func() {
    50  		if err := recover(); err != nil {
    51  			tearDownStores()
    52  			panic(err)
    53  		}
    54  	}()
    55  	for _, st := range storeTypes {
    56  		st := st
    57  		t.Run(st.Name, func(t *testing.T) { f(t, st.Store, st.SqlSupplier) })
    58  	}
    59  }
    60  
    61  func initStores() {
    62  	defer func() {
    63  		if err := recover(); err != nil {
    64  			tearDownStores()
    65  			panic(err)
    66  		}
    67  	}()
    68  	var wg sync.WaitGroup
    69  	errCh := make(chan error, len(storeTypes))
    70  	wg.Add(len(storeTypes))
    71  	for _, st := range storeTypes {
    72  		st := st
    73  		go func() {
    74  			defer wg.Done()
    75  			container, settings, err := st.Func()
    76  			if err != nil {
    77  				errCh <- err
    78  				return
    79  			}
    80  			st.Container = container
    81  			st.SqlSupplier = NewSqlSupplier(*settings, nil)
    82  			st.Store = store.NewLayeredStore(st.SqlSupplier, nil, nil)
    83  			st.Store.MarkSystemRanUnitTests()
    84  		}()
    85  	}
    86  	wg.Wait()
    87  	select {
    88  	case err := <-errCh:
    89  		panic(err)
    90  	default:
    91  	}
    92  }
    93  
    94  var tearDownStoresOnce sync.Once
    95  
    96  func tearDownStores() {
    97  	tearDownStoresOnce.Do(func() {
    98  		var wg sync.WaitGroup
    99  		wg.Add(len(storeTypes))
   100  		for _, st := range storeTypes {
   101  			st := st
   102  			go func() {
   103  				if st.Store != nil {
   104  					st.Store.Close()
   105  				}
   106  				if st.Container != nil {
   107  					st.Container.Stop()
   108  				}
   109  				wg.Done()
   110  			}()
   111  		}
   112  		wg.Wait()
   113  	})
   114  }
   115  
   116  func TestMain(m *testing.M) {
   117  	// Setup a global logger to catch tests logging outside of app context
   118  	// The global logger will be stomped by apps initalizing but that's fine for testing. Ideally this won't happen.
   119  	mlog.InitGlobalLogger(mlog.NewLogger(&mlog.LoggerConfiguration{
   120  		EnableConsole: true,
   121  		ConsoleJson:   true,
   122  		ConsoleLevel:  "error",
   123  		EnableFile:    false,
   124  	}))
   125  
   126  	utils.TranslationsPreInit()
   127  
   128  	status := 0
   129  
   130  	initStores()
   131  	defer func() {
   132  		tearDownStores()
   133  		os.Exit(status)
   134  	}()
   135  
   136  	status = m.Run()
   137  }