[MM-19914] Fix data races in WebSocketEvent (#13039)

* Make WebSocketEvent type immutable

* Update code to use updated immutable WebSocketEvent type

* Export WebSocketEvent fields and mark them as deprecated
Этот коммит содержится в:
Claudio Costa
2019-12-24 09:32:11 +01:00
коммит произвёл GitHub
родитель 9ab7bee0a6
Коммит 80dd2915db
16 изменённых файлов: 216 добавлений и 94 удалений

Просмотреть файл

@@ -1367,7 +1367,7 @@ func TestConvertChannelToPrivate(t *testing.T) {
for {
select {
case resp := <-WebSocketClient.EventChannel:
if resp.Event == model.WEBSOCKET_EVENT_CHANNEL_CONVERTED && resp.Data["channel_id"].(string) == publicChannel2.Id {
if resp.EventType() == model.WEBSOCKET_EVENT_CHANNEL_CONVERTED && resp.GetData()["channel_id"].(string) == publicChannel2.Id {
eventHit = true
}
case <-stop:
@@ -2426,7 +2426,7 @@ func TestRemoveChannelMember(t *testing.T) {
})
wsr := <-wsClient.EventChannel
require.Equal(t, model.WEBSOCKET_EVENT_HELLO, wsr.Event)
require.Equal(t, model.WEBSOCKET_EVENT_HELLO, wsr.EventType())
// requirePost listens for websocket events and tries to find the post matching
// the expected post's channel and message.
@@ -2435,7 +2435,7 @@ func TestRemoveChannelMember(t *testing.T) {
for {
select {
case event := <-wsClient.EventChannel:
postData, ok := event.Data["post"]
postData, ok := event.GetData()["post"]
if !ok {
continue
}

Просмотреть файл

@@ -315,7 +315,7 @@ func TestNotifyClusterPluginEvent(t *testing.T) {
for {
select {
case resp := <-webSocketClient.EventChannel:
if resp.Event == model.WEBSOCKET_EVENT_PLUGIN_STATUSES_CHANGED && len(resp.Data["plugin_statuses"].([]interface{})) == 0 {
if resp.EventType() == model.WEBSOCKET_EVENT_PLUGIN_STATUSES_CHANGED && len(resp.GetData()["plugin_statuses"].([]interface{})) == 0 {
done <- true
return
}

Просмотреть файл

@@ -487,7 +487,7 @@ func TestCreatePostSendOutOfChannelMentions(t *testing.T) {
for waiting {
select {
case event := <-WebSocketClient.EventChannel:
require.NotEqual(t, model.WEBSOCKET_EVENT_EPHEMERAL_MESSAGE, event.Event, "should not have ephemeral message event")
require.NotEqual(t, model.WEBSOCKET_EVENT_EPHEMERAL_MESSAGE, event.EventType(), "should not have ephemeral message event")
case <-timeout:
waiting = false
}
@@ -506,12 +506,12 @@ func TestCreatePostSendOutOfChannelMentions(t *testing.T) {
for waiting {
select {
case event := <-WebSocketClient.EventChannel:
if event.Event != model.WEBSOCKET_EVENT_EPHEMERAL_MESSAGE {
if event.EventType() != model.WEBSOCKET_EVENT_EPHEMERAL_MESSAGE {
// Ignore any other events
continue
}
wpost := model.PostFromJson(strings.NewReader(event.Data["post"].(string)))
wpost := model.PostFromJson(strings.NewReader(event.GetData()["post"].(string)))
acm, ok := wpost.Props[model.PROPS_ADD_CHANNEL_MEMBER].(map[string]interface{})
require.True(t, ok, "should have received ephemeral post with 'add_channel_member' in props")

Просмотреть файл

@@ -259,6 +259,7 @@ func TestUpdatePreferencesWebsocket(t *testing.T) {
Name: model.NewId(),
},
}
_, resp := th.Client.UpdatePreferences(userId, preferences)
CheckNoError(t, resp)
@@ -268,12 +269,12 @@ func TestUpdatePreferencesWebsocket(t *testing.T) {
for waiting {
select {
case event := <-WebSocketClient.EventChannel:
if event.Event != model.WEBSOCKET_EVENT_PREFERENCES_CHANGED {
if event.EventType() != model.WEBSOCKET_EVENT_PREFERENCES_CHANGED {
// Ignore any other events
continue
}
received, err := model.PreferencesFromJson(strings.NewReader(event.Data["preferences"].(string)))
received, err := model.PreferencesFromJson(strings.NewReader(event.GetData()["preferences"].(string)))
require.NoError(t, err)
for i, p := range *preferences {
@@ -376,12 +377,12 @@ func TestDeletePreferencesWebsocket(t *testing.T) {
for waiting {
select {
case event := <-WebSocketClient.EventChannel:
if event.Event != model.WEBSOCKET_EVENT_PREFERENCES_DELETED {
if event.EventType() != model.WEBSOCKET_EVENT_PREFERENCES_DELETED {
// Ignore any other events
continue
}
received, err := model.PreferencesFromJson(strings.NewReader(event.Data["preferences"].(string)))
received, err := model.PreferencesFromJson(strings.NewReader(event.GetData()["preferences"].(string)))
if err != nil {
t.Fatal(err)
}

Просмотреть файл

@@ -323,11 +323,11 @@ func TestCreateUserWebSocketEvent(t *testing.T) {
for {
select {
case ev := <-userWSClient.EventChannel:
if ev.Event == model.WEBSOCKET_EVENT_NEW_USER {
if ev.EventType() == model.WEBSOCKET_EVENT_NEW_USER {
userHasReceived = true
}
case ev := <-guestWSClient.EventChannel:
if ev.Event == model.WEBSOCKET_EVENT_NEW_USER {
if ev.EventType() == model.WEBSOCKET_EVENT_NEW_USER {
guestHasReceived = true
}
case <-time.After(2 * time.Second):
@@ -1675,7 +1675,7 @@ func assertExpectedWebsocketEvent(t *testing.T, client *model.WebSocketClient, e
select {
case resp, ok := <-client.EventChannel:
require.Truef(t, ok, "channel closed before receiving expected event %s", model.WEBSOCKET_EVENT_USER_UPDATED)
if resp.Event == model.WEBSOCKET_EVENT_USER_UPDATED {
if resp.EventType() == model.WEBSOCKET_EVENT_USER_UPDATED {
test(resp)
return
}
@@ -1687,7 +1687,7 @@ func assertExpectedWebsocketEvent(t *testing.T, client *model.WebSocketClient, e
func assertWebsocketEventUserUpdatedWithEmail(t *testing.T, client *model.WebSocketClient, email string) {
assertExpectedWebsocketEvent(t, client, model.WEBSOCKET_EVENT_USER_UPDATED, func(event *model.WebSocketEvent) {
eventUser, ok := event.Data["user"].(map[string]interface{})
eventUser, ok := event.GetData()["user"].(map[string]interface{})
require.True(t, ok, "expected user")
userEmail, ok := eventUser["email"].(string)
require.Truef(t, ok, "expected email %s, but got nil", email)

Просмотреть файл

@@ -115,7 +115,7 @@ func TestWebSocketEvent(t *testing.T) {
for {
select {
case resp := <-WebSocketClient.EventChannel:
if resp.Event == model.WEBSOCKET_EVENT_TYPING && resp.Data["user_id"].(string) == "somerandomid" {
if resp.EventType() == model.WEBSOCKET_EVENT_TYPING && resp.GetData()["user_id"].(string) == "somerandomid" {
eventHit = true
}
case <-stop:
@@ -140,7 +140,7 @@ func TestWebSocketEvent(t *testing.T) {
for {
select {
case resp := <-WebSocketClient.EventChannel:
if resp.Event == model.WEBSOCKET_EVENT_TYPING {
if resp.EventType() == model.WEBSOCKET_EVENT_TYPING {
eventHit = true
}
case <-stop:
@@ -180,7 +180,7 @@ func TestCreateDirectChannelWithSocket(t *testing.T) {
require.Equal(t, resp.Status, model.STATUS_OK, "should have responded OK to authentication challenge")
wsr := <-WebSocketClient.EventChannel
require.Equal(t, wsr.Event, model.WEBSOCKET_EVENT_HELLO, "missing hello")
require.Equal(t, wsr.EventType(), model.WEBSOCKET_EVENT_HELLO, "missing hello")
stop := make(chan bool)
count := 0
@@ -189,7 +189,7 @@ func TestCreateDirectChannelWithSocket(t *testing.T) {
for {
select {
case wsr := <-WebSocketClient.EventChannel:
if wsr != nil && wsr.Event == model.WEBSOCKET_EVENT_DIRECT_ADDED {
if wsr != nil && wsr.EventType() == model.WEBSOCKET_EVENT_DIRECT_ADDED {
count = count + 1
}
@@ -378,8 +378,8 @@ func TestWebSocketStatuses(t *testing.T) {
for {
select {
case resp := <-WebSocketClient.EventChannel:
if resp.Event == model.WEBSOCKET_EVENT_STATUS_CHANGE && resp.Data["user_id"].(string) == th.BasicUser.Id {
status := resp.Data["status"].(string)
if resp.EventType() == model.WEBSOCKET_EVENT_STATUS_CHANGE && resp.GetData()["user_id"].(string) == th.BasicUser.Id {
status := resp.GetData()["status"].(string)
if status == model.STATUS_ONLINE {
onlineHit = true
} else if status == model.STATUS_AWAY {