From 662eef6881aee8272ab784eb192832f9c6a84a7a Mon Sep 17 00:00:00 2001 From: Patryk Pomykalski Date: Tue, 3 Mar 2020 14:19:54 +0100 Subject: [PATCH] Cache test users to speed up testing (#13741) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Cache test users to speed up testing Users were recreated for many tests and hashing passwords takes a lot of time. Testing /api4 takes around 120s less and /app 60s less. * fix build * simplifying a bit the approach Co-authored-by: mattermod Co-authored-by: Jesús Espino --- api4/apitestlib.go | 48 +++++++++++++++++++++++++++++++++++------ api4/preference_test.go | 5 +++++ api4/user_test.go | 4 ++++ app/helper_test.go | 34 +++++++++++++++++++++++------ 4 files changed, 78 insertions(+), 13 deletions(-) diff --git a/api4/apitestlib.go b/api4/apitestlib.go index 2b99dbf878..d1647d5d26 100644 --- a/api4/apitestlib.go +++ b/api4/apitestlib.go @@ -11,6 +11,7 @@ import ( "os" "path/filepath" "strings" + "sync" "testing" "time" @@ -235,15 +236,50 @@ func (me *TestHelper) TearDown() { } } +var initBasicOnce sync.Once +var userCache struct { + SystemAdminUser *model.User + TeamAdminUser *model.User + BasicUser *model.User + BasicUser2 *model.User +} + func (me *TestHelper) InitBasic() *TestHelper { me.waitForConnectivity() - me.SystemAdminUser = me.CreateUser() - me.App.UpdateUserRoles(me.SystemAdminUser.Id, model.SYSTEM_USER_ROLE_ID+" "+model.SYSTEM_ADMIN_ROLE_ID, false) - me.LoginSystemAdmin() + // create users once and cache them because password hashing is slow + initBasicOnce.Do(func() { + me.SystemAdminUser = me.CreateUser() + me.App.UpdateUserRoles(me.SystemAdminUser.Id, model.SYSTEM_USER_ROLE_ID+" "+model.SYSTEM_ADMIN_ROLE_ID, false) + me.SystemAdminUser, _ = me.App.GetUser(me.SystemAdminUser.Id) + userCache.SystemAdminUser = me.SystemAdminUser.DeepCopy() - me.TeamAdminUser = me.CreateUser() - me.App.UpdateUserRoles(me.TeamAdminUser.Id, model.SYSTEM_USER_ROLE_ID, false) + me.TeamAdminUser = me.CreateUser() + me.App.UpdateUserRoles(me.TeamAdminUser.Id, model.SYSTEM_USER_ROLE_ID, false) + me.TeamAdminUser, _ = me.App.GetUser(me.TeamAdminUser.Id) + userCache.TeamAdminUser = me.TeamAdminUser.DeepCopy() + + me.BasicUser = me.CreateUser() + me.BasicUser, _ = me.App.GetUser(me.BasicUser.Id) + userCache.BasicUser = me.BasicUser.DeepCopy() + + me.BasicUser2 = me.CreateUser() + me.BasicUser2, _ = me.App.GetUser(me.BasicUser2.Id) + userCache.BasicUser2 = me.BasicUser2.DeepCopy() + }) + // restore cached users + me.SystemAdminUser = userCache.SystemAdminUser.DeepCopy() + me.TeamAdminUser = userCache.TeamAdminUser.DeepCopy() + me.BasicUser = userCache.BasicUser.DeepCopy() + me.BasicUser2 = userCache.BasicUser2.DeepCopy() + mainHelper.GetSQLSupplier().GetMaster().Insert(me.SystemAdminUser, me.TeamAdminUser, me.BasicUser, me.BasicUser2) + // restore non hashed password for login + me.SystemAdminUser.Password = "Pa$$word11" + me.TeamAdminUser.Password = "Pa$$word11" + me.BasicUser.Password = "Pa$$word11" + me.BasicUser2.Password = "Pa$$word11" + + me.LoginSystemAdmin() me.LoginTeamAdmin() me.BasicTeam = me.CreateTeam() @@ -253,9 +289,7 @@ func (me *TestHelper) InitBasic() *TestHelper { me.BasicDeletedChannel = me.CreatePublicChannel() me.BasicChannel2 = me.CreatePublicChannel() me.BasicPost = me.CreatePost() - me.BasicUser = me.CreateUser() me.LinkUserToTeam(me.BasicUser, me.BasicTeam) - me.BasicUser2 = me.CreateUser() me.LinkUserToTeam(me.BasicUser2, me.BasicTeam) me.App.AddUserToChannel(me.BasicUser, me.BasicChannel) me.App.AddUserToChannel(me.BasicUser2, me.BasicChannel) diff --git a/api4/preference_test.go b/api4/preference_test.go index f9f99ad96c..b7e6aa4d13 100644 --- a/api4/preference_test.go +++ b/api4/preference_test.go @@ -18,7 +18,10 @@ func TestGetPreferences(t *testing.T) { defer th.TearDown() Client := th.Client + // recreate basic user (cached has no default preferences) + th.BasicUser = th.CreateUser() th.LoginBasic() + user1 := th.BasicUser category := model.NewId() @@ -50,6 +53,8 @@ func TestGetPreferences(t *testing.T) { require.Equal(t, preference.UserId, th.BasicUser.Id, "user id does not match") } + // recreate basic user2 + th.BasicUser2 = th.CreateUser() th.LoginBasic2() prefs, resp = Client.GetPreferences(th.BasicUser2.Id) diff --git a/api4/user_test.go b/api4/user_test.go index bdf1abebad..302ecad1a4 100644 --- a/api4/user_test.go +++ b/api4/user_test.go @@ -1242,6 +1242,10 @@ func TestAutocompleteUsers(t *testing.T) { func TestGetProfileImage(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() + + // recreate basic user + th.BasicUser = th.CreateUser() + th.LoginBasic() user := th.BasicUser data, resp := th.Client.GetProfileImage(user.Id, "") diff --git a/app/helper_test.go b/app/helper_test.go index e26e438b92..dfa626319c 100644 --- a/app/helper_test.go +++ b/app/helper_test.go @@ -8,6 +8,7 @@ import ( "os" "path/filepath" "strings" + "sync" "time" "testing" @@ -155,20 +156,41 @@ func SetupWithCustomConfig(tb testing.TB, configSet func(*model.Config)) *TestHe return setupTestHelper(dbStore, false, tb, configSet) } +var initBasicOnce sync.Once +var userCache struct { + SystemAdminUser *model.User + BasicUser *model.User + BasicUser2 *model.User +} + func (me *TestHelper) InitBasic() *TestHelper { - me.SystemAdminUser = me.CreateUser() - me.App.UpdateUserRoles(me.SystemAdminUser.Id, model.SYSTEM_USER_ROLE_ID+" "+model.SYSTEM_ADMIN_ROLE_ID, false) - me.SystemAdminUser, _ = me.App.GetUser(me.SystemAdminUser.Id) + // create users once and cache them because password hashing is slow + initBasicOnce.Do(func() { + me.SystemAdminUser = me.CreateUser() + me.App.UpdateUserRoles(me.SystemAdminUser.Id, model.SYSTEM_USER_ROLE_ID+" "+model.SYSTEM_ADMIN_ROLE_ID, false) + me.SystemAdminUser, _ = me.App.GetUser(me.SystemAdminUser.Id) + userCache.SystemAdminUser = me.SystemAdminUser.DeepCopy() + + me.BasicUser = me.CreateUser() + me.BasicUser, _ = me.App.GetUser(me.BasicUser.Id) + userCache.BasicUser = me.BasicUser.DeepCopy() + + me.BasicUser2 = me.CreateUser() + me.BasicUser2, _ = me.App.GetUser(me.BasicUser2.Id) + userCache.BasicUser2 = me.BasicUser2.DeepCopy() + }) + // restore cached users + me.SystemAdminUser = userCache.SystemAdminUser.DeepCopy() + me.BasicUser = userCache.BasicUser.DeepCopy() + me.BasicUser2 = userCache.BasicUser2.DeepCopy() + mainHelper.GetSQLSupplier().GetMaster().Insert(me.SystemAdminUser, me.BasicUser, me.BasicUser2) me.BasicTeam = me.CreateTeam() - me.BasicUser = me.CreateUser() me.LinkUserToTeam(me.BasicUser, me.BasicTeam) - me.BasicUser2 = me.CreateUser() me.LinkUserToTeam(me.BasicUser2, me.BasicTeam) me.BasicChannel = me.CreateChannel(me.BasicTeam) me.BasicPost = me.CreatePost(me.BasicChannel) - return me }