This repository has been archived by the owner on Apr 26, 2024. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add some tests for propagation of device list changes between local u…
…sers (#11972)
- Loading branch information
1 parent
c4c98c7
commit 87f2005
Showing
4 changed files
with
163 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Add tests for device list changes between local users. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,155 @@ | ||
# Copyright 2022 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. | ||
from synapse.rest import admin, devices, room, sync | ||
from synapse.rest.client import account, login, register | ||
|
||
from tests import unittest | ||
|
||
|
||
class DeviceListsTestCase(unittest.HomeserverTestCase): | ||
"""Tests regarding device list changes.""" | ||
|
||
servlets = [ | ||
admin.register_servlets_for_client_rest_resource, | ||
login.register_servlets, | ||
register.register_servlets, | ||
account.register_servlets, | ||
room.register_servlets, | ||
sync.register_servlets, | ||
devices.register_servlets, | ||
] | ||
|
||
def test_receiving_local_device_list_changes(self): | ||
"""Tests that a local users that share a room receive each other's device list | ||
changes. | ||
""" | ||
# Register two users | ||
test_device_id = "TESTDEVICE" | ||
alice_user_id = self.register_user("alice", "correcthorse") | ||
alice_access_token = self.login( | ||
alice_user_id, "correcthorse", device_id=test_device_id | ||
) | ||
|
||
bob_user_id = self.register_user("bob", "ponyponypony") | ||
bob_access_token = self.login(bob_user_id, "ponyponypony") | ||
|
||
# Create a room for them to coexist peacefully in | ||
new_room_id = self.helper.create_room_as( | ||
alice_user_id, is_public=True, tok=alice_access_token | ||
) | ||
self.assertIsNotNone(new_room_id) | ||
|
||
# Have Bob join the room | ||
self.helper.invite( | ||
new_room_id, alice_user_id, bob_user_id, tok=alice_access_token | ||
) | ||
self.helper.join(new_room_id, bob_user_id, tok=bob_access_token) | ||
|
||
# Now have Bob initiate an initial sync (in order to get a since token) | ||
channel = self.make_request( | ||
"GET", | ||
"/sync", | ||
access_token=bob_access_token, | ||
) | ||
self.assertEqual(channel.code, 200, channel.json_body) | ||
next_batch_token = channel.json_body["next_batch"] | ||
|
||
# ...and then an incremental sync. This should block until the sync stream is woken up, | ||
# which we hope will happen as a result of Alice updating their device list. | ||
bob_sync_channel = self.make_request( | ||
"GET", | ||
f"/sync?since={next_batch_token}&timeout=30000", | ||
access_token=bob_access_token, | ||
# Start the request, then continue on. | ||
await_result=False, | ||
) | ||
|
||
# Have alice update their device list | ||
channel = self.make_request( | ||
"PUT", | ||
f"/devices/{test_device_id}", | ||
{ | ||
"display_name": "New Device Name", | ||
}, | ||
access_token=alice_access_token, | ||
) | ||
self.assertEqual(channel.code, 200, channel.json_body) | ||
|
||
# Check that bob's incremental sync contains the updated device list. | ||
# If not, the client would only receive the device list update on the | ||
# *next* sync. | ||
bob_sync_channel.await_result() | ||
self.assertEqual(bob_sync_channel.code, 200, bob_sync_channel.json_body) | ||
|
||
changed_device_lists = bob_sync_channel.json_body.get("device_lists", {}).get( | ||
"changed", [] | ||
) | ||
self.assertIn(alice_user_id, changed_device_lists, bob_sync_channel.json_body) | ||
|
||
def test_not_receiving_local_device_list_changes(self): | ||
"""Tests a local users DO NOT receive device updates from each other if they do not | ||
share a room. | ||
""" | ||
# Register two users | ||
test_device_id = "TESTDEVICE" | ||
alice_user_id = self.register_user("alice", "correcthorse") | ||
alice_access_token = self.login( | ||
alice_user_id, "correcthorse", device_id=test_device_id | ||
) | ||
|
||
bob_user_id = self.register_user("bob", "ponyponypony") | ||
bob_access_token = self.login(bob_user_id, "ponyponypony") | ||
|
||
# These users do not share a room. They are lonely. | ||
|
||
# Have Bob initiate an initial sync (in order to get a since token) | ||
channel = self.make_request( | ||
"GET", | ||
"/sync", | ||
access_token=bob_access_token, | ||
) | ||
self.assertEqual(channel.code, 200, channel.json_body) | ||
next_batch_token = channel.json_body["next_batch"] | ||
|
||
# ...and then an incremental sync. This should block until the sync stream is woken up, | ||
# which we hope will happen as a result of Alice updating their device list. | ||
bob_sync_channel = self.make_request( | ||
"GET", | ||
f"/sync?since={next_batch_token}&timeout=1000", | ||
access_token=bob_access_token, | ||
# Start the request, then continue on. | ||
await_result=False, | ||
) | ||
|
||
# Have alice update their device list | ||
channel = self.make_request( | ||
"PUT", | ||
f"/devices/{test_device_id}", | ||
{ | ||
"display_name": "New Device Name", | ||
}, | ||
access_token=alice_access_token, | ||
) | ||
self.assertEqual(channel.code, 200, channel.json_body) | ||
|
||
# Check that bob's incremental sync does not contain the updated device list. | ||
bob_sync_channel.await_result() | ||
self.assertEqual(bob_sync_channel.code, 200, bob_sync_channel.json_body) | ||
|
||
changed_device_lists = bob_sync_channel.json_body.get("device_lists", {}).get( | ||
"changed", [] | ||
) | ||
self.assertNotIn( | ||
alice_user_id, changed_device_lists, bob_sync_channel.json_body | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters