Ejemplo n.º 1
0
    def setUp(self):
        self.as_yaml_files = []
        config = Mock(
            app_service_config_files=self.as_yaml_files,
            event_cache_size=1,
            password_providers=[],
        )
        hs = yield setup_test_homeserver(
            config=config,
            federation_sender=Mock(),
            replication_layer=Mock(),
        )

        self.as_token = "token1"
        self.as_url = "some_url"
        self.as_id = "as1"
        self._add_appservice(
            self.as_token,
            self.as_id,
            self.as_url,
            "some_hs_token",
            "bob"
        )
        self._add_appservice("token2", "as2", "some_url", "some_hs_token", "bob")
        self._add_appservice("token3", "as3", "some_url", "some_hs_token", "bob")
        # must be done after inserts
        self.store = ApplicationServiceStore(hs)
Ejemplo n.º 2
0
class ApplicationServiceStoreTestCase(unittest.TestCase):
    @defer.inlineCallbacks
    def setUp(self):
        self.as_yaml_files = []
        config = Mock(app_service_config_files=self.as_yaml_files)
        hs = yield setup_test_homeserver(config=config)

        self.as_token = "token1"
        self.as_url = "some_url"
        self._add_appservice(self.as_token, self.as_url, "some_hs_token",
                             "bob")
        self._add_appservice("token2", "some_url", "some_hs_token", "bob")
        self._add_appservice("token3", "some_url", "some_hs_token", "bob")
        # must be done after inserts
        self.store = ApplicationServiceStore(hs)

    def tearDown(self):
        # TODO: suboptimal that we need to create files for tests!
        for f in self.as_yaml_files:
            try:
                os.remove(f)
            except:
                pass

    def _add_appservice(self, as_token, url, hs_token, sender):
        as_yaml = dict(url=url,
                       as_token=as_token,
                       hs_token=hs_token,
                       sender_localpart=sender,
                       namespaces={})
        # use the token as the filename
        with open(as_token, 'w') as outfile:
            outfile.write(yaml.dump(as_yaml))
            self.as_yaml_files.append(as_token)

    @defer.inlineCallbacks
    def test_retrieve_unknown_service_token(self):
        service = yield self.store.get_app_service_by_token("invalid_token")
        self.assertEquals(service, None)

    @defer.inlineCallbacks
    def test_retrieval_of_service(self):
        stored_service = yield self.store.get_app_service_by_token(
            self.as_token)
        self.assertEquals(stored_service.token, self.as_token)
        self.assertEquals(stored_service.url, self.as_url)
        self.assertEquals(
            stored_service.namespaces[ApplicationService.NS_ALIASES], [])
        self.assertEquals(
            stored_service.namespaces[ApplicationService.NS_ROOMS], [])
        self.assertEquals(
            stored_service.namespaces[ApplicationService.NS_USERS], [])

    @defer.inlineCallbacks
    def test_retrieval_of_all_services(self):
        services = yield self.store.get_app_services()
        self.assertEquals(len(services), 3)
Ejemplo n.º 3
0
    def setUp(self):
        self.as_yaml_files = []
        config = Mock(app_service_config_files=self.as_yaml_files)
        hs = yield setup_test_homeserver(config=config)

        self.as_token = "token1"
        self.as_url = "some_url"
        self._add_appservice(self.as_token, self.as_url, "some_hs_token",
                             "bob")
        self._add_appservice("token2", "some_url", "some_hs_token", "bob")
        self._add_appservice("token3", "some_url", "some_hs_token", "bob")
        # must be done after inserts
        self.store = ApplicationServiceStore(hs)
Ejemplo n.º 4
0
    def setUp(self):
        self.as_yaml_files = []
        config = Mock(
            app_service_config_files=self.as_yaml_files,
            event_cache_size=1,
            password_providers=[],
        )
        hs = yield setup_test_homeserver(
            config=config,
            federation_sender=Mock(),
            federation_client=Mock(),
        )

        self.as_token = "token1"
        self.as_url = "some_url"
        self.as_id = "as1"
        self._add_appservice(
            self.as_token,
            self.as_id,
            self.as_url,
            "some_hs_token",
            "bob"
        )
        self._add_appservice("token2", "as2", "some_url", "some_hs_token", "bob")
        self._add_appservice("token3", "as3", "some_url", "some_hs_token", "bob")
        # must be done after inserts
        self.store = ApplicationServiceStore(None, hs)
Ejemplo n.º 5
0
 def setUp(self):
     db_pool = SQLiteMemoryDbPool()
     yield db_pool.prepare()
     hs = HomeServer("test",
                     db_pool=db_pool,
                     clock=MockClock(),
                     config=Mock())
     self.as_token = "token1"
     db_pool.runQuery("INSERT INTO application_services(token) VALUES(?)",
                      (self.as_token, ))
     db_pool.runQuery("INSERT INTO application_services(token) VALUES(?)",
                      ("token2", ))
     db_pool.runQuery("INSERT INTO application_services(token) VALUES(?)",
                      ("token3", ))
     # must be done after inserts
     self.store = ApplicationServiceStore(hs)
Ejemplo n.º 6
0
    def test_unique_works(self):
        f1 = self._write_config(suffix="1")
        f2 = self._write_config(suffix="2")

        config = Mock(app_service_config_files=[f1, f2], event_cache_size=1)
        hs = yield setup_test_homeserver(config=config, datastore=Mock())

        ApplicationServiceStore(hs)
Ejemplo n.º 7
0
    def setUp(self):
        self.as_yaml_files = []
        hs = yield setup_test_homeserver(self.addCleanup,
                                         federation_sender=Mock(),
                                         federation_client=Mock())

        hs.config.app_service_config_files = self.as_yaml_files
        hs.config.event_cache_size = 1
        hs.config.password_providers = []

        self.as_token = "token1"
        self.as_url = "some_url"
        self.as_id = "as1"
        self._add_appservice(self.as_token, self.as_id, self.as_url,
                             "some_hs_token", "bob")
        self._add_appservice("token2", "as2", "some_url", "some_hs_token",
                             "bob")
        self._add_appservice("token3", "as3", "some_url", "some_hs_token",
                             "bob")
        # must be done after inserts
        self.store = ApplicationServiceStore(hs.get_db_conn(), hs)
Ejemplo n.º 8
0
    def test_unique_works(self):
        f1 = self._write_config(suffix="1")
        f2 = self._write_config(suffix="2")

        hs = yield setup_test_homeserver(self.addCleanup,
                                         federation_sender=Mock(),
                                         federation_client=Mock())

        hs.config.app_service_config_files = [f1, f2]
        hs.config.event_cache_size = 1
        hs.config.password_providers = []

        ApplicationServiceStore(hs.get_db_conn(), hs)
Ejemplo n.º 9
0
    def setUp(self):
        self.as_yaml_files = []
        config = Mock(
            app_service_config_files=self.as_yaml_files
        )
        hs = yield setup_test_homeserver(config=config)

        self.as_token = "token1"
        self.as_url = "some_url"
        self._add_appservice(self.as_token, self.as_url, "some_hs_token", "bob")
        self._add_appservice("token2", "some_url", "some_hs_token", "bob")
        self._add_appservice("token3", "some_url", "some_hs_token", "bob")
        # must be done after inserts
        self.store = ApplicationServiceStore(hs)
Ejemplo n.º 10
0
    def test_duplicate_as_tokens(self):
        f1 = self._write_config(as_token="as_token", suffix="1")
        f2 = self._write_config(as_token="as_token", suffix="2")

        config = Mock(app_service_config_files=[f1, f2], event_cache_size=1)
        hs = yield setup_test_homeserver(config=config, datastore=Mock())

        with self.assertRaises(ConfigError) as cm:
            ApplicationServiceStore(hs)

        e = cm.exception
        self.assertIn(f1, e.message)
        self.assertIn(f2, e.message)
        self.assertIn("as_token", e.message)
Ejemplo n.º 11
0
    def test_unique_works(self):
        f1 = self._write_config(suffix="1")
        f2 = self._write_config(suffix="2")

        config = Mock(app_service_config_files=[f1, f2],
                      event_cache_size=1,
                      password_providers=[])
        hs = yield setup_test_homeserver(
            config=config,
            datastore=Mock(),
            federation_sender=Mock(),
            federation_client=Mock(),
        )

        ApplicationServiceStore(None, hs)
Ejemplo n.º 12
0
def run_upgrade(cur, database_engine, config, *args, **kwargs):
    # NULL indicates user was not registered by an appservice.
    try:
        cur.execute("ALTER TABLE users ADD COLUMN appservice_id TEXT")
    except:
        # Maybe we already added the column? Hope so...
        pass

    cur.execute("SELECT name FROM users")
    rows = cur.fetchall()

    config_files = []
    try:
        config_files = config.app_service_config_files
    except AttributeError:
        logger.warning("Could not get app_service_config_files from config")
        pass

    appservices = ApplicationServiceStore.load_appservices(
        config.server_name, config_files
    )

    owned = {}

    for row in rows:
        user_id = row[0]
        for appservice in appservices:
            if appservice.is_exclusive_user(user_id):
                if user_id in owned.keys():
                    logger.error(
                        "user_id %s was owned by more than one application"
                        " service (IDs %s and %s); assigning arbitrarily to %s" %
                        (user_id, owned[user_id], appservice.id, owned[user_id])
                    )
                owned.setdefault(appservice.id, []).append(user_id)

    for as_id, user_ids in owned.items():
        n = 100
        user_chunks = (user_ids[i:i + 100] for i in xrange(0, len(user_ids), n))
        for chunk in user_chunks:
            cur.execute(
                database_engine.convert_param_style(
                    "UPDATE users SET appservice_id = ? WHERE name IN (%s)" % (
                        ",".join("?" for _ in chunk),
                    )
                ),
                [as_id] + chunk
            )
Ejemplo n.º 13
0
    def test_duplicate_ids(self):
        f1 = self._write_config(id="id", suffix="1")
        f2 = self._write_config(id="id", suffix="2")

        config = Mock(app_service_config_files=[f1, f2],
                      event_cache_size=1,
                      password_providers=[])
        hs = yield setup_test_homeserver(config=config,
                                         datastore=Mock(),
                                         federation_sender=Mock())

        with self.assertRaises(ConfigError) as cm:
            ApplicationServiceStore(hs)

        e = cm.exception
        self.assertIn(f1, e.message)
        self.assertIn(f2, e.message)
        self.assertIn("id", e.message)
Ejemplo n.º 14
0
def run_upgrade(cur, database_engine, config, *args, **kwargs):
    # NULL indicates user was not registered by an appservice.
    try:
        cur.execute("ALTER TABLE users ADD COLUMN appservice_id TEXT")
    except:
        # Maybe we already added the column? Hope so...
        pass

    cur.execute("SELECT name FROM users")
    rows = cur.fetchall()

    config_files = []
    try:
        config_files = config.app_service_config_files
    except AttributeError:
        logger.warning("Could not get app_service_config_files from config")
        pass

    appservices = ApplicationServiceStore.load_appservices(
        config.server_name, config_files)

    owned = {}

    for row in rows:
        user_id = row[0]
        for appservice in appservices:
            if appservice.is_exclusive_user(user_id):
                if user_id in owned.keys():
                    logger.error(
                        "user_id %s was owned by more than one application"
                        " service (IDs %s and %s); assigning arbitrarily to %s"
                        % (user_id, owned[user_id], appservice.id,
                           owned[user_id]))
                owned.setdefault(appservice.id, []).append(user_id)

    for as_id, user_ids in owned.items():
        n = 100
        user_chunks = (user_ids[i:i + 100]
                       for i in xrange(0, len(user_ids), n))
        for chunk in user_chunks:
            cur.execute(
                database_engine.convert_param_style(
                    "UPDATE users SET appservice_id = ? WHERE name IN (%s)" %
                    (",".join("?" for _ in chunk), )), [as_id] + chunk)
Ejemplo n.º 15
0
    def test_duplicate_as_tokens(self):
        f1 = self._write_config(as_token="as_token", suffix="1")
        f2 = self._write_config(as_token="as_token", suffix="2")

        hs = yield setup_test_homeserver(self.addCleanup,
                                         federation_sender=Mock(),
                                         federation_client=Mock())

        hs.config.app_service_config_files = [f1, f2]
        hs.config.event_cache_size = 1
        hs.config.password_providers = []

        with self.assertRaises(ConfigError) as cm:
            ApplicationServiceStore(hs.get_db_conn(), hs)

        e = cm.exception
        self.assertIn(f1, str(e))
        self.assertIn(f2, str(e))
        self.assertIn("as_token", str(e))
Ejemplo n.º 16
0
 def setUp(self):
     db_pool = SQLiteMemoryDbPool()
     yield db_pool.prepare()
     hs = HomeServer(
         "test", db_pool=db_pool, clock=MockClock(), config=Mock()
     )
     self.as_token = "token1"
     db_pool.runQuery(
         "INSERT INTO application_services(token) VALUES(?)",
         (self.as_token,)
     )
     db_pool.runQuery(
         "INSERT INTO application_services(token) VALUES(?)", ("token2",)
     )
     db_pool.runQuery(
         "INSERT INTO application_services(token) VALUES(?)", ("token3",)
     )
     # must be done after inserts
     self.store = ApplicationServiceStore(hs)
Ejemplo n.º 17
0
    def setUp(self):
        self.as_yaml_files = []
        hs = yield setup_test_homeserver(
            self.addCleanup, federation_sender=Mock(), federation_client=Mock()
        )

        hs.config.app_service_config_files = self.as_yaml_files
        hs.config.event_cache_size = 1
        hs.config.password_providers = []

        self.as_token = "token1"
        self.as_url = "some_url"
        self.as_id = "as1"
        self._add_appservice(
            self.as_token, self.as_id, self.as_url, "some_hs_token", "bob"
        )
        self._add_appservice("token2", "as2", "some_url", "some_hs_token", "bob")
        self._add_appservice("token3", "as3", "some_url", "some_hs_token", "bob")
        # must be done after inserts
        self.store = ApplicationServiceStore(hs.get_db_conn(), hs)
Ejemplo n.º 18
0
    def test_duplicate_as_tokens(self):
        f1 = self._write_config(as_token="as_token", suffix="1")
        f2 = self._write_config(as_token="as_token", suffix="2")

        config = Mock(app_service_config_files=[f1, f2],
                      event_cache_size=1,
                      password_providers=[])
        hs = yield setup_test_homeserver(
            config=config,
            datastore=Mock(),
            federation_sender=Mock(),
            federation_client=Mock(),
        )

        with self.assertRaises(ConfigError) as cm:
            ApplicationServiceStore(None, hs)

        e = cm.exception
        self.assertIn(f1, str(e))
        self.assertIn(f2, str(e))
        self.assertIn("as_token", str(e))
Ejemplo n.º 19
0
class ApplicationServiceStoreTestCase(unittest.TestCase):

    @defer.inlineCallbacks
    def setUp(self):
        self.as_yaml_files = []
        config = Mock(
            app_service_config_files=self.as_yaml_files
        )
        hs = yield setup_test_homeserver(config=config)

        self.as_token = "token1"
        self.as_url = "some_url"
        self._add_appservice(self.as_token, self.as_url, "some_hs_token", "bob")
        self._add_appservice("token2", "some_url", "some_hs_token", "bob")
        self._add_appservice("token3", "some_url", "some_hs_token", "bob")
        # must be done after inserts
        self.store = ApplicationServiceStore(hs)

    def tearDown(self):
        # TODO: suboptimal that we need to create files for tests!
        for f in self.as_yaml_files:
            try:
                os.remove(f)
            except:
                pass

    def _add_appservice(self, as_token, url, hs_token, sender):
        as_yaml = dict(url=url, as_token=as_token, hs_token=hs_token,
                       sender_localpart=sender, namespaces={})
        # use the token as the filename
        with open(as_token, 'w') as outfile:
            outfile.write(yaml.dump(as_yaml))
            self.as_yaml_files.append(as_token)

    @defer.inlineCallbacks
    def test_retrieve_unknown_service_token(self):
        service = yield self.store.get_app_service_by_token("invalid_token")
        self.assertEquals(service, None)

    @defer.inlineCallbacks
    def test_retrieval_of_service(self):
        stored_service = yield self.store.get_app_service_by_token(
            self.as_token
        )
        self.assertEquals(stored_service.token, self.as_token)
        self.assertEquals(stored_service.url, self.as_url)
        self.assertEquals(
            stored_service.namespaces[ApplicationService.NS_ALIASES],
            []
        )
        self.assertEquals(
            stored_service.namespaces[ApplicationService.NS_ROOMS],
            []
        )
        self.assertEquals(
            stored_service.namespaces[ApplicationService.NS_USERS],
            []
        )

    @defer.inlineCallbacks
    def test_retrieval_of_all_services(self):
        services = yield self.store.get_app_services()
        self.assertEquals(len(services), 3)
Ejemplo n.º 20
0
class ApplicationServiceStoreTestCase(unittest.TestCase):
    @defer.inlineCallbacks
    def setUp(self):
        db_pool = SQLiteMemoryDbPool()
        yield db_pool.prepare()
        hs = HomeServer("test",
                        db_pool=db_pool,
                        clock=MockClock(),
                        config=Mock())
        self.as_token = "token1"
        db_pool.runQuery("INSERT INTO application_services(token) VALUES(?)",
                         (self.as_token, ))
        db_pool.runQuery("INSERT INTO application_services(token) VALUES(?)",
                         ("token2", ))
        db_pool.runQuery("INSERT INTO application_services(token) VALUES(?)",
                         ("token3", ))
        # must be done after inserts
        self.store = ApplicationServiceStore(hs)

    @defer.inlineCallbacks
    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 = []
        service = ApplicationService(url=url,
                                     hs_token=hs_token,
                                     token=self.as_token,
                                     namespaces={
                                         ApplicationService.NS_USERS:
                                         user_regex,
                                         ApplicationService.NS_ALIASES:
                                         alias_regex,
                                         ApplicationService.NS_ROOMS:
                                         room_regex
                                     })
        yield self.store.update_app_service(service)

        stored_service = yield self.store.get_app_service_by_token(
            self.as_token)
        self.assertEquals(stored_service.token, self.as_token)
        self.assertEquals(stored_service.url, url)
        self.assertEquals(
            stored_service.namespaces[ApplicationService.NS_ALIASES],
            alias_regex)
        self.assertEquals(
            stored_service.namespaces[ApplicationService.NS_ROOMS], room_regex)
        self.assertEquals(
            stored_service.namespaces[ApplicationService.NS_USERS], user_regex)

    @defer.inlineCallbacks
    def test_retrieve_unknown_service_token(self):
        service = yield self.store.get_app_service_by_token("invalid_token")
        self.assertEquals(service, None)

    @defer.inlineCallbacks
    def test_retrieval_of_service(self):
        stored_service = yield self.store.get_app_service_by_token(
            self.as_token)
        self.assertEquals(stored_service.token, self.as_token)
        self.assertEquals(stored_service.url, None)
        self.assertEquals(
            stored_service.namespaces[ApplicationService.NS_ALIASES], [])
        self.assertEquals(
            stored_service.namespaces[ApplicationService.NS_ROOMS], [])
        self.assertEquals(
            stored_service.namespaces[ApplicationService.NS_USERS], [])

    @defer.inlineCallbacks
    def test_retrieval_of_all_services(self):
        services = yield self.store.get_app_services()
        self.assertEquals(len(services), 3)
Ejemplo n.º 21
0
class ApplicationServiceStoreTestCase(unittest.TestCase):
    @defer.inlineCallbacks
    def setUp(self):
        self.as_yaml_files = []
        hs = yield setup_test_homeserver(
            self.addCleanup, federation_sender=Mock(), federation_client=Mock()
        )

        hs.config.app_service_config_files = self.as_yaml_files
        hs.config.event_cache_size = 1
        hs.config.password_providers = []

        self.as_token = "token1"
        self.as_url = "some_url"
        self.as_id = "as1"
        self._add_appservice(
            self.as_token, self.as_id, self.as_url, "some_hs_token", "bob"
        )
        self._add_appservice("token2", "as2", "some_url", "some_hs_token", "bob")
        self._add_appservice("token3", "as3", "some_url", "some_hs_token", "bob")
        # must be done after inserts
        self.store = ApplicationServiceStore(hs.get_db_conn(), hs)

    def tearDown(self):
        # TODO: suboptimal that we need to create files for tests!
        for f in self.as_yaml_files:
            try:
                os.remove(f)
            except Exception:
                pass

    def _add_appservice(self, as_token, id, url, hs_token, sender):
        as_yaml = dict(
            url=url,
            as_token=as_token,
            hs_token=hs_token,
            id=id,
            sender_localpart=sender,
            namespaces={},
        )
        # use the token as the filename
        with open(as_token, 'w') as outfile:
            outfile.write(yaml.dump(as_yaml))
            self.as_yaml_files.append(as_token)

    def test_retrieve_unknown_service_token(self):
        service = self.store.get_app_service_by_token("invalid_token")
        self.assertEquals(service, None)

    def test_retrieval_of_service(self):
        stored_service = self.store.get_app_service_by_token(self.as_token)
        self.assertEquals(stored_service.token, self.as_token)
        self.assertEquals(stored_service.id, self.as_id)
        self.assertEquals(stored_service.url, self.as_url)
        self.assertEquals(stored_service.namespaces[ApplicationService.NS_ALIASES], [])
        self.assertEquals(stored_service.namespaces[ApplicationService.NS_ROOMS], [])
        self.assertEquals(stored_service.namespaces[ApplicationService.NS_USERS], [])

    def test_retrieval_of_all_services(self):
        services = self.store.get_app_services()
        self.assertEquals(len(services), 3)
Ejemplo n.º 22
0
class ApplicationServiceStoreTestCase(unittest.TestCase):

    @defer.inlineCallbacks
    def setUp(self):
        db_pool = SQLiteMemoryDbPool()
        yield db_pool.prepare()
        hs = HomeServer(
            "test", db_pool=db_pool, clock=MockClock(), config=Mock()
        )
        self.as_token = "token1"
        db_pool.runQuery(
            "INSERT INTO application_services(token) VALUES(?)",
            (self.as_token,)
        )
        db_pool.runQuery(
            "INSERT INTO application_services(token) VALUES(?)", ("token2",)
        )
        db_pool.runQuery(
            "INSERT INTO application_services(token) VALUES(?)", ("token3",)
        )
        # must be done after inserts
        self.store = ApplicationServiceStore(hs)

    @defer.inlineCallbacks
    def test_update_and_retrieval_of_service(self):
        url = "https://matrix.org/appservices/foobar"
        hs_token = "hstok"
        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,
                ApplicationService.NS_ALIASES: alias_regex,
                ApplicationService.NS_ROOMS: room_regex
        })
        yield self.store.update_app_service(service)

        stored_service = yield self.store.get_app_service_by_token(
            self.as_token
        )
        self.assertEquals(stored_service.token, self.as_token)
        self.assertEquals(stored_service.url, url)
        self.assertEquals(
            stored_service.namespaces[ApplicationService.NS_ALIASES],
            alias_regex
        )
        self.assertEquals(
            stored_service.namespaces[ApplicationService.NS_ROOMS],
            room_regex
        )
        self.assertEquals(
            stored_service.namespaces[ApplicationService.NS_USERS],
            user_regex
        )

    @defer.inlineCallbacks
    def test_retrieve_unknown_service_token(self):
        service = yield self.store.get_app_service_by_token("invalid_token")
        self.assertEquals(service, None)

    @defer.inlineCallbacks
    def test_retrieval_of_service(self):
        stored_service = yield self.store.get_app_service_by_token(
            self.as_token
        )
        self.assertEquals(stored_service.token, self.as_token)
        self.assertEquals(stored_service.url, None)
        self.assertEquals(
            stored_service.namespaces[ApplicationService.NS_ALIASES],
            []
        )
        self.assertEquals(
            stored_service.namespaces[ApplicationService.NS_ROOMS],
            []
        )
        self.assertEquals(
            stored_service.namespaces[ApplicationService.NS_USERS],
            []
        )

    @defer.inlineCallbacks
    def test_retrieval_of_all_services(self):
        services = yield self.store.get_app_services()
        self.assertEquals(len(services), 3)
Ejemplo n.º 23
0
class ApplicationServiceStoreTestCase(unittest.TestCase):
    @defer.inlineCallbacks
    def setUp(self):
        self.as_yaml_files = []
        hs = yield setup_test_homeserver(self.addCleanup,
                                         federation_sender=Mock(),
                                         federation_client=Mock())

        hs.config.app_service_config_files = self.as_yaml_files
        hs.config.event_cache_size = 1
        hs.config.password_providers = []

        self.as_token = "token1"
        self.as_url = "some_url"
        self.as_id = "as1"
        self._add_appservice(self.as_token, self.as_id, self.as_url,
                             "some_hs_token", "bob")
        self._add_appservice("token2", "as2", "some_url", "some_hs_token",
                             "bob")
        self._add_appservice("token3", "as3", "some_url", "some_hs_token",
                             "bob")
        # must be done after inserts
        self.store = ApplicationServiceStore(hs.get_db_conn(), hs)

    def tearDown(self):
        # TODO: suboptimal that we need to create files for tests!
        for f in self.as_yaml_files:
            try:
                os.remove(f)
            except Exception:
                pass

    def _add_appservice(self, as_token, id, url, hs_token, sender):
        as_yaml = dict(
            url=url,
            as_token=as_token,
            hs_token=hs_token,
            id=id,
            sender_localpart=sender,
            namespaces={},
        )
        # use the token as the filename
        with open(as_token, 'w') as outfile:
            outfile.write(yaml.dump(as_yaml))
            self.as_yaml_files.append(as_token)

    def test_retrieve_unknown_service_token(self):
        service = self.store.get_app_service_by_token("invalid_token")
        self.assertEquals(service, None)

    def test_retrieval_of_service(self):
        stored_service = self.store.get_app_service_by_token(self.as_token)
        self.assertEquals(stored_service.token, self.as_token)
        self.assertEquals(stored_service.id, self.as_id)
        self.assertEquals(stored_service.url, self.as_url)
        self.assertEquals(
            stored_service.namespaces[ApplicationService.NS_ALIASES], [])
        self.assertEquals(
            stored_service.namespaces[ApplicationService.NS_ROOMS], [])
        self.assertEquals(
            stored_service.namespaces[ApplicationService.NS_USERS], [])

    def test_retrieval_of_all_services(self):
        services = self.store.get_app_services()
        self.assertEquals(len(services), 3)