github.com/lologarithm/mattermost-server@v5.3.2-0.20181002060438-c82a84ed765b+incompatible/migrations/migrationstestlib.go (about)

     1  // Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package migrations
     5  
     6  import (
     7  	"io"
     8  	"io/ioutil"
     9  	"os"
    10  	"time"
    11  
    12  	"github.com/mattermost/mattermost-server/app"
    13  	"github.com/mattermost/mattermost-server/einterfaces"
    14  	"github.com/mattermost/mattermost-server/mlog"
    15  	"github.com/mattermost/mattermost-server/model"
    16  	"github.com/mattermost/mattermost-server/store"
    17  	"github.com/mattermost/mattermost-server/store/sqlstore"
    18  	"github.com/mattermost/mattermost-server/store/storetest"
    19  	"github.com/mattermost/mattermost-server/utils"
    20  )
    21  
    22  type TestHelper struct {
    23  	App          *app.App
    24  	BasicTeam    *model.Team
    25  	BasicUser    *model.User
    26  	BasicUser2   *model.User
    27  	BasicChannel *model.Channel
    28  	BasicPost    *model.Post
    29  
    30  	SystemAdminUser *model.User
    31  
    32  	tempConfigPath string
    33  	tempWorkspace  string
    34  }
    35  
    36  type persistentTestStore struct {
    37  	store.Store
    38  }
    39  
    40  func (*persistentTestStore) Close() {}
    41  
    42  var testStoreContainer *storetest.RunningContainer
    43  var testStore *persistentTestStore
    44  var testStoreSqlSupplier *sqlstore.SqlSupplier
    45  var testClusterInterface *FakeClusterInterface
    46  
    47  // UseTestStore sets the container and corresponding settings to use for tests. Once the tests are
    48  // complete (e.g. at the end of your TestMain implementation), you should call StopTestStore.
    49  func UseTestStore(container *storetest.RunningContainer, settings *model.SqlSettings) {
    50  	testClusterInterface = &FakeClusterInterface{}
    51  	testStoreContainer = container
    52  	testStoreSqlSupplier = sqlstore.NewSqlSupplier(*settings, nil)
    53  	testStore = &persistentTestStore{store.NewLayeredStore(testStoreSqlSupplier, nil, testClusterInterface)}
    54  }
    55  
    56  func StopTestStore() {
    57  	if testStoreContainer != nil {
    58  		testStoreContainer.Stop()
    59  		testStoreContainer = nil
    60  	}
    61  }
    62  
    63  func setupTestHelper(enterprise bool) *TestHelper {
    64  	permConfig, err := os.Open(utils.FindConfigFile("config.json"))
    65  	if err != nil {
    66  		panic(err)
    67  	}
    68  	defer permConfig.Close()
    69  	tempConfig, err := ioutil.TempFile("", "")
    70  	if err != nil {
    71  		panic(err)
    72  	}
    73  	_, err = io.Copy(tempConfig, permConfig)
    74  	tempConfig.Close()
    75  	if err != nil {
    76  		panic(err)
    77  	}
    78  
    79  	options := []app.Option{app.ConfigFile(tempConfig.Name()), app.DisableConfigWatch}
    80  	if testStore != nil {
    81  		options = append(options, app.StoreOverride(testStore))
    82  	}
    83  
    84  	a, err := app.New(options...)
    85  	if err != nil {
    86  		panic(err)
    87  	}
    88  
    89  	th := &TestHelper{
    90  		App:            a,
    91  		tempConfigPath: tempConfig.Name(),
    92  	}
    93  
    94  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.MaxUsersPerTeam = 50 })
    95  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.RateLimitSettings.Enable = false })
    96  	prevListenAddress := *th.App.Config().ServiceSettings.ListenAddress
    97  	if testStore != nil {
    98  		th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.ListenAddress = ":0" })
    99  	}
   100  	serverErr := th.App.StartServer()
   101  	if serverErr != nil {
   102  		panic(serverErr)
   103  	}
   104  
   105  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.ListenAddress = prevListenAddress })
   106  
   107  	th.App.DoAdvancedPermissionsMigration()
   108  	th.App.DoEmojisPermissionsMigration()
   109  
   110  	th.App.Srv.Store.MarkSystemRanUnitTests()
   111  
   112  	th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.EnableOpenServer = true })
   113  
   114  	if enterprise {
   115  		th.App.SetLicense(model.NewTestLicense())
   116  	} else {
   117  		th.App.SetLicense(nil)
   118  	}
   119  
   120  	return th
   121  }
   122  
   123  func SetupEnterprise() *TestHelper {
   124  	return setupTestHelper(true)
   125  }
   126  
   127  func Setup() *TestHelper {
   128  	return setupTestHelper(false)
   129  }
   130  
   131  func (me *TestHelper) InitBasic() *TestHelper {
   132  	me.BasicTeam = me.CreateTeam()
   133  	me.BasicUser = me.CreateUser()
   134  	me.LinkUserToTeam(me.BasicUser, me.BasicTeam)
   135  	me.BasicUser2 = me.CreateUser()
   136  	me.LinkUserToTeam(me.BasicUser2, me.BasicTeam)
   137  	me.BasicChannel = me.CreateChannel(me.BasicTeam)
   138  	me.BasicPost = me.CreatePost(me.BasicChannel)
   139  
   140  	return me
   141  }
   142  
   143  func (me *TestHelper) InitSystemAdmin() *TestHelper {
   144  	me.SystemAdminUser = me.CreateUser()
   145  	me.App.UpdateUserRoles(me.SystemAdminUser.Id, model.SYSTEM_USER_ROLE_ID+" "+model.SYSTEM_ADMIN_ROLE_ID, false)
   146  	me.SystemAdminUser, _ = me.App.GetUser(me.SystemAdminUser.Id)
   147  
   148  	return me
   149  }
   150  
   151  func (me *TestHelper) MakeEmail() string {
   152  	return "success_" + model.NewId() + "@simulator.amazonses.com"
   153  }
   154  
   155  func (me *TestHelper) CreateTeam() *model.Team {
   156  	id := model.NewId()
   157  	team := &model.Team{
   158  		DisplayName: "dn_" + id,
   159  		Name:        "name" + id,
   160  		Email:       "success+" + id + "@simulator.amazonses.com",
   161  		Type:        model.TEAM_OPEN,
   162  	}
   163  
   164  	utils.DisableDebugLogForTest()
   165  	var err *model.AppError
   166  	if team, err = me.App.CreateTeam(team); err != nil {
   167  		mlog.Error(err.Error())
   168  
   169  		time.Sleep(time.Second)
   170  		panic(err)
   171  	}
   172  	utils.EnableDebugLogForTest()
   173  	return team
   174  }
   175  
   176  func (me *TestHelper) CreateUser() *model.User {
   177  	id := model.NewId()
   178  
   179  	user := &model.User{
   180  		Email:         "success+" + id + "@simulator.amazonses.com",
   181  		Username:      "un_" + id,
   182  		Nickname:      "nn_" + id,
   183  		Password:      "Password1",
   184  		EmailVerified: true,
   185  	}
   186  
   187  	utils.DisableDebugLogForTest()
   188  	var err *model.AppError
   189  	if user, err = me.App.CreateUser(user); err != nil {
   190  		mlog.Error(err.Error())
   191  
   192  		time.Sleep(time.Second)
   193  		panic(err)
   194  	}
   195  	utils.EnableDebugLogForTest()
   196  	return user
   197  }
   198  
   199  func (me *TestHelper) CreateChannel(team *model.Team) *model.Channel {
   200  	return me.createChannel(team, model.CHANNEL_OPEN)
   201  }
   202  
   203  func (me *TestHelper) createChannel(team *model.Team, channelType string) *model.Channel {
   204  	id := model.NewId()
   205  
   206  	channel := &model.Channel{
   207  		DisplayName: "dn_" + id,
   208  		Name:        "name_" + id,
   209  		Type:        channelType,
   210  		TeamId:      team.Id,
   211  		CreatorId:   me.BasicUser.Id,
   212  	}
   213  
   214  	utils.DisableDebugLogForTest()
   215  	var err *model.AppError
   216  	if channel, err = me.App.CreateChannel(channel, true); err != nil {
   217  		mlog.Error(err.Error())
   218  
   219  		time.Sleep(time.Second)
   220  		panic(err)
   221  	}
   222  	utils.EnableDebugLogForTest()
   223  	return channel
   224  }
   225  
   226  func (me *TestHelper) CreateDmChannel(user *model.User) *model.Channel {
   227  	utils.DisableDebugLogForTest()
   228  	var err *model.AppError
   229  	var channel *model.Channel
   230  	if channel, err = me.App.CreateDirectChannel(me.BasicUser.Id, user.Id); err != nil {
   231  		mlog.Error(err.Error())
   232  
   233  		time.Sleep(time.Second)
   234  		panic(err)
   235  	}
   236  	utils.EnableDebugLogForTest()
   237  	return channel
   238  }
   239  
   240  func (me *TestHelper) CreatePost(channel *model.Channel) *model.Post {
   241  	id := model.NewId()
   242  
   243  	post := &model.Post{
   244  		UserId:    me.BasicUser.Id,
   245  		ChannelId: channel.Id,
   246  		Message:   "message_" + id,
   247  		CreateAt:  model.GetMillis() - 10000,
   248  	}
   249  
   250  	utils.DisableDebugLogForTest()
   251  	var err *model.AppError
   252  	if post, err = me.App.CreatePost(post, channel, false); err != nil {
   253  		mlog.Error(err.Error())
   254  
   255  		time.Sleep(time.Second)
   256  		panic(err)
   257  	}
   258  	utils.EnableDebugLogForTest()
   259  	return post
   260  }
   261  
   262  func (me *TestHelper) LinkUserToTeam(user *model.User, team *model.Team) {
   263  	utils.DisableDebugLogForTest()
   264  
   265  	err := me.App.JoinUserToTeam(team, user, "")
   266  	if err != nil {
   267  		mlog.Error(err.Error())
   268  
   269  		time.Sleep(time.Second)
   270  		panic(err)
   271  	}
   272  
   273  	utils.EnableDebugLogForTest()
   274  }
   275  
   276  func (me *TestHelper) AddUserToChannel(user *model.User, channel *model.Channel) *model.ChannelMember {
   277  	utils.DisableDebugLogForTest()
   278  
   279  	member, err := me.App.AddUserToChannel(user, channel)
   280  	if err != nil {
   281  		mlog.Error(err.Error())
   282  
   283  		time.Sleep(time.Second)
   284  		panic(err)
   285  	}
   286  
   287  	utils.EnableDebugLogForTest()
   288  
   289  	return member
   290  }
   291  
   292  func (me *TestHelper) TearDown() {
   293  	me.App.Shutdown()
   294  	os.Remove(me.tempConfigPath)
   295  	if err := recover(); err != nil {
   296  		StopTestStore()
   297  		panic(err)
   298  	}
   299  	if me.tempWorkspace != "" {
   300  		os.RemoveAll(me.tempWorkspace)
   301  	}
   302  }
   303  
   304  func (me *TestHelper) ResetRoleMigration() {
   305  	if _, err := testStoreSqlSupplier.GetMaster().Exec("DELETE from Roles"); err != nil {
   306  		panic(err)
   307  	}
   308  
   309  	testClusterInterface.sendClearRoleCacheMessage()
   310  
   311  	if _, err := testStoreSqlSupplier.GetMaster().Exec("DELETE from Systems where Name = :Name", map[string]interface{}{"Name": app.ADVANCED_PERMISSIONS_MIGRATION_KEY}); err != nil {
   312  		panic(err)
   313  	}
   314  }
   315  
   316  func (me *TestHelper) DeleteAllJobsByTypeAndMigrationKey(jobType string, migrationKey string) {
   317  	if res := <-me.App.Srv.Store.Job().GetAllByType(model.JOB_TYPE_MIGRATIONS); res.Err != nil {
   318  		panic(res.Err)
   319  	} else {
   320  		jobs := res.Data.([]*model.Job)
   321  
   322  		for _, job := range jobs {
   323  			if key, ok := job.Data[JOB_DATA_KEY_MIGRATION]; ok && key == migrationKey {
   324  				if res := <-me.App.Srv.Store.Job().Delete(job.Id); res.Err != nil {
   325  					panic(res.Err)
   326  				}
   327  			}
   328  		}
   329  	}
   330  }
   331  
   332  type FakeClusterInterface struct {
   333  	clusterMessageHandler einterfaces.ClusterMessageHandler
   334  }
   335  
   336  func (me *FakeClusterInterface) StartInterNodeCommunication() {}
   337  func (me *FakeClusterInterface) StopInterNodeCommunication()  {}
   338  func (me *FakeClusterInterface) RegisterClusterMessageHandler(event string, crm einterfaces.ClusterMessageHandler) {
   339  	me.clusterMessageHandler = crm
   340  }
   341  func (me *FakeClusterInterface) GetClusterId() string                             { return "" }
   342  func (me *FakeClusterInterface) IsLeader() bool                                   { return false }
   343  func (me *FakeClusterInterface) GetMyClusterInfo() *model.ClusterInfo             { return nil }
   344  func (me *FakeClusterInterface) GetClusterInfos() []*model.ClusterInfo            { return nil }
   345  func (me *FakeClusterInterface) SendClusterMessage(cluster *model.ClusterMessage) {}
   346  func (me *FakeClusterInterface) NotifyMsg(buf []byte)                             {}
   347  func (me *FakeClusterInterface) GetClusterStats() ([]*model.ClusterStats, *model.AppError) {
   348  	return nil, nil
   349  }
   350  func (me *FakeClusterInterface) GetLogs(page, perPage int) ([]string, *model.AppError) {
   351  	return []string{}, nil
   352  }
   353  func (me *FakeClusterInterface) ConfigChanged(previousConfig *model.Config, newConfig *model.Config, sendToOtherServer bool) *model.AppError {
   354  	return nil
   355  }
   356  func (me *FakeClusterInterface) sendClearRoleCacheMessage() {
   357  	me.clusterMessageHandler(&model.ClusterMessage{
   358  		Event: model.CLUSTER_EVENT_INVALIDATE_CACHE_FOR_ROLES,
   359  	})
   360  }
   361  func (me *FakeClusterInterface) GetPluginStatuses() (model.PluginStatuses, *model.AppError) {
   362  	return nil, nil
   363  }