Skip to content

Commit 5adb08f

Browse files
Remove MockClock() (#18992)
Spawning from adding some logcontext debug logs in #18966 and since we're not logging at the `set_current_context(...)` level (see reasoning there), this removes some usage of `set_current_context(...)`. Specifically, `MockClock.call_later(...)` doesn't handle logcontexts correctly. It uses the calling logcontext as the callback context (wrong, as the logcontext could finish before the callback finishes) and it didn't reset back to the sentinel context before handing back to the reactor. It was like this since it was [introduced 10+ years ago](38da988). Instead of fixing the implementation which would just be a copy of our normal `Clock`, we can just remove `MockClock`
1 parent ad8dcc2 commit 5adb08f

20 files changed

Lines changed: 139 additions & 289 deletions

changelog.d/18992.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Remove `MockClock()` in tests.

synapse/app/phone_stats_home.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,17 @@
3333
run_as_background_process,
3434
)
3535
from synapse.types import JsonDict
36-
from synapse.util.constants import ONE_HOUR_SECONDS, ONE_MINUTE_SECONDS
36+
from synapse.util.constants import (
37+
MILLISECONDS_PER_SECOND,
38+
ONE_HOUR_SECONDS,
39+
ONE_MINUTE_SECONDS,
40+
)
3741

3842
if TYPE_CHECKING:
3943
from synapse.server import HomeServer
4044

4145
logger = logging.getLogger("synapse.app.homeserver")
4246

43-
MILLISECONDS_PER_SECOND = 1000
44-
4547
INITIAL_DELAY_BEFORE_FIRST_PHONE_HOME_SECONDS = 5 * ONE_MINUTE_SECONDS
4648
"""
4749
We wait 5 minutes to send the first set of stats as the server can be quite busy the

synapse/util/constants.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,5 @@
1818
# readability and catching bugs.
1919
ONE_MINUTE_SECONDS = 60
2020
ONE_HOUR_SECONDS = 60 * ONE_MINUTE_SECONDS
21+
22+
MILLISECONDS_PER_SECOND = 1000

tests/appservice/test_scheduler.py

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
# [This file includes modifications made by New Vector Limited]
1919
#
2020
#
21-
from typing import List, Optional, Sequence, Tuple, cast
21+
from typing import List, Optional, Sequence, Tuple
2222
from unittest.mock import AsyncMock, Mock
2323

2424
from typing_extensions import TypeAlias
@@ -44,13 +44,12 @@
4444
from synapse.util.clock import Clock
4545

4646
from tests import unittest
47-
48-
from ..utils import MockClock
47+
from tests.server import get_clock
4948

5049

5150
class ApplicationServiceSchedulerTransactionCtrlTestCase(unittest.TestCase):
5251
def setUp(self) -> None:
53-
self.clock = MockClock()
52+
self.reactor, self.clock = get_clock()
5453
self.store = Mock()
5554
self.as_api = Mock()
5655

@@ -170,14 +169,14 @@ def test_single_service_up_txn_not_sent(self) -> None:
170169

171170
class ApplicationServiceSchedulerRecovererTestCase(unittest.TestCase):
172171
def setUp(self) -> None:
173-
self.clock = MockClock()
172+
self.reactor, self.clock = get_clock()
174173
self.as_api = Mock()
175174
self.store = Mock()
176175
self.service = Mock()
177176
self.callback = AsyncMock()
178177
self.recoverer = _Recoverer(
179178
server_name="test_server",
180-
clock=cast(Clock, self.clock),
179+
clock=self.clock,
181180
as_api=self.as_api,
182181
store=self.store,
183182
service=self.service,
@@ -202,7 +201,7 @@ def take_txn(
202201
txn.send = AsyncMock(return_value=True)
203202
txn.complete = AsyncMock(return_value=None)
204203
# wait for exp backoff
205-
self.clock.advance_time(2)
204+
self.reactor.advance(2)
206205
self.assertEqual(1, txn.send.call_count)
207206
self.assertEqual(1, txn.complete.call_count)
208207
# 2 because it needs to get None to know there are no more txns
@@ -229,21 +228,21 @@ def take_txn(
229228
self.assertEqual(0, self.store.get_oldest_unsent_txn.call_count)
230229
txn.send = AsyncMock(return_value=False)
231230
txn.complete = AsyncMock(return_value=None)
232-
self.clock.advance_time(2)
231+
self.reactor.advance(2)
233232
self.assertEqual(1, txn.send.call_count)
234233
self.assertEqual(0, txn.complete.call_count)
235234
self.assertEqual(0, self.callback.call_count)
236-
self.clock.advance_time(4)
235+
self.reactor.advance(4)
237236
self.assertEqual(2, txn.send.call_count)
238237
self.assertEqual(0, txn.complete.call_count)
239238
self.assertEqual(0, self.callback.call_count)
240-
self.clock.advance_time(8)
239+
self.reactor.advance(8)
241240
self.assertEqual(3, txn.send.call_count)
242241
self.assertEqual(0, txn.complete.call_count)
243242
self.assertEqual(0, self.callback.call_count)
244243
txn.send = AsyncMock(return_value=True) # successfully send the txn
245244
pop_txn = True # returns the txn the first time, then no more.
246-
self.clock.advance_time(16)
245+
self.reactor.advance(16)
247246
self.assertEqual(1, txn.send.call_count) # new mock reset call count
248247
self.assertEqual(1, txn.complete.call_count)
249248
self.callback.assert_called_once_with(self.recoverer)
@@ -268,7 +267,7 @@ def take_txn(
268267
self.assertEqual(0, self.store.get_oldest_unsent_txn.call_count)
269268
txn.send = AsyncMock(return_value=False)
270269
txn.complete = AsyncMock(return_value=None)
271-
self.clock.advance_time(2)
270+
self.reactor.advance(2)
272271
self.assertEqual(1, txn.send.call_count)
273272
self.assertEqual(0, txn.complete.call_count)
274273
self.assertEqual(0, self.callback.call_count)

tests/config/test_oauth_delegation.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,10 @@ def test_auth_providers_cannot_be_enabled(self) -> None:
231231
reactor, clock = get_clock()
232232
with self.assertRaises(ConfigError):
233233
setup_test_homeserver(
234-
self.addCleanup, reactor=reactor, clock=clock, config=config
234+
cleanup_func=self.addCleanup,
235+
config=config,
236+
reactor=reactor,
237+
clock=clock,
235238
)
236239

237240
def test_jwt_auth_cannot_be_enabled(self) -> None:
@@ -395,7 +398,10 @@ def test_auth_providers_cannot_be_enabled(self) -> None:
395398
reactor, clock = get_clock()
396399
with self.assertRaises(ConfigError):
397400
setup_test_homeserver(
398-
self.addCleanup, reactor=reactor, clock=clock, config=config
401+
cleanup_func=self.addCleanup,
402+
config=config,
403+
reactor=reactor,
404+
clock=clock,
399405
)
400406

401407
@skip_unless(HAS_AUTHLIB, "requires authlib")

tests/handlers/test_appservice.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@
4949
from synapse.util.stringutils import random_string
5050

5151
from tests import unittest
52+
from tests.server import get_clock
5253
from tests.test_utils import event_injection
5354
from tests.unittest import override_config
54-
from tests.utils import MockClock
5555

5656

5757
class AppServiceHandlerTestCase(unittest.TestCase):
@@ -61,14 +61,16 @@ def setUp(self) -> None:
6161
self.mock_store = Mock()
6262
self.mock_as_api = AsyncMock()
6363
self.mock_scheduler = Mock()
64+
self.reactor, self.clock = get_clock()
65+
6466
hs = Mock()
6567
hs.get_datastores.return_value = Mock(main=self.mock_store)
6668
self.mock_store.get_appservice_last_pos = AsyncMock(return_value=None)
6769
self.mock_store.set_appservice_last_pos = AsyncMock(return_value=None)
6870
self.mock_store.set_appservice_stream_type_pos = AsyncMock(return_value=None)
6971
hs.get_application_service_api.return_value = self.mock_as_api
7072
hs.get_application_service_scheduler.return_value = self.mock_scheduler
71-
hs.get_clock.return_value = MockClock()
73+
hs.get_clock.return_value = self.clock
7274
self.handler = ApplicationServicesHandler(hs)
7375
self.event_source = hs.get_event_sources()
7476

tests/handlers/test_e2e_room_keys.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
#
2222

2323
import copy
24-
from unittest import mock
2524

2625
from twisted.internet.testing import MemoryReactor
2726

@@ -50,7 +49,7 @@
5049

5150
class E2eRoomKeysHandlerTestCase(unittest.HomeserverTestCase):
5251
def make_homeserver(self, reactor: MemoryReactor, clock: Clock) -> HomeServer:
53-
return self.setup_test_homeserver(replication_layer=mock.Mock())
52+
return self.setup_test_homeserver()
5453

5554
def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None:
5655
self.handler = hs.get_e2e_room_keys_handler()

tests/http/federation/test_srv_resolver.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
from synapse.logging.context import LoggingContext, current_context
3131

3232
from tests import unittest
33-
from tests.utils import MockClock
33+
from tests.server import get_clock
3434

3535

3636
class SrvResolverTestCase(unittest.TestCase):
@@ -105,7 +105,7 @@ def test_from_cache_expired_and_dns_fail(
105105

106106
@defer.inlineCallbacks
107107
def test_from_cache(self) -> Generator["Deferred[object]", object, None]:
108-
clock = MockClock()
108+
reactor, clock = get_clock()
109109

110110
dns_client_mock = Mock(spec_set=["lookupService"])
111111
dns_client_mock.lookupService = Mock(spec_set=[])

tests/http/test_matrixfederationclient.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,6 @@ def check_logcontext(context: LoggingContextOrSentinel) -> None:
6363

6464

6565
class FederationClientTests(HomeserverTestCase):
66-
def make_homeserver(self, reactor: MemoryReactor, clock: Clock) -> HomeServer:
67-
hs = self.setup_test_homeserver(reactor=reactor, clock=clock)
68-
return hs
69-
7066
def prepare(
7167
self, reactor: MemoryReactor, clock: Clock, homeserver: HomeServer
7268
) -> None:

tests/media/test_media_retention.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737

3838
from tests import unittest
3939
from tests.unittest import override_config
40-
from tests.utils import MockClock
4140

4241

4342
class MediaRetentionTestCase(unittest.HomeserverTestCase):
@@ -51,12 +50,6 @@ class MediaRetentionTestCase(unittest.HomeserverTestCase):
5150
admin.register_servlets_for_client_rest_resource,
5251
]
5352

54-
def make_homeserver(self, reactor: MemoryReactor, clock: Clock) -> HomeServer:
55-
# We need to be able to test advancing time in the homeserver, so we
56-
# replace the test homeserver's default clock with a MockClock, which
57-
# supports advancing time.
58-
return self.setup_test_homeserver(clock=MockClock())
59-
6053
def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None:
6154
self.remote_server_name = "remote.homeserver"
6255
self.store = hs.get_datastores().main

0 commit comments

Comments
 (0)