Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

More tests for leaves during a partial state resync #617

Merged
merged 13 commits into from
Feb 28, 2023
57 changes: 55 additions & 2 deletions tests/federation_room_join_partial_state_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3719,8 +3719,61 @@ func TestPartialStateJoin(t *testing.T) {
// Cleanup.
psjResult.FinishStateRequest()
})
// TODO: tests which assert that:
// - Join + remote ban works, then cannot rejoin
DMRobertson marked this conversation as resolved.
Show resolved Hide resolved

t.Run("can be triggered by remote ban", func(t *testing.T) {
alice := deployment.RegisterUser(t, "hs1", "t51alice", "secret", false)
handleTransactions := federation.HandleTransactionRequests(
// Accept all PDUs and EDUs
func(e *gomatrixserverlib.Event) {},
func(e gomatrixserverlib.EDU) {},
)
server := createTestServer(t, deployment, handleTransactions)
cancel := server.Listen()
defer cancel()

serverRoom := createTestRoom(t, server, alice.GetDefaultRoomVersion(t))
t.Log("Alice partial-joins her room")
psjResult := beginPartialStateJoin(t, server, serverRoom, alice)
// Alice is not joined to the room at the end of the test, so we do not
// `defer psjResult.Destroy(t)`.

t.Log("Alice waits to see her join")
aliceNextBatch := alice.MustSyncUntil(
t,
client.SyncReq{Filter: buildLazyLoadingSyncFilter(nil)},
client.SyncJoinedTo(alice.UserID, serverRoom.RoomID),
)

t.Log("A resident server user bans Alice from the room.")
kickEvent := server.MustCreateEvent(t, serverRoom, b.Event{
DMRobertson marked this conversation as resolved.
Show resolved Hide resolved
Type: "m.room.member",
StateKey: b.Ptr(alice.UserID),
Sender: server.UserID("charlie"),
Content: map[string]interface{}{"membership": "ban"},
AuthEvents: serverRoom.EventIDsOrReferences([]*gomatrixserverlib.Event{
serverRoom.CurrentState("m.room.create", ""),
serverRoom.CurrentState("m.room.power_levels", ""),
serverRoom.CurrentState("m.room.member", alice.UserID),
serverRoom.CurrentState("m.room.member", server.UserID("charlie")),
}),
})
serverRoom.AddEvent(kickEvent)
server.MustSendTransaction(t, deployment, "hs1", []json.RawMessage{kickEvent.JSON()}, nil)

// The kick occurs mid-resync, because we have not yet called
// psjResult.FinishStateRequest().
t.Log("Alice sees that she's been banned")
aliceNextBatch = alice.MustSyncUntil(
t,
client.SyncReq{Since: aliceNextBatch, Filter: buildLazyLoadingSyncFilter(nil)},
// TODO: introduce a SyncBannedFrom which checks the membership of the
// leave event
client.SyncLeftFrom(alice.UserID, serverRoom.RoomID),
)

// Cleanup.
psjResult.FinishStateRequest()
})
})

t.Run("Room stats are correctly updated once state re-sync completes", func(t *testing.T) {
Expand Down