Skip to content

Commit

Permalink
MM-56196: Increase number of emojis + use custom emoji (#692)
Browse files Browse the repository at this point in the history
- We add functionality to create custom emojis at test start.
- We also add more emojis to the default set, including the custom emoji.

https://mattermost.atlassian.net/browse/MM-56196
  • Loading branch information
agnivade authored Jan 31, 2024
1 parent 0a8e28e commit 71d6bde
Show file tree
Hide file tree
Showing 12 changed files with 153 additions and 19 deletions.
59 changes: 48 additions & 11 deletions api/agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import (
"github.com/mattermost/mattermost-load-test-ng/performance"

"github.com/gorilla/mux"
"github.com/mattermost/mattermost/server/public/model"
"github.com/mattermost/mattermost/server/public/shared/mlog"
)

Expand Down Expand Up @@ -370,6 +371,12 @@ func NewControllerWrapper(config *loadtest.Config, controllerConfig interface{},
modAdmins = int(1 / config.UsersConfiguration.PercentOfUsersAreAdmin)
}

err = createCustomEmoji(config)
if err != nil {
return nil, err
}
mlog.Info("Custom emoji created")

return func(id int, status chan<- control.UserStatus) (control.UserController, error) {
id += userOffset

Expand Down Expand Up @@ -433,17 +440,7 @@ func NewControllerWrapper(config *loadtest.Config, controllerConfig interface{},
if err != nil {
return nil, err
}
adminUeSetup := userentity.Setup{
Store: adminStore,
}
adminUeConfig := userentity.Config{
ServerURL: config.ConnectionConfiguration.ServerURL,
WebSocketURL: config.ConnectionConfiguration.WebSocketURL,
Username: "",
Email: config.ConnectionConfiguration.AdminEmail,
Password: config.ConnectionConfiguration.AdminPassword,
}
sysadmin := userentity.New(adminUeSetup, adminUeConfig)
sysadmin := createSysAdmin(adminStore, config)
if err := sysadmin.Login(); err != nil {
return nil, err
}
Expand Down Expand Up @@ -508,3 +505,43 @@ func getUserCredentials(usersFilePath string, config *loadtest.Config) ([]user,

return users, nil
}

func createSysAdmin(store *memstore.MemStore, config *loadtest.Config) *userentity.UserEntity {
adminUeSetup := userentity.Setup{
Store: store,
}
adminUeConfig := userentity.Config{
ServerURL: config.ConnectionConfiguration.ServerURL,
WebSocketURL: config.ConnectionConfiguration.WebSocketURL,
Username: "",
Email: config.ConnectionConfiguration.AdminEmail,
Password: config.ConnectionConfiguration.AdminPassword,
}
return userentity.New(adminUeSetup, adminUeConfig)
}

func createCustomEmoji(config *loadtest.Config) error {
adminStore, err := memstore.New(nil)
if err != nil {
return err
}
sysadmin := createSysAdmin(adminStore, config)
if err := sysadmin.Login(); err != nil {
return err
}

emoji := &model.Emoji{
CreatorId: sysadmin.Store().Id(),
Name: "give_back_money",
}
buf := control.MustAsset("test_emoji.png")

err = sysadmin.UploadEmoji(emoji, buf, "image.png")
if err != nil {
var appErr *model.AppError
if errors.As(err, &appErr) && appErr.Id == "api.emoji.create.duplicate.app_error" {
return nil
}
}
return err
}
34 changes: 34 additions & 0 deletions api/agent_client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
package api

import (
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
"testing"
"time"
Expand All @@ -14,14 +17,41 @@ import (
"github.com/mattermost/mattermost-load-test-ng/loadtest/control/simulcontroller"
"github.com/mattermost/mattermost-load-test-ng/logger"

"github.com/mattermost/mattermost/server/public/model"
"github.com/stretchr/testify/require"
)

func createFakeMMServer() *httptest.Server {
return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("X-Version-Id", "dev")
switch r.URL.Path {
case "/api/v4/users/login":
u := model.User{}
u.Username = "sysadmin"
json.NewEncoder(w).Encode(u)
case "/api/v4/config":
mmCfg := model.Config{}
mmCfg.SetDefaults()
mmCfg.TeamSettings.MaxUsersPerTeam = model.NewInt(10000)
json.NewEncoder(w).Encode(mmCfg)
case "/api/v4/emoji":
json.NewEncoder(w).Encode(&model.Emoji{})
default:
fmt.Fprintln(w, "Hello, client")
}
}))
}

func createAgent(t *testing.T, id, serverURL string) *client.Agent {
t.Helper()

mmServer := createFakeMMServer()
t.Cleanup(mmServer.Close)

var ltConfig loadtest.Config
var ucConfig simulcontroller.Config
defaults.Set(&ltConfig)
ltConfig.ConnectionConfiguration.ServerURL = mmServer.URL
defaults.Set(&ucConfig)
agent, err := client.New(id, serverURL, nil)
require.NoError(t, err)
Expand All @@ -39,6 +69,9 @@ func TestCreateAgent(t *testing.T) {
server := httptest.NewServer(handler)
defer server.Close()

mmServer := createFakeMMServer()
defer mmServer.Close()

id := "agent0"
agent, err := client.New(id, server.URL, nil)
require.NoError(t, err)
Expand Down Expand Up @@ -102,6 +135,7 @@ func TestCreateAgent(t *testing.T) {
var ltConfig loadtest.Config
var ucConfig simulcontroller.Config
defaults.Set(&ltConfig)
ltConfig.ConnectionConfiguration.ServerURL = mmServer.URL
defaults.Set(&ucConfig)
_, err := agent.Create(&ltConfig, &ucConfig)
require.NoError(t, err)
Expand Down
10 changes: 8 additions & 2 deletions api/agent_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ func TestAgentAPI(t *testing.T) {
server := httptest.NewServer(handler)
defer server.Close()

mmServer := createFakeMMServer()
defer mmServer.Close()

// create httpexpect instance
e := httpexpect.New(t, server.URL+"/loadagent")

Expand All @@ -46,7 +49,7 @@ func TestAgentAPI(t *testing.T) {
err := defaults.Set(&ltConfig)
require.NoError(t, err)

ltConfig.ConnectionConfiguration.ServerURL = "http://fakesitetotallydoesntexist.com"
ltConfig.ConnectionConfiguration.ServerURL = mmServer.URL
ltConfig.UsersConfiguration.MaxActiveUsers = 100

ucConfig1, err := simplecontroller.ReadConfig("../config/simplecontroller.sample.json")
Expand Down Expand Up @@ -178,14 +181,17 @@ func TestAgentAPIConcurrency(t *testing.T) {
server := httptest.NewServer(handler)
defer server.Close()

mmServer := createFakeMMServer()
defer mmServer.Close()

// create httpexpect instance
e := httpexpect.New(t, server.URL+"/loadagent")

ltConfig := loadtest.Config{}
err := defaults.Set(&ltConfig)
require.NoError(t, err)

ltConfig.ConnectionConfiguration.ServerURL = "http://fakesitetotallydoesntexist.com"
ltConfig.ConnectionConfiguration.ServerURL = mmServer.URL
ltConfig.UsersConfiguration.MaxActiveUsers = 100

ucConfig, err := simulcontroller.ReadConfig("../config/simulcontroller.sample.json")
Expand Down
12 changes: 12 additions & 0 deletions api/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ func TestAgentClientConcurrency(t *testing.T) {
server := httptest.NewServer(handler)
defer server.Close()

mmServer := createFakeMMServer()
defer mmServer.Close()

var wg sync.WaitGroup

t.Run("create", func(t *testing.T) {
Expand All @@ -40,6 +43,7 @@ func TestAgentClientConcurrency(t *testing.T) {
var ltConfig loadtest.Config
var ucConfig simulcontroller.Config
defaults.Set(&ltConfig)
ltConfig.ConnectionConfiguration.ServerURL = mmServer.URL
defaults.Set(&ucConfig)
agent, err := agentClient.New(id, server.URL, nil)
require.NoError(t, err)
Expand Down Expand Up @@ -192,11 +196,16 @@ func TestCoordClientConcurrency(t *testing.T) {

create := func(t *testing.T, i int) *coordClient.Coordinator {
t.Helper()

mmServer := createFakeMMServer()
t.Cleanup(mmServer.Close)

coord := createClient(t, i)
var coordConfig coordinator.Config
var ltConfig loadtest.Config
defaults.Set(&coordConfig)
defaults.Set(&ltConfig)
ltConfig.ConnectionConfiguration.ServerURL = mmServer.URL
coordConfig.ClusterConfig.Agents[0].Id = coord.Id() + "-agent"
coordConfig.ClusterConfig.Agents[0].ApiURL = server.URL
_, err := coord.Create(&coordConfig, &ltConfig)
Expand All @@ -206,10 +215,13 @@ func TestCoordClientConcurrency(t *testing.T) {

t.Run("create/destroy", func(t *testing.T) {
coord := createClient(t, 0)
mmServer := createFakeMMServer()
defer mmServer.Close()
var coordConfig coordinator.Config
var ltConfig loadtest.Config
defaults.Set(&coordConfig)
defaults.Set(&ltConfig)
ltConfig.ConnectionConfiguration.ServerURL = mmServer.URL
coordConfig.ClusterConfig.Agents[0].Id = coord.Id() + "-agent"
coordConfig.ClusterConfig.Agents[0].ApiURL = server.URL
var success int
Expand Down
8 changes: 8 additions & 0 deletions api/coordinator_client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,13 @@ import (

func createCoordinator(t *testing.T, id, serverURL string) *client.Coordinator {
t.Helper()
mmServer := createFakeMMServer()
t.Cleanup(mmServer.Close)
var coordConfig coordinator.Config
var ltConfig loadtest.Config
defaults.Set(&coordConfig)
defaults.Set(&ltConfig)
ltConfig.ConnectionConfiguration.ServerURL = mmServer.URL
coordConfig.ClusterConfig.Agents[0].ApiURL = serverURL
coord, err := client.New(id, serverURL, nil)
require.NoError(t, err)
Expand All @@ -40,6 +43,9 @@ func TestCreateCoordinator(t *testing.T) {
server := httptest.NewServer(handler)
defer server.Close()

mmServer := createFakeMMServer()
defer mmServer.Close()

id := "coord0"
coord, err := client.New(id, server.URL, nil)
require.NoError(t, err)
Expand All @@ -64,6 +70,7 @@ func TestCreateCoordinator(t *testing.T) {
var ltConfig loadtest.Config
defaults.Set(&coordConfig)
defaults.Set(&ltConfig)
ltConfig.ConnectionConfiguration.ServerURL = mmServer.URL
coordConfig.ClusterConfig.Agents[0].ApiURL = server.URL
_, err := coord.Create(&coordConfig, &ltConfig)
require.NoError(t, err)
Expand All @@ -74,6 +81,7 @@ func TestCreateCoordinator(t *testing.T) {
var ltConfig loadtest.Config
defaults.Set(&coordConfig)
defaults.Set(&ltConfig)
ltConfig.ConnectionConfiguration.ServerURL = mmServer.URL
coordConfig.ClusterConfig.Agents[0].ApiURL = server.URL
status, err := coord.Create(&coordConfig, &ltConfig)
require.Error(t, err)
Expand Down
5 changes: 4 additions & 1 deletion api/coordinator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,16 @@ func TestCoordinatorAPI(t *testing.T) {
server := httptest.NewServer(handler)
defer server.Close()

mmServer := createFakeMMServer()
defer mmServer.Close()

// create httpexpect instance
e := httpexpect.New(t, server.URL+"/coordinator")

var ltConfig loadtest.Config
err := defaults.Set(&ltConfig)
require.NoError(t, err)
ltConfig.ConnectionConfiguration.ServerURL = "http://fakesitetotallydoesntexist.com"
ltConfig.ConnectionConfiguration.ServerURL = mmServer.URL
ltConfig.UsersConfiguration.MaxActiveUsers = 100

var config coordinator.Config
Expand Down
23 changes: 23 additions & 0 deletions loadtest/control/bindata.go

Large diffs are not rendered by default.

3 changes: 1 addition & 2 deletions loadtest/control/simulcontroller/actions.go
Original file line number Diff line number Diff line change
Expand Up @@ -811,8 +811,7 @@ func (c *SimulController) addReaction(u user.User) control.UserActionResponse {
PostId: post.Id,
}

emojis := []string{"+1", "tada", "point_up", "raised_hands"}
reaction.EmojiName = emojis[rand.Intn(len(emojis))]
reaction.EmojiName = control.RandomEmoji()

reactions, err := u.Store().Reactions(post.Id)
if err != nil {
Expand Down
7 changes: 4 additions & 3 deletions loadtest/control/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,10 @@ var (
userNameRe = regexp.MustCompile(`-[[:alpha:]]+`)
teamDisplayNameRe = regexp.MustCompile(`team[0-9]+(.*)`)
words = []string{}
emojis = []string{":grinning:", ":slightly_smiling_face:", ":smile:", ":sunglasses:", ":innocent:", ":hugging_face:"}
serverVersionRE = regexp.MustCompile(`\d+.\d+\.\d+`)
links = []string{
emojis = []string{":grinning:", ":slightly_smiling_face:", ":smile:", ":sunglasses:", ":innocent:", ":hugging_face:", ":shushing_face:", ":face_with_finger_covering_closed_lips:", ":thinking_face:", ":thinking:", ":zipper_mouth_face:", ":face_with_raised_eyebrow:", ":face_with_one_eyebrow_raised:", ":neutral_face:", ":expressionless:", ":no_mouth:", ":smirk:", ":unamused:", ":face_with_rolling_eyes:", ":roll_eyes:", ":grimacing:", ":lying_face:", ":relieved:", ":pensive:", ":sleepy:", ":drooling_face:", ":sleeping:", ":mask:", ":give_back_money:"} // The last one is a custom emoji

serverVersionRE = regexp.MustCompile(`\d+.\d+\.\d+`)
links = []string{
"https://github.com/mattermost/mattermost",
"https://www.youtube.com/watch?v=-5jompL6G-k",
"https://www.youtube.com/watch?v=GKLyAVHgNzY",
Expand Down
1 change: 1 addition & 0 deletions loadtest/user/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,7 @@ type User interface {
GetEmojiList(page, perPage int) error
// GetEmojiImage fetches the image for a given emoji.
GetEmojiImage(emojiId string) error
UploadEmoji(emoji *model.Emoji, image []byte, filename string) error

// reactions
// SaveReaction stores the given reaction.
Expand Down
10 changes: 10 additions & 0 deletions loadtest/user/userentity/actions.go
Original file line number Diff line number Diff line change
Expand Up @@ -1030,6 +1030,16 @@ func (ue *UserEntity) GetEmojiImage(emojiId string) error {
return nil
}

// UploadEmoji uploads the given emoji to the server.
func (ue *UserEntity) UploadEmoji(emoji *model.Emoji, image []byte, filename string) error {
_, _, err := ue.client.CreateEmoji(context.Background(), emoji, image, filename)
if err != nil {
return err
}

return nil
}

// SaveReaction stores the given reaction.
func (ue *UserEntity) SaveReaction(reaction *model.Reaction) error {
r, _, err := ue.client.SaveReaction(context.Background(), reaction)
Expand Down
Binary file added testdata/test_emoji.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 71d6bde

Please sign in to comment.