Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Matrix
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Container Registry
Model registry
Operate
Environments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
TeDomum
Matrix
Commits
b7fa834c
Commit
b7fa834c
authored
6 years ago
by
Erik Johnston
Browse files
Options
Downloads
Patches
Plain Diff
Add unit tests
parent
197fae16
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
tests/handlers/test_presence.py
+171
-1
171 additions, 1 deletion
tests/handlers/test_presence.py
with
171 additions
and
1 deletion
tests/handlers/test_presence.py
+
171
−
1
View file @
b7fa834c
...
...
@@ -16,7 +16,11 @@
from
mock
import
Mock
,
call
from
synapse.api.constants
import
PresenceState
from
signedjson.key
import
generate_signing_key
from
synapse.api.constants
import
EventTypes
,
Membership
,
PresenceState
from
synapse.events
import
room_version_to_event_format
from
synapse.events.builder
import
EventBuilder
from
synapse.handlers.presence
import
(
FEDERATION_PING_INTERVAL
,
FEDERATION_TIMEOUT
,
...
...
@@ -26,7 +30,9 @@ from synapse.handlers.presence import (
handle_timeout
,
handle_update
,
)
from
synapse.rest.client.v1
import
room
from
synapse.storage.presence
import
UserPresenceState
from
synapse.types
import
UserID
,
get_domain_from_id
from
tests
import
unittest
...
...
@@ -405,3 +411,167 @@ class PresenceTimeoutTestCase(unittest.TestCase):
self
.
assertIsNotNone
(
new_state
)
self
.
assertEquals
(
state
,
new_state
)
class
PresenceJoinTestCase
(
unittest
.
HomeserverTestCase
):
"""
Tests remote servers get told about presence of users in the room when
they join and when new local users join.
"""
user_id
=
"
@test:server
"
servlets
=
[
room
.
register_servlets
]
def
make_homeserver
(
self
,
reactor
,
clock
):
hs
=
self
.
setup_test_homeserver
(
"
server
"
,
http_client
=
None
,
federation_sender
=
Mock
(),
)
return
hs
def
prepare
(
self
,
reactor
,
clock
,
hs
):
self
.
federation_sender
=
hs
.
get_federation_sender
()
self
.
event_builder_factory
=
hs
.
get_event_builder_factory
()
self
.
federation_handler
=
hs
.
get_handlers
().
federation_handler
self
.
presence_handler
=
hs
.
get_presence_handler
()
# self.event_builder_for_2 = EventBuilderFactory(hs)
# self.event_builder_for_2.hostname = "test2"
self
.
store
=
hs
.
get_datastore
()
self
.
state
=
hs
.
get_state_handler
()
self
.
auth
=
hs
.
get_auth
()
# We don't actually check signatures in tests, so lets just create a
# random key to use.
self
.
random_signing_key
=
generate_signing_key
(
"
ver
"
)
def
test_remote_joins
(
self
):
# We advance time to something that isn't 0, as we use 0 as a special
# value.
self
.
reactor
.
advance
(
1000000000000
)
# Create a room with two local users
room_id
=
self
.
helper
.
create_room_as
(
self
.
user_id
)
self
.
helper
.
join
(
room_id
,
"
@test2:server
"
)
# Mark test2 as online, test will be offline with a last_active of 0
self
.
presence_handler
.
set_state
(
UserID
.
from_string
(
"
@test2:server
"
),
{
"
presence
"
:
PresenceState
.
ONLINE
},
)
self
.
reactor
.
pump
([
0
])
# Wait for presence updates to be handled
# Test that a new server gets told about existing presence #
self
.
federation_sender
.
reset_mock
()
# Add a new remote server to the room
self
.
_add_new_user
(
room_id
,
"
@alice:server2
"
)
# We shouldn't have sent out any local presence *updates*
self
.
federation_sender
.
send_presence
.
assert_not_called
()
# When new server is joined we send it the local users presence states.
# We expect to only see user @test2:server, as @test:server is offline
# and has a zero last_active_ts
expected_state
=
self
.
get_success
(
self
.
presence_handler
.
current_state_for_user
(
"
@test2:server
"
)
)
self
.
assertEqual
(
expected_state
.
state
,
PresenceState
.
ONLINE
)
self
.
federation_sender
.
send_presence_to_destinations
.
assert_called_once_with
(
destinations
=
[
"
server2
"
],
states
=
[
expected_state
]
)
# Test that only the new server gets sent presence and not existing servers #
self
.
federation_sender
.
reset_mock
()
self
.
_add_new_user
(
room_id
,
"
@bob:server3
"
)
self
.
federation_sender
.
send_presence
.
assert_not_called
()
self
.
federation_sender
.
send_presence_to_destinations
.
assert_called_once_with
(
destinations
=
[
"
server3
"
],
states
=
[
expected_state
]
)
def
test_remote_gets_presence_when_local_user_joins
(
self
):
# We advance time to something that isn't 0, as we use 0 as a special
# value.
self
.
reactor
.
advance
(
1000000000000
)
# Create a room with one local users
room_id
=
self
.
helper
.
create_room_as
(
self
.
user_id
)
# Mark test as online
self
.
presence_handler
.
set_state
(
UserID
.
from_string
(
"
@test:server
"
),
{
"
presence
"
:
PresenceState
.
ONLINE
},
)
# Mark test2 as online, test will be offline with a last_active of 0.
# Note we don't join them to the room yet
self
.
presence_handler
.
set_state
(
UserID
.
from_string
(
"
@test2:server
"
),
{
"
presence
"
:
PresenceState
.
ONLINE
},
)
# Add servers to the room
self
.
_add_new_user
(
room_id
,
"
@alice:server2
"
)
self
.
_add_new_user
(
room_id
,
"
@bob:server3
"
)
self
.
reactor
.
pump
([
0
])
# Wait for presence updates to be handled
# Test that when a local join happens remote servers get told about it #
self
.
federation_sender
.
reset_mock
()
# Join local user to room
self
.
helper
.
join
(
room_id
,
"
@test2:server
"
)
self
.
reactor
.
pump
([
0
])
# Wait for presence updates to be handled
# We shouldn't have sent out any local presence *updates*
self
.
federation_sender
.
send_presence
.
assert_not_called
()
# We expect to only send test2 presence to server2 and server3
expected_state
=
self
.
get_success
(
self
.
presence_handler
.
current_state_for_user
(
"
@test2:server
"
)
)
self
.
assertEqual
(
expected_state
.
state
,
PresenceState
.
ONLINE
)
self
.
federation_sender
.
send_presence_to_destinations
.
assert_called_once_with
(
destinations
=
set
((
"
server2
"
,
"
server3
"
)),
states
=
[
expected_state
]
)
def
_add_new_user
(
self
,
room_id
,
user_id
):
"""
Add new user to the room by creating an event and poking the federation API.
"""
hostname
=
get_domain_from_id
(
user_id
)
room_version
=
self
.
get_success
(
self
.
store
.
get_room_version
(
room_id
))
# No we want to have other servers "join"
builder
=
EventBuilder
(
state
=
self
.
state
,
auth
=
self
.
auth
,
store
=
self
.
store
,
clock
=
self
.
clock
,
hostname
=
hostname
,
signing_key
=
self
.
random_signing_key
,
format_version
=
room_version_to_event_format
(
room_version
),
room_id
=
room_id
,
type
=
EventTypes
.
Member
,
sender
=
user_id
,
state_key
=
user_id
,
content
=
{
"
membership
"
:
Membership
.
JOIN
}
)
prev_event_ids
=
self
.
get_success
(
self
.
store
.
get_latest_event_ids_in_room
(
room_id
)
)
event
=
self
.
get_success
(
builder
.
build
(
prev_event_ids
))
self
.
get_success
(
self
.
federation_handler
.
on_receive_pdu
(
hostname
,
event
))
# Check that it was successfully persisted.
self
.
get_success
(
self
.
store
.
get_event
(
event
.
event_id
))
self
.
get_success
(
self
.
store
.
get_event
(
event
.
event_id
))
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment