github.com/mad-app/mattermost-server@v5.11.1+incompatible/store/sqlstore/supplier_test.go (about) 1 package sqlstore_test 2 3 import ( 4 "testing" 5 6 "github.com/mattermost/gorp" 7 _ "github.com/mattn/go-sqlite3" 8 "github.com/stretchr/testify/assert" 9 10 "github.com/mattermost/mattermost-server/model" 11 "github.com/mattermost/mattermost-server/store/sqlstore" 12 ) 13 14 func TestGetReplica(t *testing.T) { 15 t.Parallel() 16 testCases := []struct { 17 Description string 18 DataSourceReplicas []string 19 DataSourceSearchReplicas []string 20 }{ 21 { 22 "no replicas", 23 []string{}, 24 []string{}, 25 }, 26 { 27 "one source replica", 28 []string{":memory:"}, 29 []string{}, 30 }, 31 { 32 "multiple source replicas", 33 []string{":memory:", ":memory:", ":memory:"}, 34 []string{}, 35 }, 36 { 37 "one source search replica", 38 []string{}, 39 []string{":memory:"}, 40 }, 41 { 42 "multiple source search replicas", 43 []string{}, 44 []string{":memory:", ":memory:", ":memory:"}, 45 }, 46 { 47 "one source replica, one source search replica", 48 []string{":memory:"}, 49 []string{":memory:"}, 50 }, 51 { 52 "one source replica, multiple source search replicas", 53 []string{":memory:"}, 54 []string{":memory:", ":memory:", ":memory:"}, 55 }, 56 { 57 "multiple source replica, one source search replica", 58 []string{":memory:", ":memory:", ":memory:"}, 59 []string{":memory:"}, 60 }, 61 { 62 "multiple source replica, multiple source search replicas", 63 []string{":memory:", ":memory:", ":memory:"}, 64 []string{":memory:", ":memory:", ":memory:"}, 65 }, 66 } 67 68 for _, testCase := range testCases { 69 testCase := testCase 70 t.Run(testCase.Description, func(t *testing.T) { 71 t.Parallel() 72 73 driverName := model.DATABASE_DRIVER_SQLITE 74 dataSource := ":memory:" 75 maxIdleConns := 1 76 connMaxLifetimeMilliseconds := 3600000 77 maxOpenConns := 1 78 queryTimeout := 5 79 80 settings := model.SqlSettings{ 81 DriverName: &driverName, 82 DataSource: &dataSource, 83 MaxIdleConns: &maxIdleConns, 84 ConnMaxLifetimeMilliseconds: &connMaxLifetimeMilliseconds, 85 MaxOpenConns: &maxOpenConns, 86 QueryTimeout: &queryTimeout, 87 DataSourceReplicas: testCase.DataSourceReplicas, 88 DataSourceSearchReplicas: testCase.DataSourceSearchReplicas, 89 } 90 supplier := sqlstore.NewSqlSupplier(settings, nil) 91 92 replicas := make(map[*gorp.DbMap]bool) 93 for i := 0; i < 5; i++ { 94 replicas[supplier.GetReplica()] = true 95 } 96 97 searchReplicas := make(map[*gorp.DbMap]bool) 98 for i := 0; i < 5; i++ { 99 searchReplicas[supplier.GetSearchReplica()] = true 100 } 101 102 if len(testCase.DataSourceReplicas) > 0 { 103 // If replicas were defined, ensure none are the master. 104 assert.Len(t, replicas, len(testCase.DataSourceReplicas)) 105 106 for replica := range replicas { 107 assert.NotEqual(t, supplier.GetMaster(), replica) 108 } 109 110 } else if assert.Len(t, replicas, 1) { 111 // Otherwise ensure the replicas contains only the master. 112 for replica := range replicas { 113 assert.Equal(t, supplier.GetMaster(), replica) 114 } 115 } 116 117 if len(testCase.DataSourceSearchReplicas) > 0 { 118 // If search replicas were defined, ensure none are the master nor the replicas. 119 assert.Len(t, searchReplicas, len(testCase.DataSourceSearchReplicas)) 120 121 for searchReplica := range searchReplicas { 122 assert.NotEqual(t, supplier.GetMaster(), searchReplica) 123 for replica := range replicas { 124 assert.NotEqual(t, searchReplica, replica) 125 } 126 } 127 128 } else if len(testCase.DataSourceReplicas) > 0 { 129 // If no search replicas were defined, but replicas were, ensure they are equal. 130 assert.Equal(t, replicas, searchReplicas) 131 132 } else if assert.Len(t, searchReplicas, 1) { 133 // Otherwise ensure the search replicas contains the master. 134 for searchReplica := range searchReplicas { 135 assert.Equal(t, supplier.GetMaster(), searchReplica) 136 } 137 } 138 }) 139 } 140 } 141 142 func TestGetAllConns(t *testing.T) { 143 t.Parallel() 144 testCases := []struct { 145 Description string 146 DataSourceReplicas []string 147 DataSourceSearchReplicas []string 148 ExpectedNumConnections int 149 }{ 150 { 151 "no replicas", 152 []string{}, 153 []string{}, 154 1, 155 }, 156 { 157 "one source replica", 158 []string{":memory:"}, 159 []string{}, 160 2, 161 }, 162 { 163 "multiple source replicas", 164 []string{":memory:", ":memory:", ":memory:"}, 165 []string{}, 166 4, 167 }, 168 { 169 "one source search replica", 170 []string{}, 171 []string{":memory:"}, 172 1, 173 }, 174 { 175 "multiple source search replicas", 176 []string{}, 177 []string{":memory:", ":memory:", ":memory:"}, 178 1, 179 }, 180 { 181 "one source replica, one source search replica", 182 []string{":memory:"}, 183 []string{":memory:"}, 184 2, 185 }, 186 { 187 "one source replica, multiple source search replicas", 188 []string{":memory:"}, 189 []string{":memory:", ":memory:", ":memory:"}, 190 2, 191 }, 192 { 193 "multiple source replica, one source search replica", 194 []string{":memory:", ":memory:", ":memory:"}, 195 []string{":memory:"}, 196 4, 197 }, 198 { 199 "multiple source replica, multiple source search replicas", 200 []string{":memory:", ":memory:", ":memory:"}, 201 []string{":memory:", ":memory:", ":memory:"}, 202 4, 203 }, 204 } 205 206 for _, testCase := range testCases { 207 testCase := testCase 208 t.Run(testCase.Description, func(t *testing.T) { 209 t.Parallel() 210 211 driverName := model.DATABASE_DRIVER_SQLITE 212 dataSource := ":memory:" 213 maxIdleConns := 1 214 connMaxLifetimeMilliseconds := 3600000 215 maxOpenConns := 1 216 queryTimeout := 5 217 218 settings := model.SqlSettings{ 219 DriverName: &driverName, 220 DataSource: &dataSource, 221 MaxIdleConns: &maxIdleConns, 222 ConnMaxLifetimeMilliseconds: &connMaxLifetimeMilliseconds, 223 MaxOpenConns: &maxOpenConns, 224 QueryTimeout: &queryTimeout, 225 DataSourceReplicas: testCase.DataSourceReplicas, 226 DataSourceSearchReplicas: testCase.DataSourceSearchReplicas, 227 } 228 supplier := sqlstore.NewSqlSupplier(settings, nil) 229 230 assert.Equal(t, testCase.ExpectedNumConnections, len(supplier.GetAllConns())) 231 }) 232 } 233 }