Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Convert the message handler to async/await #7884

Merged
merged 16 commits into from
Jul 22, 2020
1 change: 1 addition & 0 deletions changelog.d/7884.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Convert the message handler to async/await.
288 changes: 152 additions & 136 deletions synapse/handlers/message.py

Large diffs are not rendered by default.

36 changes: 21 additions & 15 deletions tests/events/test_snapshot.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,10 @@ def test_serialize_deserialize_msg(self):
serialize/deserialize.
"""

event, context = create_event(
self.hs, room_id=self.room_id, type="m.test", sender=self.user_id,
event, context = self.get_success(
create_event(
self.hs, room_id=self.room_id, type="m.test", sender=self.user_id,
)
)

self._check_serialize_deserialize(event, context)
Expand All @@ -51,12 +53,14 @@ def test_serialize_deserialize_state_no_prev(self):
"""Test that an EventContext for a state event (with not previous entry)
is the same after serialize/deserialize.
"""
event, context = create_event(
self.hs,
room_id=self.room_id,
type="m.test",
sender=self.user_id,
state_key="",
event, context = self.get_success(
create_event(
self.hs,
room_id=self.room_id,
type="m.test",
sender=self.user_id,
state_key="",
)
)

self._check_serialize_deserialize(event, context)
Expand All @@ -65,13 +69,15 @@ def test_serialize_deserialize_state_prev(self):
"""Test that an EventContext for a state event (which replaces a
previous entry) is the same after serialize/deserialize.
"""
event, context = create_event(
self.hs,
room_id=self.room_id,
type="m.room.member",
sender=self.user_id,
state_key=self.user_id,
content={"membership": "leave"},
event, context = self.get_success(
create_event(
self.hs,
room_id=self.room_id,
type="m.room.member",
sender=self.user_id,
state_key=self.user_id,
content={"membership": "leave"},
)
)

self._check_serialize_deserialize(event, context)
Expand Down
76 changes: 44 additions & 32 deletions tests/replication/tcp/streams/test_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,9 @@ def test_update_function_huge_state_change(self):
OTHER_USER = "@other_user:localhost"

# have the user join
inject_member_event(self.hs, self.room_id, OTHER_USER, Membership.JOIN)
self.get_success(
inject_member_event(self.hs, self.room_id, OTHER_USER, Membership.JOIN)
)

# Update existing power levels with mod at PL50
pls = self.helper.get_state(
Expand Down Expand Up @@ -157,14 +159,16 @@ def test_update_function_huge_state_change(self):
# roll back all the state by de-modding the user
prev_events = fork_point
pls["users"][OTHER_USER] = 0
pl_event = inject_event(
self.hs,
prev_event_ids=prev_events,
type=EventTypes.PowerLevels,
state_key="",
sender=self.user_id,
room_id=self.room_id,
content=pls,
pl_event = self.get_success(
inject_event(
self.hs,
prev_event_ids=prev_events,
type=EventTypes.PowerLevels,
state_key="",
sender=self.user_id,
room_id=self.room_id,
content=pls,
)
)

# one more bit of state that doesn't get rolled back
Expand Down Expand Up @@ -268,7 +272,9 @@ def test_update_function_state_row_limit(self):

# have the users join
for u in user_ids:
inject_member_event(self.hs, self.room_id, u, Membership.JOIN)
self.get_success(
inject_member_event(self.hs, self.room_id, u, Membership.JOIN)
)

# Update existing power levels with mod at PL50
pls = self.helper.get_state(
Expand Down Expand Up @@ -306,14 +312,16 @@ def test_update_function_state_row_limit(self):
pl_events = []
for u in user_ids:
pls["users"][u] = 0
e = inject_event(
self.hs,
prev_event_ids=prev_events,
type=EventTypes.PowerLevels,
state_key="",
sender=self.user_id,
room_id=self.room_id,
content=pls,
e = self.get_success(
inject_event(
self.hs,
prev_event_ids=prev_events,
type=EventTypes.PowerLevels,
state_key="",
sender=self.user_id,
room_id=self.room_id,
content=pls,
)
)
prev_events = [e.event_id]
pl_events.append(e)
Expand Down Expand Up @@ -434,13 +442,15 @@ def _inject_test_event(
body = "event %i" % (self.event_count,)
self.event_count += 1

return inject_event(
self.hs,
room_id=self.room_id,
sender=sender,
type="test_event",
content={"body": body},
**kwargs
return self.get_success(
inject_event(
self.hs,
room_id=self.room_id,
sender=sender,
type="test_event",
content={"body": body},
**kwargs
)
)

def _inject_state_event(
Expand All @@ -459,11 +469,13 @@ def _inject_state_event(
if body is None:
body = "state event %s" % (state_key,)

return inject_event(
self.hs,
room_id=self.room_id,
sender=sender,
type="test_state_event",
state_key=state_key,
content={"body": body},
return self.get_success(
inject_event(
self.hs,
room_id=self.room_id,
sender=sender,
type="test_state_event",
state_key=state_key,
content={"body": body},
)
)
56 changes: 32 additions & 24 deletions tests/storage/test_roommember.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,18 +118,22 @@ def test_count_known_servers_stat_counter_enabled(self):

def test_get_joined_users_from_context(self):
room = self.helper.create_room_as(self.u_alice, tok=self.t_alice)
bob_event = event_injection.inject_member_event(
self.hs, room, self.u_bob, Membership.JOIN
bob_event = self.get_success(
event_injection.inject_member_event(
self.hs, room, self.u_bob, Membership.JOIN
)
)

# first, create a regular event
event, context = event_injection.create_event(
self.hs,
room_id=room,
sender=self.u_alice,
prev_event_ids=[bob_event.event_id],
type="m.test.1",
content={},
event, context = self.get_success(
event_injection.create_event(
self.hs,
room_id=room,
sender=self.u_alice,
prev_event_ids=[bob_event.event_id],
type="m.test.1",
content={},
)
)

users = self.get_success(
Expand All @@ -140,22 +144,26 @@ def test_get_joined_users_from_context(self):
# Regression test for #7376: create a state event whose key matches bob's
# user_id, but which is *not* a membership event, and persist that; then check
# that `get_joined_users_from_context` returns the correct users for the next event.
non_member_event = event_injection.inject_event(
self.hs,
room_id=room,
sender=self.u_bob,
prev_event_ids=[bob_event.event_id],
type="m.test.2",
state_key=self.u_bob,
content={},
non_member_event = self.get_success(
event_injection.inject_event(
self.hs,
room_id=room,
sender=self.u_bob,
prev_event_ids=[bob_event.event_id],
type="m.test.2",
state_key=self.u_bob,
content={},
)
)
event, context = event_injection.create_event(
self.hs,
room_id=room,
sender=self.u_alice,
prev_event_ids=[non_member_event.event_id],
type="m.test.3",
content={},
event, context = self.get_success(
event_injection.create_event(
self.hs,
room_id=room,
sender=self.u_alice,
prev_event_ids=[non_member_event.event_id],
type="m.test.3",
content={},
)
)
users = self.get_success(
self.store.get_joined_users_from_context(event, context)
Expand Down
4 changes: 2 additions & 2 deletions tests/storage/test_state.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,8 @@ def inject_state_event(self, room, sender, typ, state_key, content):
},
)

event, context = yield self.event_creation_handler.create_new_client_event(
builder
event, context = yield defer.ensureDeferred(
self.event_creation_handler.create_new_client_event(builder)
)

yield self.storage.persistence.persist_event(event, context)
Expand Down
28 changes: 8 additions & 20 deletions tests/test_utils/event_injection.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,12 @@
from synapse.events.snapshot import EventContext
from synapse.types import Collection

from tests.test_utils import get_awaitable_result

"""
Utility functions for poking events into the storage of the server under test.
"""


def inject_member_event(
async def inject_member_event(
hs: synapse.server.HomeServer,
room_id: str,
sender: str,
Expand All @@ -46,7 +44,7 @@ def inject_member_event(
if extra_content:
content.update(extra_content)

return inject_event(
return await inject_event(
hs,
room_id=room_id,
type=EventTypes.Member,
Expand All @@ -57,7 +55,7 @@ def inject_member_event(
)


def inject_event(
async def inject_event(
hs: synapse.server.HomeServer,
room_version: Optional[str] = None,
prev_event_ids: Optional[Collection[str]] = None,
Expand All @@ -72,37 +70,27 @@ def inject_event(
prev_event_ids: prev_events for the event. If not specified, will be looked up
kwargs: fields for the event to be created
"""
test_reactor = hs.get_reactor()

event, context = create_event(hs, room_version, prev_event_ids, **kwargs)
event, context = await create_event(hs, room_version, prev_event_ids, **kwargs)

d = hs.get_storage().persistence.persist_event(event, context)
test_reactor.advance(0)
get_awaitable_result(d)
await hs.get_storage().persistence.persist_event(event, context)

return event


def create_event(
async def create_event(
hs: synapse.server.HomeServer,
room_version: Optional[str] = None,
prev_event_ids: Optional[Collection[str]] = None,
**kwargs
) -> Tuple[EventBase, EventContext]:
test_reactor = hs.get_reactor()

if room_version is None:
d = hs.get_datastore().get_room_version_id(kwargs["room_id"])
test_reactor.advance(0)
room_version = get_awaitable_result(d)
room_version = await hs.get_datastore().get_room_version_id(kwargs["room_id"])

builder = hs.get_event_builder_factory().for_room_version(
KNOWN_ROOM_VERSIONS[room_version], kwargs
)
d = hs.get_event_creation_handler().create_new_client_event(
event, context = await hs.get_event_creation_handler().create_new_client_event(
builder, prev_event_ids=prev_event_ids
)
test_reactor.advance(0)
event, context = get_awaitable_result(d)

return event, context
14 changes: 7 additions & 7 deletions tests/test_visibility.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def test_filtering(self):
#

# before we do that, we persist some other events to act as state.
self.inject_visibility("@admin:hs", "joined")
yield self.inject_visibility("@admin:hs", "joined")
anoadragon453 marked this conversation as resolved.
Show resolved Hide resolved
for i in range(0, 10):
yield self.inject_room_member("@resident%i:hs" % i)

Expand Down Expand Up @@ -137,8 +137,8 @@ def inject_visibility(self, user_id, visibility):
},
)

event, context = yield self.event_creation_handler.create_new_client_event(
builder
event, context = yield defer.ensureDeferred(
self.event_creation_handler.create_new_client_event(builder)
)
yield self.storage.persistence.persist_event(event, context)
return event
Expand All @@ -158,8 +158,8 @@ def inject_room_member(self, user_id, membership="join", extra_content={}):
},
)

event, context = yield self.event_creation_handler.create_new_client_event(
builder
event, context = yield defer.ensureDeferred(
self.event_creation_handler.create_new_client_event(builder)
)

yield self.storage.persistence.persist_event(event, context)
Expand All @@ -179,8 +179,8 @@ def inject_message(self, user_id, content=None):
},
)

event, context = yield self.event_creation_handler.create_new_client_event(
builder
event, context = yield defer.ensureDeferred(
self.event_creation_handler.create_new_client_event(builder)
)

yield self.storage.persistence.persist_event(event, context)
Expand Down
4 changes: 3 additions & 1 deletion tests/unittest.py
Original file line number Diff line number Diff line change
Expand Up @@ -603,7 +603,9 @@ def inject_room_member(self, room: str, user: str, membership: Membership) -> No
user: MXID of the user to inject the membership for.
membership: The membership type.
"""
event_injection.inject_member_event(self.hs, room, user, membership)
self.get_success(
event_injection.inject_member_event(self.hs, room, user, membership)
)


class FederatingHomeserverTestCase(HomeserverTestCase):
Expand Down
4 changes: 3 additions & 1 deletion tests/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -671,6 +671,8 @@ def create_room(hs, room_id, creator_id):
},
)

event, context = yield event_creation_handler.create_new_client_event(builder)
event, context = yield defer.ensureDeferred(
event_creation_handler.create_new_client_event(builder)
)

yield persistence_store.persist_event(event, context)