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 }