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 }