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

Fix bug where we resent "limit exceeded" server notices #3747

Merged
merged 2 commits into from
Aug 23, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
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
1 change: 1 addition & 0 deletions changelog.d/3747.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix bug where we resent "limit exceeded" server notices repeatedly
6 changes: 5 additions & 1 deletion synapse/server_notices/resource_limits_server_notices.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,10 @@ def maybe_send_server_notice_to_user(self, user_id):

room_id = yield self._server_notices_manager.get_notice_room_for_user(user_id)

if not room_id:
logger.warn("Failed to get server notices room")
return

yield self._check_and_set_tags(user_id, room_id)
currently_blocked, ref_events = yield self._is_room_currently_blocked(room_id)

Expand Down Expand Up @@ -176,7 +180,7 @@ def _is_room_currently_blocked(self, room_id):

referenced_events = []
if pinned_state_event is not None:
referenced_events = pinned_state_event.content.get('pinned')
referenced_events = list(pinned_state_event.content.get('pinned', []))

events = yield self._store.get_events(referenced_events)
for event_id, event in iteritems(events):
Expand Down
66 changes: 66 additions & 0 deletions tests/server_notices/test_resource_limits_server_notices.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,3 +144,69 @@ def test_maybe_send_server_notice_to_user_not_in_mau_cohort(self):
yield self._rlsn.maybe_send_server_notice_to_user(self.user_id)

self._send_notice.assert_not_called()


class TestResourceLimitsServerNoticesWithRealRooms(unittest.TestCase):
@defer.inlineCallbacks
def setUp(self):
self.hs = yield setup_test_homeserver(self.addCleanup)
self.store = self.hs.get_datastore()
self.server_notices_sender = self.hs.get_server_notices_sender()
self.server_notices_manager = self.hs.get_server_notices_manager()
self.event_source = self.hs.get_event_sources()

# relying on [1] is far from ideal, but the only case where
# ResourceLimitsServerNotices class needs to be isolated is this test,
# general code should never have a reason to do so ...
self._rlsn = self.server_notices_sender._server_notices[1]
if not isinstance(self._rlsn, ResourceLimitsServerNotices):
raise Exception("Failed to find reference to ResourceLimitsServerNotices")

self.hs.config.limit_usage_by_mau = True
self.hs.config.hs_disabled = False
self.hs.config.max_mau_value = 5
self.hs.config.server_notices_mxid = "@server:test"
self.hs.config.server_notices_mxid_display_name = None
self.hs.config.server_notices_mxid_avatar_url = None
self.hs.config.server_notices_room_name = "Test Server Notice Room"

self.user_id = "@user_id:test"

self.hs.config.admin_uri = "mailto:[email protected]"

@defer.inlineCallbacks
def test_server_notice_only_sent_once(self):
self.store.get_monthly_active_count = Mock(
return_value=1000,
)

self.store.user_last_seen_monthly_active = Mock(
return_value=1000,
)

# Call the function multiple times to ensure we only send the notice once
yield self._rlsn.maybe_send_server_notice_to_user(self.user_id)
yield self._rlsn.maybe_send_server_notice_to_user(self.user_id)
yield self._rlsn.maybe_send_server_notice_to_user(self.user_id)

# Now lets get the last load of messages in the service notice room and
# check that there is only one server notice
room_id = yield self.server_notices_manager.get_notice_room_for_user(
self.user_id,
)

token = yield self.event_source.get_current_token()
events, _ = yield self.store.get_recent_events_for_room(
room_id, limit=100, end_token=token.room_key,
)

count = 0
for event in events:
if event.type != EventTypes.Message:
continue
if event.content.get("msgtype") != ServerNoticeMsgType:
continue

count += 1

self.assertEqual(count, 1)