Merge commit 'cca03dbec' into anoa/dinsic_release_1_21_x
* commit 'cca03dbec': fix typo s/fixes/fix/ Directly import json from the standard library. (#8259) Allow for make_awaitable's return value to be re-used. (#8261) Rename 'populate_stats_process_rooms_2' background job back to 'populate_stats_process_rooms' again (#8243)
This commit is contained in:
@@ -29,9 +29,9 @@ Bugfixes
|
||||
- Return a proper error code when the rooms of an invalid group are requested. ([\#8129](https://github.com/matrix-org/synapse/issues/8129))
|
||||
- Fix a bug which could cause a leaked postgres connection if synapse was set to daemonize. ([\#8131](https://github.com/matrix-org/synapse/issues/8131))
|
||||
- Clarify the error code if a user tries to register with a numeric ID. This bug was introduced in v1.15.0. ([\#8135](https://github.com/matrix-org/synapse/issues/8135))
|
||||
- Fixes a bug where appservices with ratelimiting disabled would still be ratelimited when joining rooms. This bug was introduced in v1.19.0. ([\#8139](https://github.com/matrix-org/synapse/issues/8139))
|
||||
- Fix a bug where appservices with ratelimiting disabled would still be ratelimited when joining rooms. This bug was introduced in v1.19.0. ([\#8139](https://github.com/matrix-org/synapse/issues/8139))
|
||||
- Fix logging in via OpenID Connect with a provider that uses integer user IDs. ([\#8190](https://github.com/matrix-org/synapse/issues/8190))
|
||||
- Fixes a longstanding bug where user directory updates could break when unexpected profile data was included in events. ([\#8223](https://github.com/matrix-org/synapse/issues/8223))
|
||||
- Fix a longstanding bug where user directory updates could break when unexpected profile data was included in events. ([\#8223](https://github.com/matrix-org/synapse/issues/8223))
|
||||
- Fix a longstanding bug where stats updates could break when unexpected profile data was included in events. ([\#8226](https://github.com/matrix-org/synapse/issues/8226))
|
||||
- Fix slow start times for large servers by removing a table scan of the `users` table from startup code. ([\#8271](https://github.com/matrix-org/synapse/issues/8271))
|
||||
|
||||
@@ -80,7 +80,7 @@ Internal Changes
|
||||
- Remove obsolete `order` field from federation send queues. ([\#8245](https://github.com/matrix-org/synapse/issues/8245))
|
||||
- Stop sub-classing from object. ([\#8249](https://github.com/matrix-org/synapse/issues/8249))
|
||||
- Add more logging to debug slow startup. ([\#8264](https://github.com/matrix-org/synapse/issues/8264))
|
||||
- Do not attempt to upgrade upgrade database schema on worker processes. ([\#8266](https://github.com/matrix-org/synapse/issues/8266), [\#8276](https://github.com/matrix-org/synapse/issues/8276))
|
||||
- Do not attempt to upgrade database schema on worker processes. ([\#8266](https://github.com/matrix-org/synapse/issues/8266), [\#8276](https://github.com/matrix-org/synapse/issues/8276))
|
||||
|
||||
|
||||
Synapse 1.19.1 (2020-08-27)
|
||||
|
||||
1
changelog.d/8243.misc
Normal file
1
changelog.d/8243.misc
Normal file
@@ -0,0 +1 @@
|
||||
Remove the 'populate_stats_process_rooms_2' background job and restore functionality to 'populate_stats_process_rooms'.
|
||||
1
changelog.d/8259.misc
Normal file
1
changelog.d/8259.misc
Normal file
@@ -0,0 +1 @@
|
||||
Switch to the JSON implementation from the standard library.
|
||||
1
changelog.d/8261.misc
Normal file
1
changelog.d/8261.misc
Normal file
@@ -0,0 +1 @@
|
||||
Simplify tests that mock asynchronous functions.
|
||||
@@ -15,10 +15,10 @@
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
import json
|
||||
from typing import List
|
||||
|
||||
import jsonschema
|
||||
from canonicaljson import json
|
||||
from jsonschema import FormatChecker
|
||||
|
||||
from synapse.api.constants import EventContentFields
|
||||
|
||||
@@ -14,13 +14,12 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
import argparse
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import sys
|
||||
import tempfile
|
||||
|
||||
from canonicaljson import json
|
||||
|
||||
from twisted.internet import defer, task
|
||||
|
||||
import synapse
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
/* Copyright 2020 The Matrix.org Foundation C.I.C.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
-- This delta file fixes a regression introduced by 58/12room_stats.sql, removing the hacky
|
||||
-- populate_stats_process_rooms_2 background job and restores the functionality under the
|
||||
-- original name.
|
||||
-- See https://github.com/matrix-org/synapse/issues/8238 for details
|
||||
|
||||
DELETE FROM background_updates WHERE update_name = 'populate_stats_process_rooms';
|
||||
UPDATE background_updates SET update_name = 'populate_stats_process_rooms'
|
||||
WHERE update_name = 'populate_stats_process_rooms_2';
|
||||
@@ -73,9 +73,6 @@ class StatsStore(StateDeltasStore):
|
||||
self.db_pool.updates.register_background_update_handler(
|
||||
"populate_stats_process_rooms", self._populate_stats_process_rooms
|
||||
)
|
||||
self.db_pool.updates.register_background_update_handler(
|
||||
"populate_stats_process_rooms_2", self._populate_stats_process_rooms_2
|
||||
)
|
||||
self.db_pool.updates.register_background_update_handler(
|
||||
"populate_stats_process_users", self._populate_stats_process_users
|
||||
)
|
||||
@@ -148,31 +145,10 @@ class StatsStore(StateDeltasStore):
|
||||
return len(users_to_work_on)
|
||||
|
||||
async def _populate_stats_process_rooms(self, progress, batch_size):
|
||||
"""
|
||||
This was a background update which regenerated statistics for rooms.
|
||||
|
||||
It has been replaced by StatsStore._populate_stats_process_rooms_2. This background
|
||||
job has been scheduled to run as part of Synapse v1.0.0, and again now. To ensure
|
||||
someone upgrading from <v1.0.0, this background task has been turned into a no-op
|
||||
so that the potentially expensive task is not run twice.
|
||||
|
||||
Further context: https://github.com/matrix-org/synapse/pull/7977
|
||||
"""
|
||||
await self.db_pool.updates._end_background_update(
|
||||
"populate_stats_process_rooms"
|
||||
)
|
||||
return 1
|
||||
|
||||
async def _populate_stats_process_rooms_2(self, progress, batch_size):
|
||||
"""
|
||||
This is a background update which regenerates statistics for rooms.
|
||||
|
||||
It replaces StatsStore._populate_stats_process_rooms. See its docstring for the
|
||||
reasoning.
|
||||
"""
|
||||
"""This is a background update which regenerates statistics for rooms."""
|
||||
if not self.stats_enabled:
|
||||
await self.db_pool.updates._end_background_update(
|
||||
"populate_stats_process_rooms_2"
|
||||
"populate_stats_process_rooms"
|
||||
)
|
||||
return 1
|
||||
|
||||
@@ -189,13 +165,13 @@ class StatsStore(StateDeltasStore):
|
||||
return [r for r, in txn]
|
||||
|
||||
rooms_to_work_on = await self.db_pool.runInteraction(
|
||||
"populate_stats_rooms_2_get_batch", _get_next_batch
|
||||
"populate_stats_rooms_get_batch", _get_next_batch
|
||||
)
|
||||
|
||||
# No more rooms -- complete the transaction.
|
||||
if not rooms_to_work_on:
|
||||
await self.db_pool.updates._end_background_update(
|
||||
"populate_stats_process_rooms_2"
|
||||
"populate_stats_process_rooms"
|
||||
)
|
||||
return 1
|
||||
|
||||
@@ -204,9 +180,9 @@ class StatsStore(StateDeltasStore):
|
||||
progress["last_room_id"] = room_id
|
||||
|
||||
await self.db_pool.runInteraction(
|
||||
"_populate_stats_process_rooms_2",
|
||||
"_populate_stats_process_rooms",
|
||||
self.db_pool.updates._background_update_progress_txn,
|
||||
"populate_stats_process_rooms_2",
|
||||
"populate_stats_process_rooms",
|
||||
progress,
|
||||
)
|
||||
|
||||
|
||||
@@ -13,11 +13,11 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
import json
|
||||
import logging
|
||||
import re
|
||||
|
||||
import attr
|
||||
from canonicaljson import json
|
||||
|
||||
from twisted.internet import defer, task
|
||||
|
||||
|
||||
@@ -13,7 +13,8 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
from canonicaljson import json
|
||||
import json
|
||||
|
||||
from frozendict import frozendict
|
||||
|
||||
|
||||
@@ -66,5 +67,5 @@ def _handle_frozendict(obj):
|
||||
# A JSONEncoder which is capable of encoding frozendicts without barfing.
|
||||
# Additionally reduce the whitespace produced by JSON encoding.
|
||||
frozendict_json_encoder = json.JSONEncoder(
|
||||
default=_handle_frozendict, separators=(",", ":"),
|
||||
allow_nan=False, separators=(",", ":"), default=_handle_frozendict,
|
||||
)
|
||||
|
||||
@@ -77,11 +77,9 @@ class RoomComplexityTests(unittest.FederatingHomeserverTestCase):
|
||||
fed_transport = self.hs.get_federation_transport_client()
|
||||
|
||||
# Mock out some things, because we don't want to test the whole join
|
||||
fed_transport.client.get_json = Mock(
|
||||
side_effect=lambda *args, **kwargs: make_awaitable({"v1": 9999})
|
||||
)
|
||||
fed_transport.client.get_json = Mock(return_value=make_awaitable({"v1": 9999}))
|
||||
handler.federation_handler.do_invite_join = Mock(
|
||||
side_effect=lambda *args, **kwargs: make_awaitable(("", 1))
|
||||
return_value=make_awaitable(("", 1))
|
||||
)
|
||||
|
||||
d = handler._remote_join(
|
||||
@@ -110,11 +108,9 @@ class RoomComplexityTests(unittest.FederatingHomeserverTestCase):
|
||||
fed_transport = self.hs.get_federation_transport_client()
|
||||
|
||||
# Mock out some things, because we don't want to test the whole join
|
||||
fed_transport.client.get_json = Mock(
|
||||
side_effect=lambda *args, **kwargs: make_awaitable({"v1": 9999})
|
||||
)
|
||||
fed_transport.client.get_json = Mock(return_value=make_awaitable({"v1": 9999}))
|
||||
handler.federation_handler.do_invite_join = Mock(
|
||||
side_effect=lambda *args, **kwargs: make_awaitable(("", 1))
|
||||
return_value=make_awaitable(("", 1))
|
||||
)
|
||||
|
||||
d = handler._remote_join(
|
||||
@@ -150,11 +146,9 @@ class RoomComplexityTests(unittest.FederatingHomeserverTestCase):
|
||||
fed_transport = self.hs.get_federation_transport_client()
|
||||
|
||||
# Mock out some things, because we don't want to test the whole join
|
||||
fed_transport.client.get_json = Mock(
|
||||
side_effect=lambda *args, **kwargs: make_awaitable(None)
|
||||
)
|
||||
fed_transport.client.get_json = Mock(return_value=make_awaitable(None))
|
||||
handler.federation_handler.do_invite_join = Mock(
|
||||
side_effect=lambda *args, **kwargs: make_awaitable(("", 1))
|
||||
return_value=make_awaitable(("", 1))
|
||||
)
|
||||
|
||||
# Artificially raise the complexity
|
||||
@@ -208,11 +202,9 @@ class RoomComplexityAdminTests(unittest.FederatingHomeserverTestCase):
|
||||
fed_transport = self.hs.get_federation_transport_client()
|
||||
|
||||
# Mock out some things, because we don't want to test the whole join
|
||||
fed_transport.client.get_json = Mock(
|
||||
side_effect=lambda *args, **kwargs: make_awaitable({"v1": 9999})
|
||||
)
|
||||
fed_transport.client.get_json = Mock(return_value=make_awaitable({"v1": 9999}))
|
||||
handler.federation_handler.do_invite_join = Mock(
|
||||
side_effect=lambda *args, **kwargs: make_awaitable(("", 1))
|
||||
return_value=make_awaitable(("", 1))
|
||||
)
|
||||
|
||||
d = handler._remote_join(
|
||||
@@ -240,11 +232,9 @@ class RoomComplexityAdminTests(unittest.FederatingHomeserverTestCase):
|
||||
fed_transport = self.hs.get_federation_transport_client()
|
||||
|
||||
# Mock out some things, because we don't want to test the whole join
|
||||
fed_transport.client.get_json = Mock(
|
||||
side_effect=lambda *args, **kwargs: make_awaitable({"v1": 9999})
|
||||
)
|
||||
fed_transport.client.get_json = Mock(return_value=make_awaitable({"v1": 9999}))
|
||||
handler.federation_handler.do_invite_join = Mock(
|
||||
side_effect=lambda *args, **kwargs: make_awaitable(("", 1))
|
||||
return_value=make_awaitable(("", 1))
|
||||
)
|
||||
|
||||
d = handler._remote_join(
|
||||
|
||||
@@ -34,7 +34,7 @@ class FederationSenderReceiptsTestCases(HomeserverTestCase):
|
||||
def make_homeserver(self, reactor, clock):
|
||||
mock_state_handler = Mock(spec=["get_current_hosts_in_room"])
|
||||
# Ensure a new Awaitable is created for each call.
|
||||
mock_state_handler.get_current_hosts_in_room.side_effect = lambda room_Id: make_awaitable(
|
||||
mock_state_handler.get_current_hosts_in_room.return_value = make_awaitable(
|
||||
["test", "host2"]
|
||||
)
|
||||
return self.setup_test_homeserver(
|
||||
|
||||
@@ -143,7 +143,7 @@ class AuthTestCase(unittest.TestCase):
|
||||
def test_mau_limits_exceeded_large(self):
|
||||
self.auth_blocking._limit_usage_by_mau = True
|
||||
self.hs.get_datastore().get_monthly_active_count = Mock(
|
||||
side_effect=lambda: make_awaitable(self.large_number_of_users)
|
||||
return_value=make_awaitable(self.large_number_of_users)
|
||||
)
|
||||
|
||||
with self.assertRaises(ResourceLimitError):
|
||||
@@ -154,7 +154,7 @@ class AuthTestCase(unittest.TestCase):
|
||||
)
|
||||
|
||||
self.hs.get_datastore().get_monthly_active_count = Mock(
|
||||
side_effect=lambda: make_awaitable(self.large_number_of_users)
|
||||
return_value=make_awaitable(self.large_number_of_users)
|
||||
)
|
||||
with self.assertRaises(ResourceLimitError):
|
||||
yield defer.ensureDeferred(
|
||||
@@ -169,7 +169,7 @@ class AuthTestCase(unittest.TestCase):
|
||||
|
||||
# If not in monthly active cohort
|
||||
self.hs.get_datastore().get_monthly_active_count = Mock(
|
||||
side_effect=lambda: make_awaitable(self.auth_blocking._max_mau_value)
|
||||
return_value=make_awaitable(self.auth_blocking._max_mau_value)
|
||||
)
|
||||
with self.assertRaises(ResourceLimitError):
|
||||
yield defer.ensureDeferred(
|
||||
@@ -179,7 +179,7 @@ class AuthTestCase(unittest.TestCase):
|
||||
)
|
||||
|
||||
self.hs.get_datastore().get_monthly_active_count = Mock(
|
||||
side_effect=lambda: make_awaitable(self.auth_blocking._max_mau_value)
|
||||
return_value=make_awaitable(self.auth_blocking._max_mau_value)
|
||||
)
|
||||
with self.assertRaises(ResourceLimitError):
|
||||
yield defer.ensureDeferred(
|
||||
@@ -189,10 +189,10 @@ class AuthTestCase(unittest.TestCase):
|
||||
)
|
||||
# If in monthly active cohort
|
||||
self.hs.get_datastore().user_last_seen_monthly_active = Mock(
|
||||
side_effect=lambda user_id: make_awaitable(self.hs.get_clock().time_msec())
|
||||
return_value=make_awaitable(self.hs.get_clock().time_msec())
|
||||
)
|
||||
self.hs.get_datastore().get_monthly_active_count = Mock(
|
||||
side_effect=lambda: make_awaitable(self.auth_blocking._max_mau_value)
|
||||
return_value=make_awaitable(self.auth_blocking._max_mau_value)
|
||||
)
|
||||
yield defer.ensureDeferred(
|
||||
self.auth_handler.get_access_token_for_user_id(
|
||||
@@ -200,10 +200,10 @@ class AuthTestCase(unittest.TestCase):
|
||||
)
|
||||
)
|
||||
self.hs.get_datastore().user_last_seen_monthly_active = Mock(
|
||||
side_effect=lambda user_id: make_awaitable(self.hs.get_clock().time_msec())
|
||||
return_value=make_awaitable(self.hs.get_clock().time_msec())
|
||||
)
|
||||
self.hs.get_datastore().get_monthly_active_count = Mock(
|
||||
side_effect=lambda: make_awaitable(self.auth_blocking._max_mau_value)
|
||||
return_value=make_awaitable(self.auth_blocking._max_mau_value)
|
||||
)
|
||||
yield defer.ensureDeferred(
|
||||
self.auth_handler.validate_short_term_login_token_and_get_user_id(
|
||||
@@ -216,7 +216,7 @@ class AuthTestCase(unittest.TestCase):
|
||||
self.auth_blocking._limit_usage_by_mau = True
|
||||
|
||||
self.hs.get_datastore().get_monthly_active_count = Mock(
|
||||
side_effect=lambda: make_awaitable(self.small_number_of_users)
|
||||
return_value=make_awaitable(self.small_number_of_users)
|
||||
)
|
||||
# Ensure does not raise exception
|
||||
yield defer.ensureDeferred(
|
||||
@@ -226,7 +226,7 @@ class AuthTestCase(unittest.TestCase):
|
||||
)
|
||||
|
||||
self.hs.get_datastore().get_monthly_active_count = Mock(
|
||||
side_effect=lambda: make_awaitable(self.small_number_of_users)
|
||||
return_value=make_awaitable(self.small_number_of_users)
|
||||
)
|
||||
yield defer.ensureDeferred(
|
||||
self.auth_handler.validate_short_term_login_token_and_get_user_id(
|
||||
|
||||
@@ -110,7 +110,7 @@ class RegistrationTestCase(unittest.HomeserverTestCase):
|
||||
def test_get_or_create_user_mau_not_blocked(self):
|
||||
self.hs.config.limit_usage_by_mau = True
|
||||
self.store.count_monthly_users = Mock(
|
||||
side_effect=lambda: make_awaitable(self.hs.config.max_mau_value - 1)
|
||||
return_value=make_awaitable(self.hs.config.max_mau_value - 1)
|
||||
)
|
||||
# Ensure does not throw exception
|
||||
self.get_success(self.get_or_create_user(self.requester, "c", "User"))
|
||||
@@ -118,7 +118,7 @@ class RegistrationTestCase(unittest.HomeserverTestCase):
|
||||
def test_get_or_create_user_mau_blocked(self):
|
||||
self.hs.config.limit_usage_by_mau = True
|
||||
self.store.get_monthly_active_count = Mock(
|
||||
side_effect=lambda: make_awaitable(self.lots_of_users)
|
||||
return_value=make_awaitable(self.lots_of_users)
|
||||
)
|
||||
self.get_failure(
|
||||
self.get_or_create_user(self.requester, "b", "display_name"),
|
||||
@@ -126,7 +126,7 @@ class RegistrationTestCase(unittest.HomeserverTestCase):
|
||||
)
|
||||
|
||||
self.store.get_monthly_active_count = Mock(
|
||||
side_effect=lambda: make_awaitable(self.hs.config.max_mau_value)
|
||||
return_value=make_awaitable(self.hs.config.max_mau_value)
|
||||
)
|
||||
self.get_failure(
|
||||
self.get_or_create_user(self.requester, "b", "display_name"),
|
||||
@@ -136,14 +136,14 @@ class RegistrationTestCase(unittest.HomeserverTestCase):
|
||||
def test_register_mau_blocked(self):
|
||||
self.hs.config.limit_usage_by_mau = True
|
||||
self.store.get_monthly_active_count = Mock(
|
||||
side_effect=lambda: make_awaitable(self.lots_of_users)
|
||||
return_value=make_awaitable(self.lots_of_users)
|
||||
)
|
||||
self.get_failure(
|
||||
self.handler.register_user(localpart="local_part"), ResourceLimitError
|
||||
)
|
||||
|
||||
self.store.get_monthly_active_count = Mock(
|
||||
side_effect=lambda: make_awaitable(self.hs.config.max_mau_value)
|
||||
return_value=make_awaitable(self.hs.config.max_mau_value)
|
||||
)
|
||||
self.get_failure(
|
||||
self.handler.register_user(localpart="local_part"), ResourceLimitError
|
||||
|
||||
@@ -60,7 +60,7 @@ class StatsRoomTests(unittest.HomeserverTestCase):
|
||||
self.store.db_pool.simple_insert(
|
||||
"background_updates",
|
||||
{
|
||||
"update_name": "populate_stats_process_rooms_2",
|
||||
"update_name": "populate_stats_process_rooms",
|
||||
"progress_json": "{}",
|
||||
"depends_on": "populate_stats_prepare",
|
||||
},
|
||||
@@ -72,7 +72,7 @@ class StatsRoomTests(unittest.HomeserverTestCase):
|
||||
{
|
||||
"update_name": "populate_stats_process_users",
|
||||
"progress_json": "{}",
|
||||
"depends_on": "populate_stats_process_rooms_2",
|
||||
"depends_on": "populate_stats_process_rooms",
|
||||
},
|
||||
)
|
||||
)
|
||||
@@ -225,10 +225,7 @@ class StatsRoomTests(unittest.HomeserverTestCase):
|
||||
self.get_success(
|
||||
self.store.db_pool.simple_insert(
|
||||
"background_updates",
|
||||
{
|
||||
"update_name": "populate_stats_process_rooms_2",
|
||||
"progress_json": "{}",
|
||||
},
|
||||
{"update_name": "populate_stats_process_rooms", "progress_json": "{}"},
|
||||
)
|
||||
)
|
||||
self.get_success(
|
||||
@@ -237,7 +234,7 @@ class StatsRoomTests(unittest.HomeserverTestCase):
|
||||
{
|
||||
"update_name": "populate_stats_cleanup",
|
||||
"progress_json": "{}",
|
||||
"depends_on": "populate_stats_process_rooms_2",
|
||||
"depends_on": "populate_stats_process_rooms",
|
||||
},
|
||||
)
|
||||
)
|
||||
@@ -734,7 +731,7 @@ class StatsRoomTests(unittest.HomeserverTestCase):
|
||||
self.store.db_pool.simple_insert(
|
||||
"background_updates",
|
||||
{
|
||||
"update_name": "populate_stats_process_rooms_2",
|
||||
"update_name": "populate_stats_process_rooms",
|
||||
"progress_json": "{}",
|
||||
"depends_on": "populate_stats_prepare",
|
||||
},
|
||||
@@ -746,7 +743,7 @@ class StatsRoomTests(unittest.HomeserverTestCase):
|
||||
{
|
||||
"update_name": "populate_stats_process_users",
|
||||
"progress_json": "{}",
|
||||
"depends_on": "populate_stats_process_rooms_2",
|
||||
"depends_on": "populate_stats_process_rooms",
|
||||
},
|
||||
)
|
||||
)
|
||||
|
||||
@@ -116,7 +116,7 @@ class TypingNotificationsTestCase(unittest.HomeserverTestCase):
|
||||
retry_timings_res
|
||||
)
|
||||
|
||||
self.datastore.get_device_updates_by_remote.side_effect = lambda destination, from_stream_id, limit: make_awaitable(
|
||||
self.datastore.get_device_updates_by_remote.return_value = make_awaitable(
|
||||
(0, [])
|
||||
)
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ class FederationSenderTestCase(BaseMultiWorkerStreamTestCase):
|
||||
new event.
|
||||
"""
|
||||
mock_client = Mock(spec=["put_json"])
|
||||
mock_client.put_json.side_effect = lambda *_, **__: make_awaitable({})
|
||||
mock_client.put_json.return_value = make_awaitable({})
|
||||
|
||||
self.make_worker_hs(
|
||||
"synapse.app.federation_sender",
|
||||
@@ -73,7 +73,7 @@ class FederationSenderTestCase(BaseMultiWorkerStreamTestCase):
|
||||
new events.
|
||||
"""
|
||||
mock_client1 = Mock(spec=["put_json"])
|
||||
mock_client1.put_json.side_effect = lambda *_, **__: make_awaitable({})
|
||||
mock_client1.put_json.return_value = make_awaitable({})
|
||||
self.make_worker_hs(
|
||||
"synapse.app.federation_sender",
|
||||
{
|
||||
@@ -85,7 +85,7 @@ class FederationSenderTestCase(BaseMultiWorkerStreamTestCase):
|
||||
)
|
||||
|
||||
mock_client2 = Mock(spec=["put_json"])
|
||||
mock_client2.put_json.side_effect = lambda *_, **__: make_awaitable({})
|
||||
mock_client2.put_json.return_value = make_awaitable({})
|
||||
self.make_worker_hs(
|
||||
"synapse.app.federation_sender",
|
||||
{
|
||||
@@ -136,7 +136,7 @@ class FederationSenderTestCase(BaseMultiWorkerStreamTestCase):
|
||||
new typing EDUs.
|
||||
"""
|
||||
mock_client1 = Mock(spec=["put_json"])
|
||||
mock_client1.put_json.side_effect = lambda *_, **__: make_awaitable({})
|
||||
mock_client1.put_json.return_value = make_awaitable({})
|
||||
self.make_worker_hs(
|
||||
"synapse.app.federation_sender",
|
||||
{
|
||||
@@ -148,7 +148,7 @@ class FederationSenderTestCase(BaseMultiWorkerStreamTestCase):
|
||||
)
|
||||
|
||||
mock_client2 = Mock(spec=["put_json"])
|
||||
mock_client2.put_json.side_effect = lambda *_, **__: make_awaitable({})
|
||||
mock_client2.put_json.return_value = make_awaitable({})
|
||||
self.make_worker_hs(
|
||||
"synapse.app.federation_sender",
|
||||
{
|
||||
|
||||
@@ -337,7 +337,7 @@ class UserRegisterTestCase(unittest.HomeserverTestCase):
|
||||
|
||||
# Set monthly active users to the limit
|
||||
store.get_monthly_active_count = Mock(
|
||||
side_effect=lambda: make_awaitable(self.hs.config.max_mau_value)
|
||||
return_value=make_awaitable(self.hs.config.max_mau_value)
|
||||
)
|
||||
# Check that the blocking of monthly active users is working as expected
|
||||
# The registration of a new user fails due to the limit
|
||||
@@ -591,7 +591,7 @@ class UserRestTestCase(unittest.HomeserverTestCase):
|
||||
|
||||
# Set monthly active users to the limit
|
||||
self.store.get_monthly_active_count = Mock(
|
||||
side_effect=lambda: make_awaitable(self.hs.config.max_mau_value)
|
||||
return_value=make_awaitable(self.hs.config.max_mau_value)
|
||||
)
|
||||
# Check that the blocking of monthly active users is working as expected
|
||||
# The registration of a new user fails due to the limit
|
||||
@@ -631,7 +631,7 @@ class UserRestTestCase(unittest.HomeserverTestCase):
|
||||
|
||||
# Set monthly active users to the limit
|
||||
self.store.get_monthly_active_count = Mock(
|
||||
side_effect=lambda: make_awaitable(self.hs.config.max_mau_value)
|
||||
return_value=make_awaitable(self.hs.config.max_mau_value)
|
||||
)
|
||||
# Check that the blocking of monthly active users is working as expected
|
||||
# The registration of a new user fails due to the limit
|
||||
|
||||
@@ -67,7 +67,7 @@ class TestResourceLimitsServerNotices(unittest.HomeserverTestCase):
|
||||
raise Exception("Failed to find reference to ResourceLimitsServerNotices")
|
||||
|
||||
self._rlsn._store.user_last_seen_monthly_active = Mock(
|
||||
side_effect=lambda user_id: make_awaitable(1000)
|
||||
return_value=make_awaitable(1000)
|
||||
)
|
||||
self._rlsn._server_notices_manager.send_notice = Mock(
|
||||
return_value=defer.succeed(Mock())
|
||||
@@ -80,9 +80,7 @@ class TestResourceLimitsServerNotices(unittest.HomeserverTestCase):
|
||||
return_value=defer.succeed("!something:localhost")
|
||||
)
|
||||
self._rlsn._store.add_tag_to_room = Mock(return_value=defer.succeed(None))
|
||||
self._rlsn._store.get_tags_for_room = Mock(
|
||||
side_effect=lambda user_id, room_id: make_awaitable({})
|
||||
)
|
||||
self._rlsn._store.get_tags_for_room = Mock(return_value=make_awaitable({}))
|
||||
|
||||
@override_config({"hs_disabled": True})
|
||||
def test_maybe_send_server_notice_disabled_hs(self):
|
||||
@@ -158,7 +156,7 @@ class TestResourceLimitsServerNotices(unittest.HomeserverTestCase):
|
||||
"""
|
||||
self._rlsn._auth.check_auth_blocking = Mock(return_value=defer.succeed(None))
|
||||
self._rlsn._store.user_last_seen_monthly_active = Mock(
|
||||
side_effect=lambda user_id: make_awaitable(None)
|
||||
return_value=make_awaitable(None)
|
||||
)
|
||||
self.get_success(self._rlsn.maybe_send_server_notice_to_user(self.user_id))
|
||||
|
||||
@@ -261,12 +259,10 @@ class TestResourceLimitsServerNoticesWithRealRooms(unittest.HomeserverTestCase):
|
||||
self.user_id = "@user_id:test"
|
||||
|
||||
def test_server_notice_only_sent_once(self):
|
||||
self.store.get_monthly_active_count = Mock(
|
||||
side_effect=lambda: make_awaitable(1000)
|
||||
)
|
||||
self.store.get_monthly_active_count = Mock(return_value=make_awaitable(1000))
|
||||
|
||||
self.store.user_last_seen_monthly_active = Mock(
|
||||
side_effect=lambda user_id: make_awaitable(1000)
|
||||
return_value=make_awaitable(1000)
|
||||
)
|
||||
|
||||
# Call the function multiple times to ensure we only send the notice once
|
||||
|
||||
@@ -154,7 +154,7 @@ class ClientIpStoreTestCase(unittest.HomeserverTestCase):
|
||||
user_id = "@user:server"
|
||||
|
||||
self.store.get_monthly_active_count = Mock(
|
||||
side_effect=lambda: make_awaitable(lots_of_users)
|
||||
return_value=make_awaitable(lots_of_users)
|
||||
)
|
||||
self.get_success(
|
||||
self.store.insert_client_ip(
|
||||
|
||||
@@ -231,9 +231,7 @@ class MonthlyActiveUsersTestCase(unittest.HomeserverTestCase):
|
||||
)
|
||||
self.get_success(d)
|
||||
|
||||
self.store.upsert_monthly_active_user = Mock(
|
||||
side_effect=lambda user_id: make_awaitable(None)
|
||||
)
|
||||
self.store.upsert_monthly_active_user = Mock(return_value=make_awaitable(None))
|
||||
|
||||
d = self.store.populate_monthly_active_users(user_id)
|
||||
self.get_success(d)
|
||||
@@ -241,9 +239,7 @@ class MonthlyActiveUsersTestCase(unittest.HomeserverTestCase):
|
||||
self.store.upsert_monthly_active_user.assert_not_called()
|
||||
|
||||
def test_populate_monthly_users_should_update(self):
|
||||
self.store.upsert_monthly_active_user = Mock(
|
||||
side_effect=lambda user_id: make_awaitable(None)
|
||||
)
|
||||
self.store.upsert_monthly_active_user = Mock(return_value=make_awaitable(None))
|
||||
|
||||
self.store.is_trial_user = Mock(return_value=defer.succeed(False))
|
||||
|
||||
@@ -256,9 +252,7 @@ class MonthlyActiveUsersTestCase(unittest.HomeserverTestCase):
|
||||
self.store.upsert_monthly_active_user.assert_called_once()
|
||||
|
||||
def test_populate_monthly_users_should_not_update(self):
|
||||
self.store.upsert_monthly_active_user = Mock(
|
||||
side_effect=lambda user_id: make_awaitable(None)
|
||||
)
|
||||
self.store.upsert_monthly_active_user = Mock(return_value=make_awaitable(None))
|
||||
|
||||
self.store.is_trial_user = Mock(return_value=defer.succeed(False))
|
||||
self.store.user_last_seen_monthly_active = Mock(
|
||||
@@ -344,9 +338,7 @@ class MonthlyActiveUsersTestCase(unittest.HomeserverTestCase):
|
||||
|
||||
@override_config({"limit_usage_by_mau": False, "mau_stats_only": False})
|
||||
def test_no_users_when_not_tracking(self):
|
||||
self.store.upsert_monthly_active_user = Mock(
|
||||
side_effect=lambda user_id: make_awaitable(None)
|
||||
)
|
||||
self.store.upsert_monthly_active_user = Mock(return_value=make_awaitable(None))
|
||||
|
||||
self.get_success(self.store.populate_monthly_active_users("@user:sever"))
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
"""
|
||||
Utilities for running the unit tests
|
||||
"""
|
||||
from asyncio import Future
|
||||
from typing import Any, Awaitable, TypeVar
|
||||
|
||||
TV = TypeVar("TV")
|
||||
@@ -38,6 +39,12 @@ def get_awaitable_result(awaitable: Awaitable[TV]) -> TV:
|
||||
raise Exception("awaitable has not yet completed")
|
||||
|
||||
|
||||
async def make_awaitable(result: Any):
|
||||
"""Create an awaitable that just returns a result."""
|
||||
return result
|
||||
def make_awaitable(result: Any) -> Awaitable[Any]:
|
||||
"""
|
||||
Makes an awaitable, suitable for mocking an `async` function.
|
||||
This uses Futures as they can be awaited multiple times so can be returned
|
||||
to multiple callers.
|
||||
"""
|
||||
future = Future() # type: ignore
|
||||
future.set_result(result)
|
||||
return future
|
||||
|
||||
Reference in New Issue
Block a user