fix(server): limit implicit large group subscription meta
This commit is contained in:
@@ -2254,6 +2254,121 @@ func TestReplyGetDescInvalidOpts(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestReplyGetSubLimitsImplicitLargeGroupSubscriptionQuery(t *testing.T) {
|
||||
helper := TopicTestHelper{}
|
||||
helper.setUp(t, 2, types.TopicCatGrp, "grpLarge", true)
|
||||
defer helper.tearDown()
|
||||
|
||||
uid := helper.uids[0]
|
||||
helper.topic.subCnt = implicitGroupSubSelfOnlyThreshold
|
||||
helper.topic.perUser[uid] = perUserData{
|
||||
modeWant: types.ModeCReadOnly,
|
||||
modeGiven: types.ModeCReadOnly,
|
||||
}
|
||||
|
||||
helper.tt.EXPECT().
|
||||
GetUsers(types.TenantID(1), "grpLarge", gomock.AssignableToTypeOf(&types.QueryOpt{})).
|
||||
DoAndReturn(func(_ types.TenantID, _ string, opts *types.QueryOpt) ([]types.Subscription, error) {
|
||||
if opts == nil {
|
||||
t.Fatal("expected limited query options")
|
||||
}
|
||||
if opts.User != uid {
|
||||
t.Fatalf("expected query to be limited to %s, got %s", uid.UserId(), opts.User.UserId())
|
||||
}
|
||||
return []types.Subscription{{
|
||||
User: uid.String(),
|
||||
Topic: "grpLarge",
|
||||
ModeWant: types.ModeCReadOnly,
|
||||
ModeGiven: types.ModeCReadOnly,
|
||||
}}, nil
|
||||
})
|
||||
|
||||
msg := &ClientComMessage{
|
||||
Id: "sub1",
|
||||
Original: "grpLarge",
|
||||
AsUser: uid.UserId(),
|
||||
TenantID: 1,
|
||||
Sub: &MsgClientSub{Get: &MsgGetQuery{
|
||||
What: "sub",
|
||||
Sub: nil,
|
||||
}},
|
||||
}
|
||||
|
||||
if err := helper.topic.replyGetSub(helper.sessions[0], uid, auth.LevelAuth, false, msg); err != nil {
|
||||
t.Fatalf("replyGetSub failed: %v", err)
|
||||
}
|
||||
helper.finish()
|
||||
|
||||
if len(helper.results[0].messages) != 1 {
|
||||
t.Fatalf("expected one meta response, got %d", len(helper.results[0].messages))
|
||||
}
|
||||
resp := helper.results[0].messages[0].(*ServerComMessage)
|
||||
if resp.Meta == nil {
|
||||
t.Fatalf("expected meta response")
|
||||
}
|
||||
if len(resp.Meta.Sub) != 1 {
|
||||
t.Fatalf("expected one subscription, got %d", len(resp.Meta.Sub))
|
||||
}
|
||||
if got := resp.Meta.Sub[0].User; got != uid.UserId() {
|
||||
t.Fatalf("expected self subscription %s, got %s", uid.UserId(), got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestReplyGetSubKeepsExplicitLargeGroupQuery(t *testing.T) {
|
||||
helper := TopicTestHelper{}
|
||||
helper.setUp(t, 2, types.TopicCatGrp, "grpLarge", true)
|
||||
defer helper.tearDown()
|
||||
|
||||
uid := helper.uids[0]
|
||||
peer := helper.uids[1]
|
||||
helper.topic.subCnt = implicitGroupSubSelfOnlyThreshold
|
||||
helper.topic.perUser[uid] = perUserData{
|
||||
modeWant: types.ModeCReadOnly,
|
||||
modeGiven: types.ModeCReadOnly,
|
||||
}
|
||||
|
||||
helper.tt.EXPECT().
|
||||
GetUsers(types.TenantID(1), "grpLarge", gomock.Nil()).
|
||||
Return([]types.Subscription{
|
||||
{
|
||||
User: uid.String(),
|
||||
Topic: "grpLarge",
|
||||
ModeWant: types.ModeCReadOnly,
|
||||
ModeGiven: types.ModeCReadOnly,
|
||||
},
|
||||
{
|
||||
User: peer.String(),
|
||||
Topic: "grpLarge",
|
||||
ModeWant: types.ModeCReadOnly,
|
||||
ModeGiven: types.ModeCReadOnly,
|
||||
},
|
||||
}, nil)
|
||||
|
||||
msg := &ClientComMessage{
|
||||
Id: "get1",
|
||||
Original: "grpLarge",
|
||||
AsUser: uid.UserId(),
|
||||
TenantID: 1,
|
||||
Get: &MsgClientGet{MsgGetQuery: MsgGetQuery{What: "sub"}},
|
||||
}
|
||||
|
||||
if err := helper.topic.replyGetSub(helper.sessions[0], uid, auth.LevelAuth, false, msg); err != nil {
|
||||
t.Fatalf("replyGetSub failed: %v", err)
|
||||
}
|
||||
helper.finish()
|
||||
|
||||
if len(helper.results[0].messages) != 1 {
|
||||
t.Fatalf("expected one meta response, got %d", len(helper.results[0].messages))
|
||||
}
|
||||
resp := helper.results[0].messages[0].(*ServerComMessage)
|
||||
if resp.Meta == nil {
|
||||
t.Fatalf("expected meta response")
|
||||
}
|
||||
if len(resp.Meta.Sub) != 2 {
|
||||
t.Fatalf("expected explicit query to return all subscriptions, got %d", len(resp.Meta.Sub))
|
||||
}
|
||||
}
|
||||
|
||||
// Verifies ctrl codes in session outputs.
|
||||
func registerSessionVerifyOutputs(t *testing.T, sessionOutput *responses, expectedCtrlCodes []int) {
|
||||
t.Helper()
|
||||
|
||||
Reference in New Issue
Block a user