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

Add a linearizer on (appservice, stream) when handling ephemeral events. #11207

Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions tests/handlers/test_appservice.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ def setUp(self):
hs.get_application_service_scheduler.return_value = self.mock_scheduler
hs.get_clock.return_value = MockClock()
self.handler = ApplicationServicesHandler(hs)
self.event_source = hs.get_event_sources()

def test_notify_interested_services(self):
interested_service = self._mkservice(is_interested=True)
Expand Down Expand Up @@ -252,6 +253,38 @@ async def get_3pe_protocol(service, unusedProtocol):
},
)

def test_notify_interested_services_ephemeral(self):
interested_service = self._mkservice(is_interested=True)
services = [interested_service]

self.mock_store.get_app_services.return_value = services
self.mock_store.get_type_stream_id_for_appservice.return_value = make_awaitable(579)

event = Mock(event_id="event_1")
self.event_source.sources.receipt.get_new_events_as.return_value = make_awaitable(([event], None))

self.handler.notify_interested_services_ephemeral("receipt_key", 580)
self.mock_scheduler.submit_ephemeral_events_for_as.assert_called_once_with(
interested_service, [event]
)
self.mock_store.set_type_stream_id_for_appservice.assert_called_once_with(
interested_service, "read_receipt", 580,
)

def test_notify_interested_services_ephemeral_out_of_order(self):
interested_service = self._mkservice(is_interested=True)
services = [interested_service]

self.mock_store.get_app_services.return_value = services
self.mock_store.get_type_stream_id_for_appservice.return_value = make_awaitable(580)

event = Mock(event_id="event_1")
self.event_source.sources.receipt.get_new_events_as.return_value = make_awaitable(([event], None))

self.handler.notify_interested_services_ephemeral("receipt_key", 579)
self.mock_scheduler.submit_ephemeral_events_for_as.assert_not_called()
self.mock_store.set_type_stream_id_for_appservice.assert_not_called()

def _mkservice(self, is_interested, protocols=None):
service = Mock()
service.is_interested.return_value = make_awaitable(is_interested)
Expand Down