diff options
author | Jesse Hallam <jesse.hallam@gmail.com> | 2018-04-16 21:23:20 -0400 |
---|---|---|
committer | Christopher Speller <crspeller@gmail.com> | 2018-04-16 18:23:20 -0700 |
commit | 3a4c7603b3ce35ab247b4dddaf7a2506375ba2c9 (patch) | |
tree | b60b9b7dd321ba741946f4bd57556895c211c3ed /store/sqlstore/supplier_test.go | |
parent | ba6f9075c1fcc3fbfa5ba94e97df6a4dd9e70b50 (diff) | |
download | chat-3a4c7603b3ce35ab247b4dddaf7a2506375ba2c9.tar.gz chat-3a4c7603b3ce35ab247b4dddaf7a2506375ba2c9.tar.bz2 chat-3a4c7603b3ce35ab247b4dddaf7a2506375ba2c9.zip |
MM-10020: avoid duplicating unique indexes (#8587)
* unit test TestGet(Search)Replica
This adds partial, testing-focused support for SQLite, as well as removing
some translated log messages that required initializing i18n just for
testing.
* avoid returning master twice when no replicas are configured
* remove duplicate indexes
* unit test GetAllConns
Diffstat (limited to 'store/sqlstore/supplier_test.go')
-rw-r--r-- | store/sqlstore/supplier_test.go | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/store/sqlstore/supplier_test.go b/store/sqlstore/supplier_test.go new file mode 100644 index 000000000..5aacfbe6a --- /dev/null +++ b/store/sqlstore/supplier_test.go @@ -0,0 +1,229 @@ +package sqlstore_test + +import ( + "testing" + + "github.com/mattermost/gorp" + _ "github.com/mattn/go-sqlite3" + "github.com/stretchr/testify/assert" + + "github.com/mattermost/mattermost-server/model" + "github.com/mattermost/mattermost-server/store/sqlstore" +) + +func TestGetReplica(t *testing.T) { + t.Parallel() + testCases := []struct { + Description string + DataSourceReplicas []string + DataSourceSearchReplicas []string + }{ + { + "no replicas", + []string{}, + []string{}, + }, + { + "one source replica", + []string{":memory:"}, + []string{}, + }, + { + "multiple source replicas", + []string{":memory:", ":memory:", ":memory:"}, + []string{}, + }, + { + "one source search replica", + []string{}, + []string{":memory:"}, + }, + { + "multiple source search replicas", + []string{}, + []string{":memory:", ":memory:", ":memory:"}, + }, + { + "one source replica, one source search replica", + []string{":memory:"}, + []string{":memory:"}, + }, + { + "one source replica, multiple source search replicas", + []string{":memory:"}, + []string{":memory:", ":memory:", ":memory:"}, + }, + { + "multiple source replica, one source search replica", + []string{":memory:", ":memory:", ":memory:"}, + []string{":memory:"}, + }, + { + "multiple source replica, multiple source search replicas", + []string{":memory:", ":memory:", ":memory:"}, + []string{":memory:", ":memory:", ":memory:"}, + }, + } + + for _, testCase := range testCases { + testCase := testCase + t.Run(testCase.Description, func(t *testing.T) { + t.Parallel() + + driverName := model.DATABASE_DRIVER_SQLITE + dataSource := ":memory:" + maxIdleConns := 1 + maxOpenConns := 1 + queryTimeout := 5 + + settings := model.SqlSettings{ + DriverName: &driverName, + DataSource: &dataSource, + MaxIdleConns: &maxIdleConns, + MaxOpenConns: &maxOpenConns, + QueryTimeout: &queryTimeout, + DataSourceReplicas: testCase.DataSourceReplicas, + DataSourceSearchReplicas: testCase.DataSourceSearchReplicas, + } + supplier := sqlstore.NewSqlSupplier(settings, nil) + + replicas := make(map[*gorp.DbMap]bool) + for i := 0; i < 5; i++ { + replicas[supplier.GetReplica()] = true + } + + searchReplicas := make(map[*gorp.DbMap]bool) + for i := 0; i < 5; i++ { + searchReplicas[supplier.GetSearchReplica()] = true + } + + if len(testCase.DataSourceReplicas) > 0 { + // If replicas were defined, ensure none are the master. + assert.Len(t, replicas, len(testCase.DataSourceReplicas)) + + for replica := range replicas { + assert.NotEqual(t, supplier.GetMaster(), replica) + } + + } else if assert.Len(t, replicas, 1) { + // Otherwise ensure the replicas contains only the master. + for replica := range replicas { + assert.Equal(t, supplier.GetMaster(), replica) + } + } + + if len(testCase.DataSourceSearchReplicas) > 0 { + // If search replicas were defined, ensure none are the master nor the replicas. + assert.Len(t, searchReplicas, len(testCase.DataSourceSearchReplicas)) + + for searchReplica := range searchReplicas { + assert.NotEqual(t, supplier.GetMaster(), searchReplica) + for replica := range replicas { + assert.NotEqual(t, searchReplica, replica) + } + } + + } else if len(testCase.DataSourceReplicas) > 0 { + // If no search replicas were defined, but replicas were, ensure they are equal. + assert.Equal(t, replicas, searchReplicas) + + } else if assert.Len(t, searchReplicas, 1) { + // Otherwise ensure the search replicas contains the master. + for searchReplica := range searchReplicas { + assert.Equal(t, supplier.GetMaster(), searchReplica) + } + } + }) + } +} + +func TestGetAllConns(t *testing.T) { + t.Parallel() + testCases := []struct { + Description string + DataSourceReplicas []string + DataSourceSearchReplicas []string + ExpectedNumConnections int + }{ + { + "no replicas", + []string{}, + []string{}, + 1, + }, + { + "one source replica", + []string{":memory:"}, + []string{}, + 2, + }, + { + "multiple source replicas", + []string{":memory:", ":memory:", ":memory:"}, + []string{}, + 4, + }, + { + "one source search replica", + []string{}, + []string{":memory:"}, + 1, + }, + { + "multiple source search replicas", + []string{}, + []string{":memory:", ":memory:", ":memory:"}, + 1, + }, + { + "one source replica, one source search replica", + []string{":memory:"}, + []string{":memory:"}, + 2, + }, + { + "one source replica, multiple source search replicas", + []string{":memory:"}, + []string{":memory:", ":memory:", ":memory:"}, + 2, + }, + { + "multiple source replica, one source search replica", + []string{":memory:", ":memory:", ":memory:"}, + []string{":memory:"}, + 4, + }, + { + "multiple source replica, multiple source search replicas", + []string{":memory:", ":memory:", ":memory:"}, + []string{":memory:", ":memory:", ":memory:"}, + 4, + }, + } + + for _, testCase := range testCases { + testCase := testCase + t.Run(testCase.Description, func(t *testing.T) { + t.Parallel() + + driverName := model.DATABASE_DRIVER_SQLITE + dataSource := ":memory:" + maxIdleConns := 1 + maxOpenConns := 1 + queryTimeout := 5 + + settings := model.SqlSettings{ + DriverName: &driverName, + DataSource: &dataSource, + MaxIdleConns: &maxIdleConns, + MaxOpenConns: &maxOpenConns, + QueryTimeout: &queryTimeout, + DataSourceReplicas: testCase.DataSourceReplicas, + DataSourceSearchReplicas: testCase.DataSourceSearchReplicas, + } + supplier := sqlstore.NewSqlSupplier(settings, nil) + + assert.Equal(t, testCase.ExpectedNumConnections, len(supplier.GetAllConns())) + }) + } +} |