diff --git a/tests/appservice/test_appservice.py b/tests/appservice/test_appservice.py
index d12e4f2644..eb7becf725 100644
--- a/tests/appservice/test_appservice.py
+++ b/tests/appservice/test_appservice.py
@@ -18,6 +18,13 @@ from mock import Mock, PropertyMock
from tests import unittest
+def _regex(regex, exclusive=True):
+ return {
+ "regex": regex,
+ "exclusive": exclusive
+ }
+
+
class ApplicationServiceTestCase(unittest.TestCase):
def setUp(self):
@@ -36,21 +43,21 @@ class ApplicationServiceTestCase(unittest.TestCase):
def test_regex_user_id_prefix_match(self):
self.service.namespaces[ApplicationService.NS_USERS].append(
- "@irc_.*"
+ _regex("@irc_.*")
)
self.event.sender = "@irc_foobar:matrix.org"
self.assertTrue(self.service.is_interested(self.event))
def test_regex_user_id_prefix_no_match(self):
self.service.namespaces[ApplicationService.NS_USERS].append(
- "@irc_.*"
+ _regex("@irc_.*")
)
self.event.sender = "@someone_else:matrix.org"
self.assertFalse(self.service.is_interested(self.event))
def test_regex_room_member_is_checked(self):
self.service.namespaces[ApplicationService.NS_USERS].append(
- "@irc_.*"
+ _regex("@irc_.*")
)
self.event.sender = "@someone_else:matrix.org"
self.event.type = "m.room.member"
@@ -59,30 +66,78 @@ class ApplicationServiceTestCase(unittest.TestCase):
def test_regex_room_id_match(self):
self.service.namespaces[ApplicationService.NS_ROOMS].append(
- "!some_prefix.*some_suffix:matrix.org"
+ _regex("!some_prefix.*some_suffix:matrix.org")
)
self.event.room_id = "!some_prefixs0m3th1nGsome_suffix:matrix.org"
self.assertTrue(self.service.is_interested(self.event))
def test_regex_room_id_no_match(self):
self.service.namespaces[ApplicationService.NS_ROOMS].append(
- "!some_prefix.*some_suffix:matrix.org"
+ _regex("!some_prefix.*some_suffix:matrix.org")
)
self.event.room_id = "!XqBunHwQIXUiqCaoxq:matrix.org"
self.assertFalse(self.service.is_interested(self.event))
def test_regex_alias_match(self):
self.service.namespaces[ApplicationService.NS_ALIASES].append(
- "#irc_.*:matrix.org"
+ _regex("#irc_.*:matrix.org")
)
self.assertTrue(self.service.is_interested(
self.event,
aliases_for_event=["#irc_foobar:matrix.org", "#athing:matrix.org"]
))
+ def test_non_exclusive_alias(self):
+ self.service.namespaces[ApplicationService.NS_ALIASES].append(
+ _regex("#irc_.*:matrix.org", exclusive=False)
+ )
+ self.assertFalse(self.service.is_exclusive_alias(
+ "#irc_foobar:matrix.org"
+ ))
+
+ def test_non_exclusive_room(self):
+ self.service.namespaces[ApplicationService.NS_ROOMS].append(
+ _regex("!irc_.*:matrix.org", exclusive=False)
+ )
+ self.assertFalse(self.service.is_exclusive_room(
+ "!irc_foobar:matrix.org"
+ ))
+
+ def test_non_exclusive_user(self):
+ self.service.namespaces[ApplicationService.NS_USERS].append(
+ _regex("@irc_.*:matrix.org", exclusive=False)
+ )
+ self.assertFalse(self.service.is_exclusive_user(
+ "@irc_foobar:matrix.org"
+ ))
+
+ def test_exclusive_alias(self):
+ self.service.namespaces[ApplicationService.NS_ALIASES].append(
+ _regex("#irc_.*:matrix.org", exclusive=True)
+ )
+ self.assertTrue(self.service.is_exclusive_alias(
+ "#irc_foobar:matrix.org"
+ ))
+
+ def test_exclusive_user(self):
+ self.service.namespaces[ApplicationService.NS_USERS].append(
+ _regex("@irc_.*:matrix.org", exclusive=True)
+ )
+ self.assertTrue(self.service.is_exclusive_user(
+ "@irc_foobar:matrix.org"
+ ))
+
+ def test_exclusive_room(self):
+ self.service.namespaces[ApplicationService.NS_ROOMS].append(
+ _regex("!irc_.*:matrix.org", exclusive=True)
+ )
+ self.assertTrue(self.service.is_exclusive_room(
+ "!irc_foobar:matrix.org"
+ ))
+
def test_regex_alias_no_match(self):
self.service.namespaces[ApplicationService.NS_ALIASES].append(
- "#irc_.*:matrix.org"
+ _regex("#irc_.*:matrix.org")
)
self.assertFalse(self.service.is_interested(
self.event,
@@ -91,10 +146,10 @@ class ApplicationServiceTestCase(unittest.TestCase):
def test_regex_multiple_matches(self):
self.service.namespaces[ApplicationService.NS_ALIASES].append(
- "#irc_.*:matrix.org"
+ _regex("#irc_.*:matrix.org")
)
self.service.namespaces[ApplicationService.NS_USERS].append(
- "@irc_.*"
+ _regex("@irc_.*")
)
self.event.sender = "@irc_foobar:matrix.org"
self.assertTrue(self.service.is_interested(
@@ -104,10 +159,10 @@ class ApplicationServiceTestCase(unittest.TestCase):
def test_restrict_to_rooms(self):
self.service.namespaces[ApplicationService.NS_ROOMS].append(
- "!flibble_.*:matrix.org"
+ _regex("!flibble_.*:matrix.org")
)
self.service.namespaces[ApplicationService.NS_USERS].append(
- "@irc_.*"
+ _regex("@irc_.*")
)
self.event.sender = "@irc_foobar:matrix.org"
self.event.room_id = "!wibblewoo:matrix.org"
@@ -118,10 +173,10 @@ class ApplicationServiceTestCase(unittest.TestCase):
def test_restrict_to_aliases(self):
self.service.namespaces[ApplicationService.NS_ALIASES].append(
- "#xmpp_.*:matrix.org"
+ _regex("#xmpp_.*:matrix.org")
)
self.service.namespaces[ApplicationService.NS_USERS].append(
- "@irc_.*"
+ _regex("@irc_.*")
)
self.event.sender = "@irc_foobar:matrix.org"
self.assertFalse(self.service.is_interested(
@@ -132,10 +187,10 @@ class ApplicationServiceTestCase(unittest.TestCase):
def test_restrict_to_senders(self):
self.service.namespaces[ApplicationService.NS_ALIASES].append(
- "#xmpp_.*:matrix.org"
+ _regex("#xmpp_.*:matrix.org")
)
self.service.namespaces[ApplicationService.NS_USERS].append(
- "@irc_.*"
+ _regex("@irc_.*")
)
self.event.sender = "@xmpp_foobar:matrix.org"
self.assertFalse(self.service.is_interested(
@@ -146,7 +201,7 @@ class ApplicationServiceTestCase(unittest.TestCase):
def test_member_list_match(self):
self.service.namespaces[ApplicationService.NS_USERS].append(
- "@irc_.*"
+ _regex("@irc_.*")
)
join_list = [
Mock(
diff --git a/tests/handlers/test_presence.py b/tests/handlers/test_presence.py
index d88a977be4..6ffc3c99cc 100644
--- a/tests/handlers/test_presence.py
+++ b/tests/handlers/test_presence.py
@@ -389,14 +389,18 @@ class PresenceInvitesTestCase(PresenceTestCase):
@defer.inlineCallbacks
def test_invite_remote(self):
+ # Use a different destination, otherwise retry logic might fail the
+ # request
+ u_rocket = UserID.from_string("@rocket:there")
+
put_json = self.mock_http_client.put_json
put_json.expect_call_and_return(
- call("elsewhere",
+ call("there",
path="/_matrix/federation/v1/send/1000000/",
- data=_expect_edu("elsewhere", "m.presence_invite",
+ data=_expect_edu("there", "m.presence_invite",
content={
"observer_user": "@apple:test",
- "observed_user": "@cabbage:elsewhere",
+ "observed_user": "@rocket:there",
}
),
json_data_callback=ANY,
@@ -405,10 +409,10 @@ class PresenceInvitesTestCase(PresenceTestCase):
)
yield self.handler.send_invite(
- observer_user=self.u_apple, observed_user=self.u_cabbage)
+ observer_user=self.u_apple, observed_user=u_rocket)
self.assertEquals(
- [{"observed_user_id": "@cabbage:elsewhere", "accepted": 0}],
+ [{"observed_user_id": "@rocket:there", "accepted": 0}],
(yield self.datastore.get_presence_list(self.u_apple.localpart))
)
@@ -418,13 +422,18 @@ class PresenceInvitesTestCase(PresenceTestCase):
def test_accept_remote(self):
# TODO(paul): This test will likely break if/when real auth permissions
# are added; for now the HS will always accept any invite
+
+ # Use a different destination, otherwise retry logic might fail the
+ # request
+ u_rocket = UserID.from_string("@rocket:moon")
+
put_json = self.mock_http_client.put_json
put_json.expect_call_and_return(
- call("elsewhere",
+ call("moon",
path="/_matrix/federation/v1/send/1000000/",
- data=_expect_edu("elsewhere", "m.presence_accept",
+ data=_expect_edu("moon", "m.presence_accept",
content={
- "observer_user": "@cabbage:elsewhere",
+ "observer_user": "@rocket:moon",
"observed_user": "@apple:test",
}
),
@@ -437,7 +446,7 @@ class PresenceInvitesTestCase(PresenceTestCase):
"/_matrix/federation/v1/send/1000000/",
_make_edu_json("elsewhere", "m.presence_invite",
content={
- "observer_user": "@cabbage:elsewhere",
+ "observer_user": "@rocket:moon",
"observed_user": "@apple:test",
}
)
@@ -446,7 +455,7 @@ class PresenceInvitesTestCase(PresenceTestCase):
self.assertTrue(
(yield self.datastore.is_presence_visible(
observed_localpart=self.u_apple.localpart,
- observer_userid=self.u_cabbage.to_string(),
+ observer_userid=u_rocket.to_string(),
))
)
@@ -454,13 +463,17 @@ class PresenceInvitesTestCase(PresenceTestCase):
@defer.inlineCallbacks
def test_invited_remote_nonexistant(self):
+ # Use a different destination, otherwise retry logic might fail the
+ # request
+ u_rocket = UserID.from_string("@rocket:sun")
+
put_json = self.mock_http_client.put_json
put_json.expect_call_and_return(
- call("elsewhere",
+ call("sun",
path="/_matrix/federation/v1/send/1000000/",
- data=_expect_edu("elsewhere", "m.presence_deny",
+ data=_expect_edu("sun", "m.presence_deny",
content={
- "observer_user": "@cabbage:elsewhere",
+ "observer_user": "@rocket:sun",
"observed_user": "@durian:test",
}
),
@@ -471,9 +484,9 @@ class PresenceInvitesTestCase(PresenceTestCase):
yield self.mock_federation_resource.trigger("PUT",
"/_matrix/federation/v1/send/1000000/",
- _make_edu_json("elsewhere", "m.presence_invite",
+ _make_edu_json("sun", "m.presence_invite",
content={
- "observer_user": "@cabbage:elsewhere",
+ "observer_user": "@rocket:sun",
"observed_user": "@durian:test",
}
)
diff --git a/tests/rest/client/v1/test_events.py b/tests/rest/client/v1/test_events.py
index f36340121d..36b0f2ff6d 100644
--- a/tests/rest/client/v1/test_events.py
+++ b/tests/rest/client/v1/test_events.py
@@ -128,6 +128,7 @@ class EventStreamPermissionsTestCase(RestTestCase):
self.ratelimiter = hs.get_ratelimiter()
self.ratelimiter.send_message.return_value = (True, 0)
hs.config.enable_registration_captcha = False
+ hs.config.disable_registration = False
hs.get_handlers().federation_handler = Mock()
diff --git a/tests/rest/client/v1/test_presence.py b/tests/rest/client/v1/test_presence.py
index 7c5df5c116..5f2ef64efc 100644
--- a/tests/rest/client/v1/test_presence.py
+++ b/tests/rest/client/v1/test_presence.py
@@ -295,6 +295,9 @@ class PresenceEventStreamTestCase(unittest.TestCase):
self.mock_datastore = hs.get_datastore()
self.mock_datastore.get_app_service_by_token = Mock(return_value=None)
+ self.mock_datastore.get_app_service_by_user_id = Mock(
+ return_value=defer.succeed(None)
+ )
def get_profile_displayname(user_id):
return defer.succeed("Frank")
diff --git a/tests/storage/test__base.py b/tests/storage/test__base.py
new file mode 100644
index 0000000000..55d22f665a
--- /dev/null
+++ b/tests/storage/test__base.py
@@ -0,0 +1,110 @@
+# -*- coding: utf-8 -*-
+# Copyright 2015 OpenMarket Ltd
+#
+# 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 tests import unittest
+from twisted.internet import defer
+
+from synapse.storage._base import cached
+
+
+class CacheDecoratorTestCase(unittest.TestCase):
+
+ @defer.inlineCallbacks
+ def test_passthrough(self):
+ @cached()
+ def func(self, key):
+ return key
+
+ self.assertEquals((yield func(self, "foo")), "foo")
+ self.assertEquals((yield func(self, "bar")), "bar")
+
+ @defer.inlineCallbacks
+ def test_hit(self):
+ callcount = [0]
+
+ @cached()
+ def func(self, key):
+ callcount[0] += 1
+ return key
+
+ yield func(self, "foo")
+
+ self.assertEquals(callcount[0], 1)
+
+ self.assertEquals((yield func(self, "foo")), "foo")
+ self.assertEquals(callcount[0], 1)
+
+ @defer.inlineCallbacks
+ def test_invalidate(self):
+ callcount = [0]
+
+ @cached()
+ def func(self, key):
+ callcount[0] += 1
+ return key
+
+ yield func(self, "foo")
+
+ self.assertEquals(callcount[0], 1)
+
+ func.invalidate("foo")
+
+ yield func(self, "foo")
+
+ self.assertEquals(callcount[0], 2)
+
+ def test_invalidate_missing(self):
+ @cached()
+ def func(self, key):
+ return key
+
+ func.invalidate("what")
+
+ @defer.inlineCallbacks
+ def test_max_entries(self):
+ callcount = [0]
+
+ @cached(max_entries=10)
+ def func(self, key):
+ callcount[0] += 1
+ return key
+
+ for k in range(0,12):
+ yield func(self, k)
+
+ self.assertEquals(callcount[0], 12)
+
+ # There must have been at least 2 evictions, meaning if we calculate
+ # all 12 values again, we must get called at least 2 more times
+ for k in range(0,12):
+ yield func(self, k)
+
+ self.assertTrue(callcount[0] >= 14,
+ msg="Expected callcount >= 14, got %d" % (callcount[0]))
+
+ @defer.inlineCallbacks
+ def test_prefill(self):
+ callcount = [0]
+
+ @cached()
+ def func(self, key):
+ callcount[0] += 1
+ return key
+
+ func.prefill("foo", 123)
+
+ self.assertEquals((yield func(self, "foo")), 123)
+ self.assertEquals(callcount[0], 0)
diff --git a/tests/storage/test_appservice.py b/tests/storage/test_appservice.py
index fc733d4c79..ca5b92ec85 100644
--- a/tests/storage/test_appservice.py
+++ b/tests/storage/test_appservice.py
@@ -50,9 +50,15 @@ class ApplicationServiceStoreTestCase(unittest.TestCase):
def test_update_and_retrieval_of_service(self):
url = "https://matrix.org/appservices/foobar"
hs_token = "hstok"
- user_regex = ["@foobar_.*:matrix.org"]
- alias_regex = ["#foobar_.*:matrix.org"]
- room_regex = []
+ user_regex = [
+ {"regex": "@foobar_.*:matrix.org", "exclusive": True}
+ ]
+ alias_regex = [
+ {"regex": "#foobar_.*:matrix.org", "exclusive": False}
+ ]
+ room_regex = [
+
+ ]
service = ApplicationService(
url=url, hs_token=hs_token, token=self.as_token, namespaces={
ApplicationService.NS_USERS: user_regex,
diff --git a/tests/utils.py b/tests/utils.py
index 110b9f86b8..81e82a80df 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -42,6 +42,7 @@ def setup_test_homeserver(name="test", datastore=None, config=None, **kargs):
config = Mock()
config.signing_key = [MockKey()]
config.event_cache_size = 1
+ config.disable_registration = False
if datastore is None:
db_pool = SQLiteMemoryDbPool()
|