github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/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  	"sync"
     8  	"testing"
     9  
    10  	"github.com/mattermost/mattermost-server/v5/model"
    11  	"github.com/mattermost/mattermost-server/v5/store"
    12  	"github.com/mattermost/mattermost-server/v5/store/sqlstore"
    13  	"github.com/mattermost/mattermost-server/v5/store/storetest"
    14  )
    15  
    16  type storeType struct {
    17  	Name        string
    18  	SqlSettings *model.SqlSettings
    19  	SqlSupplier *sqlstore.SqlSupplier
    20  	Store       store.Store
    21  }
    22  
    23  var storeTypes []*storeType
    24  
    25  func StoreTest(t *testing.T, f func(*testing.T, store.Store)) {
    26  	defer func() {
    27  		if err := recover(); err != nil {
    28  			tearDownStores()
    29  			panic(err)
    30  		}
    31  	}()
    32  	for _, st := range storeTypes {
    33  		st := st
    34  		t.Run(st.Name, func(t *testing.T) {
    35  			if testing.Short() {
    36  				t.SkipNow()
    37  			}
    38  			f(t, st.Store)
    39  		})
    40  	}
    41  }
    42  
    43  func StoreTestWithSqlSupplier(t *testing.T, f func(*testing.T, store.Store, storetest.SqlSupplier)) {
    44  	defer func() {
    45  		if err := recover(); err != nil {
    46  			tearDownStores()
    47  			panic(err)
    48  		}
    49  	}()
    50  	for _, st := range storeTypes {
    51  		st := st
    52  		t.Run(st.Name, func(t *testing.T) {
    53  			if testing.Short() {
    54  				t.SkipNow()
    55  			}
    56  			f(t, st.Store, st.SqlSupplier)
    57  		})
    58  	}
    59  }
    60  
    61  func initStores() {
    62  	if testing.Short() {
    63  		return
    64  	}
    65  	storeTypes = append(storeTypes, &storeType{
    66  		Name:        "LocalCache+MySQL",
    67  		SqlSettings: storetest.MakeSqlSettings(model.DATABASE_DRIVER_MYSQL),
    68  	})
    69  	storeTypes = append(storeTypes, &storeType{
    70  		Name:        "LocalCache+PostgreSQL",
    71  		SqlSettings: storetest.MakeSqlSettings(model.DATABASE_DRIVER_POSTGRES),
    72  	})
    73  
    74  	defer func() {
    75  		if err := recover(); err != nil {
    76  			tearDownStores()
    77  			panic(err)
    78  		}
    79  	}()
    80  	var wg sync.WaitGroup
    81  	for _, st := range storeTypes {
    82  		st := st
    83  		wg.Add(1)
    84  		go func() {
    85  			defer wg.Done()
    86  			st.SqlSupplier = sqlstore.NewSqlSupplier(*st.SqlSettings, nil)
    87  			st.Store = NewLocalCacheLayer(st.SqlSupplier, nil, nil, getMockCacheProvider())
    88  			st.Store.DropAllTables()
    89  			st.Store.MarkSystemRanUnitTests()
    90  		}()
    91  	}
    92  	wg.Wait()
    93  }
    94  
    95  var tearDownStoresOnce sync.Once
    96  
    97  func tearDownStores() {
    98  	if testing.Short() {
    99  		return
   100  	}
   101  	tearDownStoresOnce.Do(func() {
   102  		var wg sync.WaitGroup
   103  		wg.Add(len(storeTypes))
   104  		for _, st := range storeTypes {
   105  			st := st
   106  			go func() {
   107  				if st.Store != nil {
   108  					st.Store.Close()
   109  				}
   110  				if st.SqlSettings != nil {
   111  					storetest.CleanupSqlSettings(st.SqlSettings)
   112  				}
   113  				wg.Done()
   114  			}()
   115  		}
   116  		wg.Wait()
   117  	})
   118  }