mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-05-09 21:15:00 -04:00
Prevent multiple device list updates from breaking a batch send (#5156)
fixes #5153
This commit is contained in:
parent
a11865016e
commit
2d1d7b7e6f
4 changed files with 198 additions and 33 deletions
|
@ -71,6 +71,75 @@ class DeviceStoreTestCase(tests.unittest.TestCase):
|
|||
res["device2"],
|
||||
)
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def test_get_devices_by_remote(self):
|
||||
device_ids = ["device_id1", "device_id2"]
|
||||
|
||||
# Add two device updates with a single stream_id
|
||||
yield self.store.add_device_change_to_streams(
|
||||
"user_id", device_ids, ["somehost"],
|
||||
)
|
||||
|
||||
# Get all device updates ever meant for this remote
|
||||
now_stream_id, device_updates = yield self.store.get_devices_by_remote(
|
||||
"somehost", -1, limit=100,
|
||||
)
|
||||
|
||||
# Check original device_ids are contained within these updates
|
||||
self._check_devices_in_updates(device_ids, device_updates)
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def test_get_devices_by_remote_limited(self):
|
||||
# Test breaking the update limit in 1, 101, and 1 device_id segments
|
||||
|
||||
# first add one device
|
||||
device_ids1 = ["device_id0"]
|
||||
yield self.store.add_device_change_to_streams(
|
||||
"user_id", device_ids1, ["someotherhost"],
|
||||
)
|
||||
|
||||
# then add 101
|
||||
device_ids2 = ["device_id" + str(i + 1) for i in range(101)]
|
||||
yield self.store.add_device_change_to_streams(
|
||||
"user_id", device_ids2, ["someotherhost"],
|
||||
)
|
||||
|
||||
# then one more
|
||||
device_ids3 = ["newdevice"]
|
||||
yield self.store.add_device_change_to_streams(
|
||||
"user_id", device_ids3, ["someotherhost"],
|
||||
)
|
||||
|
||||
#
|
||||
# now read them back.
|
||||
#
|
||||
|
||||
# first we should get a single update
|
||||
now_stream_id, device_updates = yield self.store.get_devices_by_remote(
|
||||
"someotherhost", -1, limit=100,
|
||||
)
|
||||
self._check_devices_in_updates(device_ids1, device_updates)
|
||||
|
||||
# Then we should get an empty list back as the 101 devices broke the limit
|
||||
now_stream_id, device_updates = yield self.store.get_devices_by_remote(
|
||||
"someotherhost", now_stream_id, limit=100,
|
||||
)
|
||||
self.assertEqual(len(device_updates), 0)
|
||||
|
||||
# The 101 devices should've been cleared, so we should now just get one device
|
||||
# update
|
||||
now_stream_id, device_updates = yield self.store.get_devices_by_remote(
|
||||
"someotherhost", now_stream_id, limit=100,
|
||||
)
|
||||
self._check_devices_in_updates(device_ids3, device_updates)
|
||||
|
||||
def _check_devices_in_updates(self, expected_device_ids, device_updates):
|
||||
"""Check that an specific device ids exist in a list of device update EDUs"""
|
||||
self.assertEqual(len(device_updates), len(expected_device_ids))
|
||||
|
||||
received_device_ids = {update["device_id"] for update in device_updates}
|
||||
self.assertEqual(received_device_ids, set(expected_device_ids))
|
||||
|
||||
@defer.inlineCallbacks
|
||||
def test_update_device(self):
|
||||
yield self.store.store_device("user_id", "device_id", "display_name 1")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue