Fix racy TestReliableWebSocketSend (#19620)
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
2a59047d07
Коммит
d04b69c9cb
@@ -18,6 +18,7 @@ import (
|
|||||||
|
|
||||||
"github.com/mattermost/mattermost-server/v6/app/request"
|
"github.com/mattermost/mattermost-server/v6/app/request"
|
||||||
"github.com/mattermost/mattermost-server/v6/config"
|
"github.com/mattermost/mattermost-server/v6/config"
|
||||||
|
"github.com/mattermost/mattermost-server/v6/einterfaces"
|
||||||
"github.com/mattermost/mattermost-server/v6/model"
|
"github.com/mattermost/mattermost-server/v6/model"
|
||||||
"github.com/mattermost/mattermost-server/v6/plugin"
|
"github.com/mattermost/mattermost-server/v6/plugin"
|
||||||
"github.com/mattermost/mattermost-server/v6/shared/mlog"
|
"github.com/mattermost/mattermost-server/v6/shared/mlog"
|
||||||
@@ -46,7 +47,7 @@ type TestHelper struct {
|
|||||||
tempWorkspace string
|
tempWorkspace string
|
||||||
}
|
}
|
||||||
|
|
||||||
func setupTestHelper(dbStore store.Store, enterprise bool, includeCacheLayer bool, tb testing.TB) *TestHelper {
|
func setupTestHelper(dbStore store.Store, enterprise bool, includeCacheLayer bool, options []Option, tb testing.TB) *TestHelper {
|
||||||
tempWorkspace, err := ioutil.TempDir("", "apptest")
|
tempWorkspace, err := ioutil.TempDir("", "apptest")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
@@ -65,7 +66,6 @@ func setupTestHelper(dbStore store.Store, enterprise bool, includeCacheLayer boo
|
|||||||
|
|
||||||
buffer := &mlog.Buffer{}
|
buffer := &mlog.Buffer{}
|
||||||
|
|
||||||
var options []Option
|
|
||||||
options = append(options, ConfigStore(configStore))
|
options = append(options, ConfigStore(configStore))
|
||||||
if includeCacheLayer {
|
if includeCacheLayer {
|
||||||
// Adds the cache layer to the test store
|
// Adds the cache layer to the test store
|
||||||
@@ -156,7 +156,7 @@ func Setup(tb testing.TB) *TestHelper {
|
|||||||
dbStore.MarkSystemRanUnitTests()
|
dbStore.MarkSystemRanUnitTests()
|
||||||
mainHelper.PreloadMigrations()
|
mainHelper.PreloadMigrations()
|
||||||
|
|
||||||
return setupTestHelper(dbStore, false, true, tb)
|
return setupTestHelper(dbStore, false, true, nil, tb)
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetupWithoutPreloadMigrations(tb testing.TB) *TestHelper {
|
func SetupWithoutPreloadMigrations(tb testing.TB) *TestHelper {
|
||||||
@@ -167,12 +167,12 @@ func SetupWithoutPreloadMigrations(tb testing.TB) *TestHelper {
|
|||||||
dbStore.DropAllTables()
|
dbStore.DropAllTables()
|
||||||
dbStore.MarkSystemRanUnitTests()
|
dbStore.MarkSystemRanUnitTests()
|
||||||
|
|
||||||
return setupTestHelper(dbStore, false, true, tb)
|
return setupTestHelper(dbStore, false, true, nil, tb)
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetupWithStoreMock(tb testing.TB) *TestHelper {
|
func SetupWithStoreMock(tb testing.TB) *TestHelper {
|
||||||
mockStore := testlib.GetMockStoreForSetupFunctions()
|
mockStore := testlib.GetMockStoreForSetupFunctions()
|
||||||
th := setupTestHelper(mockStore, false, false, tb)
|
th := setupTestHelper(mockStore, false, false, nil, tb)
|
||||||
statusMock := mocks.StatusStore{}
|
statusMock := mocks.StatusStore{}
|
||||||
statusMock.On("UpdateExpiredDNDStatuses").Return([]*model.Status{}, nil)
|
statusMock.On("UpdateExpiredDNDStatuses").Return([]*model.Status{}, nil)
|
||||||
statusMock.On("Get", "user1").Return(&model.Status{UserId: "user1", Status: model.StatusOnline}, nil)
|
statusMock.On("Get", "user1").Return(&model.Status{UserId: "user1", Status: model.StatusOnline}, nil)
|
||||||
@@ -187,7 +187,7 @@ func SetupWithStoreMock(tb testing.TB) *TestHelper {
|
|||||||
|
|
||||||
func SetupEnterpriseWithStoreMock(tb testing.TB) *TestHelper {
|
func SetupEnterpriseWithStoreMock(tb testing.TB) *TestHelper {
|
||||||
mockStore := testlib.GetMockStoreForSetupFunctions()
|
mockStore := testlib.GetMockStoreForSetupFunctions()
|
||||||
th := setupTestHelper(mockStore, true, false, tb)
|
th := setupTestHelper(mockStore, true, false, nil, tb)
|
||||||
statusMock := mocks.StatusStore{}
|
statusMock := mocks.StatusStore{}
|
||||||
statusMock.On("UpdateExpiredDNDStatuses").Return([]*model.Status{}, nil)
|
statusMock.On("UpdateExpiredDNDStatuses").Return([]*model.Status{}, nil)
|
||||||
statusMock.On("Get", "user1").Return(&model.Status{UserId: "user1", Status: model.StatusOnline}, nil)
|
statusMock.On("Get", "user1").Return(&model.Status{UserId: "user1", Status: model.StatusOnline}, nil)
|
||||||
@@ -200,6 +200,18 @@ func SetupEnterpriseWithStoreMock(tb testing.TB) *TestHelper {
|
|||||||
return th
|
return th
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SetupWithClusterMock(tb testing.TB, cluster einterfaces.ClusterInterface) *TestHelper {
|
||||||
|
if testing.Short() {
|
||||||
|
tb.SkipNow()
|
||||||
|
}
|
||||||
|
dbStore := mainHelper.GetStore()
|
||||||
|
dbStore.DropAllTables()
|
||||||
|
dbStore.MarkSystemRanUnitTests()
|
||||||
|
mainHelper.PreloadMigrations()
|
||||||
|
|
||||||
|
return setupTestHelper(dbStore, true, true, []Option{setCluster(cluster)}, tb)
|
||||||
|
}
|
||||||
|
|
||||||
var initBasicOnce sync.Once
|
var initBasicOnce sync.Once
|
||||||
var userCache struct {
|
var userCache struct {
|
||||||
SystemAdminUser *model.User
|
SystemAdminUser *model.User
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import (
|
|||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
"github.com/mattermost/mattermost-server/v6/config"
|
"github.com/mattermost/mattermost-server/v6/config"
|
||||||
|
"github.com/mattermost/mattermost-server/v6/einterfaces"
|
||||||
"github.com/mattermost/mattermost-server/v6/model"
|
"github.com/mattermost/mattermost-server/v6/model"
|
||||||
"github.com/mattermost/mattermost-server/v6/shared/mlog"
|
"github.com/mattermost/mattermost-server/v6/shared/mlog"
|
||||||
"github.com/mattermost/mattermost-server/v6/store"
|
"github.com/mattermost/mattermost-server/v6/store"
|
||||||
@@ -111,3 +112,10 @@ func ServerConnector(ch *Channels) AppOption {
|
|||||||
a.ch = ch
|
a.ch = ch
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setCluster(cluster einterfaces.ClusterInterface) Option {
|
||||||
|
return func(s *Server) error {
|
||||||
|
s.Cluster = cluster
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -338,24 +338,37 @@ func TestHubConnIndexInactive(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestReliableWebSocketSend(t *testing.T) {
|
func TestReliableWebSocketSend(t *testing.T) {
|
||||||
th := Setup(t)
|
testCluster := &testlib.FakeClusterInterface{}
|
||||||
|
|
||||||
|
th := SetupWithClusterMock(t, testCluster)
|
||||||
defer th.TearDown()
|
defer th.TearDown()
|
||||||
|
|
||||||
testCluster := &testlib.FakeClusterInterface{}
|
ev := model.NewWebSocketEvent("test_unreliable_event", "", "", "", nil)
|
||||||
th.Server.Cluster = testCluster
|
|
||||||
|
|
||||||
ev := model.NewWebSocketEvent("test_reliable_event", "", "", "", nil)
|
|
||||||
ev = ev.SetBroadcast(&model.WebsocketBroadcast{})
|
ev = ev.SetBroadcast(&model.WebsocketBroadcast{})
|
||||||
th.App.Publish(ev)
|
th.App.Publish(ev)
|
||||||
ev = ev.SetBroadcast(&model.WebsocketBroadcast{
|
ev2 := model.NewWebSocketEvent("test_reliable_event", "", "", "", nil)
|
||||||
|
ev2 = ev2.SetBroadcast(&model.WebsocketBroadcast{
|
||||||
ReliableClusterSend: true,
|
ReliableClusterSend: true,
|
||||||
})
|
})
|
||||||
th.App.Publish(ev)
|
th.App.Publish(ev2)
|
||||||
|
|
||||||
messages := testCluster.GetMessages()
|
messages := testCluster.GetMessages()
|
||||||
require.Len(t, messages, 2)
|
|
||||||
require.Equal(t, model.ClusterSendBestEffort, messages[0].SendType)
|
evJSON, err := ev.ToJSON()
|
||||||
require.Equal(t, model.ClusterSendReliable, messages[1].SendType)
|
require.NoError(t, err)
|
||||||
|
ev2JSON, err := ev2.ToJSON()
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
require.Contains(t, messages, &model.ClusterMessage{
|
||||||
|
Event: model.ClusterEventPublish,
|
||||||
|
Data: evJSON,
|
||||||
|
SendType: model.ClusterSendBestEffort,
|
||||||
|
})
|
||||||
|
require.Contains(t, messages, &model.ClusterMessage{
|
||||||
|
Event: model.ClusterEventPublish,
|
||||||
|
Data: ev2JSON,
|
||||||
|
SendType: model.ClusterSendReliable,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHubIsRegistered(t *testing.T) {
|
func TestHubIsRegistered(t *testing.T) {
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user