mirror of
https://mau.dev/maunium/synapse.git
synced 2024-10-01 05:36:05 +00:00
465117d7ca
A bit of a cleanup for background_updates, and make sure that the real background updates have run before we start the unit tests, so that they don't interfere with the tests.
85 lines
2.7 KiB
Python
85 lines
2.7 KiB
Python
from tests import unittest
|
|
from twisted.internet import defer
|
|
|
|
from tests.utils import setup_test_homeserver
|
|
|
|
from mock import Mock
|
|
|
|
|
|
class BackgroundUpdateTestCase(unittest.TestCase):
|
|
|
|
@defer.inlineCallbacks
|
|
def setUp(self):
|
|
hs = yield setup_test_homeserver() # type: synapse.server.HomeServer
|
|
self.store = hs.get_datastore()
|
|
self.clock = hs.get_clock()
|
|
|
|
self.update_handler = Mock()
|
|
|
|
yield self.store.register_background_update_handler(
|
|
"test_update", self.update_handler
|
|
)
|
|
|
|
# run the real background updates, to get them out the way
|
|
# (perhaps we should run them as part of the test HS setup, since we
|
|
# run all of the other schema setup stuff there?)
|
|
while True:
|
|
res = yield self.store.do_next_background_update(1000)
|
|
if res is None:
|
|
break
|
|
|
|
@defer.inlineCallbacks
|
|
def test_do_background_update(self):
|
|
desired_count = 1000
|
|
duration_ms = 42
|
|
|
|
# first step: make a bit of progress
|
|
@defer.inlineCallbacks
|
|
def update(progress, count):
|
|
self.clock.advance_time_msec(count * duration_ms)
|
|
progress = {"my_key": progress["my_key"] + 1}
|
|
yield self.store.runInteraction(
|
|
"update_progress",
|
|
self.store._background_update_progress_txn,
|
|
"test_update",
|
|
progress,
|
|
)
|
|
defer.returnValue(count)
|
|
|
|
self.update_handler.side_effect = update
|
|
|
|
yield self.store.start_background_update("test_update", {"my_key": 1})
|
|
|
|
self.update_handler.reset_mock()
|
|
result = yield self.store.do_next_background_update(
|
|
duration_ms * desired_count
|
|
)
|
|
self.assertIsNotNone(result)
|
|
self.update_handler.assert_called_once_with(
|
|
{"my_key": 1}, self.store.DEFAULT_BACKGROUND_BATCH_SIZE
|
|
)
|
|
|
|
# second step: complete the update
|
|
@defer.inlineCallbacks
|
|
def update(progress, count):
|
|
yield self.store._end_background_update("test_update")
|
|
defer.returnValue(count)
|
|
|
|
self.update_handler.side_effect = update
|
|
self.update_handler.reset_mock()
|
|
result = yield self.store.do_next_background_update(
|
|
duration_ms * desired_count
|
|
)
|
|
self.assertIsNotNone(result)
|
|
self.update_handler.assert_called_once_with(
|
|
{"my_key": 2}, desired_count
|
|
)
|
|
|
|
# third step: we don't expect to be called any more
|
|
self.update_handler.reset_mock()
|
|
result = yield self.store.do_next_background_update(
|
|
duration_ms * desired_count
|
|
)
|
|
self.assertIsNone(result)
|
|
self.assertFalse(self.update_handler.called)
|