diff options
55 files changed, 311 insertions, 323 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d301b45a..839de025 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,9 @@ +stages: + - test + - trigger + test: + stage: test tags: - docker image: ubuntu:latest @@ -6,3 +11,11 @@ test: - apt update - apt install -y python3 cython3 gpg - ./run_tests.py + +trigger_poezio: + stage: trigger + tags: + - docker + image: appropriate/curl:latest + script: + - curl --request POST -F token="$SLIXMPP_TRIGGER_TOKEN" -F ref=master https://lab.louiz.org/api/v4/projects/18/trigger/pipeline @@ -1,6 +1,7 @@ Pre-requisites: - Python 3.5+ - Cython 0.22 and libidn, optionally (making JID faster by compiling the stringprep module) +- GnuPG, for testing Install: > python3 setup.py install diff --git a/docs/conf.py b/docs/conf.py index 8f711a16..208c0cdf 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -12,12 +12,17 @@ # serve to show the default. import sys, os +import datetime # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.insert(0, os.path.abspath('..')) +# get version automagically from source tree +from slixmpp.version import __version__ as version +release = ".".join(version.split(".")[0:2]) + # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. @@ -41,16 +46,18 @@ master_doc = 'index' # General information about the project. project = u'Slixmpp' -copyright = u'2011, Nathan Fritz, Lance Stout' +year = datetime.datetime.now().year +copyright = u'{}, Nathan Fritz, Lance Stout'.format(year) # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # +# auto imported from code! # The short X.Y version. -version = '1.1' +# version = '1.4' # The full version, including alpha/beta/rc tags. -release = '1.1' +# release = '1.4.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/examples/confirm_answer.py b/examples/confirm_answer.py index 9cfe30f1..f2c4c273 100755 --- a/examples/confirm_answer.py +++ b/examples/confirm_answer.py @@ -15,7 +15,6 @@ from argparse import ArgumentParser import slixmpp from slixmpp.exceptions import XMPPError -from slixmpp import asyncio log = logging.getLogger(__name__) diff --git a/examples/confirm_ask.py b/examples/confirm_ask.py index e3cd184a..27fdfde7 100755 --- a/examples/confirm_ask.py +++ b/examples/confirm_ask.py @@ -51,18 +51,17 @@ class AskConfirm(slixmpp.ClientXMPP): else: self.confirmed.set_result(True) - @asyncio.coroutine - def start(self, event): + async def start(self, event): log.info('Sending confirm request %s to %s who wants to access %s using ' 'method %s...' % (self.id, self.recipient, self.url, self.method)) try: - confirmed = yield from self['xep_0070'].ask_confirm(self.recipient, + confirmed = await self['xep_0070'].ask_confirm(self.recipient, id=self.id, url=self.url, method=self.method, message='Plz say yes or no for {method} {url} ({id}).') if isinstance(confirmed, slixmpp.Message): - confirmed = yield from self.confirmed + confirmed = await self.confirmed else: confirmed = True except IqError: diff --git a/examples/disco_browser.py b/examples/disco_browser.py index a9e8711f..f0ece32d 100755 --- a/examples/disco_browser.py +++ b/examples/disco_browser.py @@ -15,7 +15,6 @@ from argparse import ArgumentParser import slixmpp from slixmpp.exceptions import IqError, IqTimeout -from slixmpp.xmlstream.asyncio import asyncio class Disco(slixmpp.ClientXMPP): @@ -54,8 +53,7 @@ class Disco(slixmpp.ClientXMPP): # our roster. self.add_event_handler("session_start", self.start) - @asyncio.coroutine - def start(self, event): + async def start(self, event): """ Process the session_start event. @@ -77,13 +75,13 @@ class Disco(slixmpp.ClientXMPP): try: if self.get in self.info_types: # function using the callback parameter. - info = yield from self['xep_0030'].get_info(jid=self.target_jid, + info = await self['xep_0030'].get_info(jid=self.target_jid, node=self.target_node) if self.get in self.items_types: # The same applies from above. Listen for the # disco_items event or pass a callback function # if you need to process a non-blocking request. - items = yield from self['xep_0030'].get_items(jid=self.target_jid, + items = await self['xep_0030'].get_items(jid=self.target_jid, node=self.target_node) if self.get not in self.info_types and self.get not in self.items_types: logging.error("Invalid disco request type.") diff --git a/examples/download_avatars.py b/examples/download_avatars.py index 408c2146..02591e3e 100755 --- a/examples/download_avatars.py +++ b/examples/download_avatars.py @@ -47,8 +47,7 @@ class AvatarDownloader(slixmpp.ClientXMPP): self.roster_received.set() self.presences_received.clear() - @asyncio.coroutine - def start(self, event): + async def start(self, event): """ Process the session_start event. @@ -65,16 +64,15 @@ class AvatarDownloader(slixmpp.ClientXMPP): self.get_roster(callback=self.roster_received_cb) print('Waiting for presence updates...\n') - yield from self.roster_received.wait() + await self.roster_received.wait() print('Roster received') - yield from self.presences_received.wait() + await self.presences_received.wait() self.disconnect() - @asyncio.coroutine - def on_vcard_avatar(self, pres): + async def on_vcard_avatar(self, pres): print("Received vCard avatar update from %s" % pres['from'].bare) try: - result = yield from self['xep_0054'].get_vcard(pres['from'].bare, cached=True, + result = await self['xep_0054'].get_vcard(pres['from'].bare, cached=True, timeout=5) except XMPPError: print("Error retrieving avatar for %s" % pres['from']) @@ -89,14 +87,13 @@ class AvatarDownloader(slixmpp.ClientXMPP): with open(filename, 'wb+') as img: img.write(avatar['BINVAL']) - @asyncio.coroutine - def on_avatar(self, msg): + async def on_avatar(self, msg): print("Received avatar update from %s" % msg['from']) metadata = msg['pubsub_event']['items']['item']['avatar_metadata'] for info in metadata['items']: if not info['url']: try: - result = yield from self['xep_0084'].retrieve_avatar(msg['from'].bare, info['id'], + result = await self['xep_0084'].retrieve_avatar(msg['from'].bare, info['id'], timeout=5) except XMPPError: print("Error retrieving avatar for %s" % msg['from']) diff --git a/examples/http_upload.py b/examples/http_upload.py index e34b7b01..268a22dc 100755 --- a/examples/http_upload.py +++ b/examples/http_upload.py @@ -14,7 +14,6 @@ from getpass import getpass from argparse import ArgumentParser import slixmpp -from slixmpp import asyncio log = logging.getLogger(__name__) @@ -25,18 +24,21 @@ class HttpUpload(slixmpp.ClientXMPP): A basic client asking an entity if they confirm the access to an HTTP URL. """ - def __init__(self, jid, password, recipient, filename): + def __init__(self, jid, password, recipient, filename, domain=None): slixmpp.ClientXMPP.__init__(self, jid, password) self.recipient = recipient self.filename = filename + self.domain = domain self.add_event_handler("session_start", self.start) - @asyncio.coroutine - def start(self, event): + async def start(self, event): log.info('Uploading file %s...', self.filename) - url = yield from self['xep_0363'].upload_file(self.filename) + def timeout_callback(arg): + raise TimeoutError("could not send message in time") + url = await self['xep_0363'].upload_file( + self.filename, domain=self.domain, timeout=10, timeout_callback=timeout_callback) log.info('Upload success!') log.info('Sending file to %s', self.recipient) @@ -70,6 +72,8 @@ if __name__ == '__main__': help="Recipient JID") parser.add_argument("-f", "--file", required=True, help="File to send") + parser.add_argument("--domain", + help="Domain to use for HTTP File Upload (leave out for your own server’s)") args = parser.parse_args() @@ -82,7 +86,7 @@ if __name__ == '__main__': if args.password is None: args.password = getpass("Password: ") - xmpp = HttpUpload(args.jid, args.password, args.recipient, args.file) + xmpp = HttpUpload(args.jid, args.password, args.recipient, args.file, args.domain) xmpp.register_plugin('xep_0071') xmpp.register_plugin('xep_0128') xmpp.register_plugin('xep_0363') diff --git a/examples/ibb_transfer/ibb_sender.py b/examples/ibb_transfer/ibb_sender.py index f1c0cab2..8600ac80 100755 --- a/examples/ibb_transfer/ibb_sender.py +++ b/examples/ibb_transfer/ibb_sender.py @@ -9,7 +9,6 @@ See the file LICENSE for copying permission. """ -import asyncio import logging from getpass import getpass from argparse import ArgumentParser @@ -39,8 +38,7 @@ class IBBSender(slixmpp.ClientXMPP): # our roster. self.add_event_handler("session_start", self.start) - @asyncio.coroutine - def start(self, event): + async def start(self, event): """ Process the session_start event. @@ -58,13 +56,13 @@ class IBBSender(slixmpp.ClientXMPP): try: # Open the IBB stream in which to write to. - stream = yield from self['xep_0047'].open_stream(self.receiver, use_messages=self.use_messages) + stream = await self['xep_0047'].open_stream(self.receiver, use_messages=self.use_messages) # If you want to send in-memory bytes, use stream.sendall() instead. - yield from stream.sendfile(self.file, timeout=10) + await stream.sendfile(self.file, timeout=10) # And finally close the stream. - yield from stream.close(timeout=10) + await stream.close(timeout=10) except (IqError, IqTimeout): print('File transfer errored') else: diff --git a/examples/mam.py b/examples/mam.py index 5f9dde3a..cd6b738a 100755 --- a/examples/mam.py +++ b/examples/mam.py @@ -15,7 +15,6 @@ from argparse import ArgumentParser import slixmpp from slixmpp.exceptions import XMPPError -from slixmpp import asyncio log = logging.getLogger(__name__) diff --git a/examples/ping.py b/examples/ping.py index 39118ac4..cb1bb968 100755 --- a/examples/ping.py +++ b/examples/ping.py @@ -13,7 +13,6 @@ import logging from getpass import getpass from argparse import ArgumentParser from slixmpp.exceptions import IqError, IqTimeout -from slixmpp import asyncio import slixmpp @@ -38,8 +37,7 @@ class PingTest(slixmpp.ClientXMPP): # our roster. self.add_event_handler("session_start", self.start) - @asyncio.coroutine - def start(self, event): + async def start(self, event): """ Process the session_start event. @@ -56,7 +54,7 @@ class PingTest(slixmpp.ClientXMPP): self.get_roster() try: - rtt = yield from self['xep_0199'].ping(self.pingjid, + rtt = await self['xep_0199'].ping(self.pingjid, timeout=10) logging.info("Success! RTT: %s", rtt) except IqError as e: diff --git a/examples/pubsub_client.py b/examples/pubsub_client.py index 9a1d4bb6..480c7d89 100755 --- a/examples/pubsub_client.py +++ b/examples/pubsub_client.py @@ -5,7 +5,6 @@ import logging from getpass import getpass from argparse import ArgumentParser -import asyncio import slixmpp from slixmpp.exceptions import XMPPError from slixmpp.xmlstream import ET, tostring @@ -32,87 +31,86 @@ class PubsubClient(slixmpp.ClientXMPP): self.add_event_handler('session_start', self.start) - @asyncio.coroutine - def start(self, event): + async def start(self, event): self.get_roster() self.send_presence() try: - yield from getattr(self, self.action)() + await getattr(self, self.action)() except: logging.exception('Could not execute %s:', self.action) self.disconnect() - def nodes(self): + async def nodes(self): try: - result = yield from self['xep_0060'].get_nodes(self.pubsub_server, self.node) + result = await self['xep_0060'].get_nodes(self.pubsub_server, self.node) for item in result['disco_items']['items']: logging.info(' - %s', str(item)) except XMPPError as error: logging.error('Could not retrieve node list: %s', error.format()) - def create(self): + async def create(self): try: - yield from self['xep_0060'].create_node(self.pubsub_server, self.node) + await self['xep_0060'].create_node(self.pubsub_server, self.node) logging.info('Created node %s', self.node) except XMPPError as error: logging.error('Could not create node %s: %s', self.node, error.format()) - def delete(self): + async def delete(self): try: - yield from self['xep_0060'].delete_node(self.pubsub_server, self.node) + await self['xep_0060'].delete_node(self.pubsub_server, self.node) logging.info('Deleted node %s', self.node) except XMPPError as error: logging.error('Could not delete node %s: %s', self.node, error.format()) - def get_configure(self): + async def get_configure(self): try: - configuration_form = yield from self['xep_0060'].get_node_config(self.pubsub_server, self.node) + configuration_form = await self['xep_0060'].get_node_config(self.pubsub_server, self.node) logging.info('Configure form received from node %s: %s', self.node, configuration_form['pubsub_owner']['configure']['form']) except XMPPError as error: logging.error('Could not retrieve configure form from node %s: %s', self.node, error.format()) - def publish(self): + async def publish(self): payload = ET.fromstring("<test xmlns='test'>%s</test>" % self.data) try: - result = yield from self['xep_0060'].publish(self.pubsub_server, self.node, payload=payload) + result = await self['xep_0060'].publish(self.pubsub_server, self.node, payload=payload) logging.info('Published at item id: %s', result['pubsub']['publish']['item']['id']) except XMPPError as error: logging.error('Could not publish to %s: %s', self.node, error.format()) - def get(self): + async def get(self): try: - result = yield from self['xep_0060'].get_item(self.pubsub_server, self.node, self.data) + result = await self['xep_0060'].get_item(self.pubsub_server, self.node, self.data) for item in result['pubsub']['items']['substanzas']: logging.info('Retrieved item %s: %s', item['id'], tostring(item['payload'])) except XMPPError as error: logging.error('Could not retrieve item %s from node %s: %s', self.data, self.node, error.format()) - def retract(self): + async def retract(self): try: - yield from self['xep_0060'].retract(self.pubsub_server, self.node, self.data) + await self['xep_0060'].retract(self.pubsub_server, self.node, self.data) logging.info('Retracted item %s from node %s', self.data, self.node) except XMPPError as error: logging.error('Could not retract item %s from node %s: %s', self.data, self.node, error.format()) - def purge(self): + async def purge(self): try: - yield from self['xep_0060'].purge(self.pubsub_server, self.node) + await self['xep_0060'].purge(self.pubsub_server, self.node) logging.info('Purged all items from node %s', self.node) except XMPPError as error: logging.error('Could not purge items from node %s: %s', self.node, error.format()) - def subscribe(self): + async def subscribe(self): try: - iq = yield from self['xep_0060'].subscribe(self.pubsub_server, self.node) + iq = await self['xep_0060'].subscribe(self.pubsub_server, self.node) subscription = iq['pubsub']['subscription'] logging.info('Subscribed %s to node %s', subscription['jid'], subscription['node']) except XMPPError as error: logging.error('Could not subscribe %s to node %s: %s', self.boundjid.bare, self.node, error.format()) - def unsubscribe(self): + async def unsubscribe(self): try: - yield from self['xep_0060'].unsubscribe(self.pubsub_server, self.node) + await self['xep_0060'].unsubscribe(self.pubsub_server, self.node) logging.info('Unsubscribed %s from node %s', self.boundjid.bare, self.node) except XMPPError as error: logging.error('Could not unsubscribe %s from node %s: %s', self.boundjid.bare, self.node, error.format()) diff --git a/examples/register_account.py b/examples/register_account.py index 8ec238e9..76b5fcfc 100755 --- a/examples/register_account.py +++ b/examples/register_account.py @@ -66,7 +66,7 @@ class RegisterBot(slixmpp.ClientXMPP): # We're only concerned about registering, so nothing more to do here. self.disconnect() - def register(self, iq): + async def register(self, iq): """ Fill out and submit a registration form. @@ -90,7 +90,7 @@ class RegisterBot(slixmpp.ClientXMPP): resp['register']['password'] = self.password try: - yield from resp.send() + await resp.send() logging.info("Account created for %s!" % self.boundjid) except IqError as e: logging.error("Could not register account: %s" % diff --git a/examples/roster_browser.py b/examples/roster_browser.py index eb92ad2a..6ad8b2a4 100755 --- a/examples/roster_browser.py +++ b/examples/roster_browser.py @@ -38,8 +38,7 @@ class RosterBrowser(slixmpp.ClientXMPP): self.received = set() self.presences_received = asyncio.Event() - @asyncio.coroutine - def start(self, event): + async def start(self, event): """ Process the session_start event. @@ -57,7 +56,7 @@ class RosterBrowser(slixmpp.ClientXMPP): future.set_result(None) try: self.get_roster(callback=callback) - yield from future + await future except IqError as err: print('Error: %s' % err.iq['error']['condition']) except IqTimeout: @@ -66,7 +65,7 @@ class RosterBrowser(slixmpp.ClientXMPP): print('Waiting for presence updates...\n') - yield from asyncio.sleep(10) + await asyncio.sleep(10) print('Roster for %s' % self.boundjid.bare) groups = self.client_roster.groups() diff --git a/examples/s5b_transfer/s5b_receiver.py b/examples/s5b_transfer/s5b_receiver.py index bedeaa04..d97d4777 100755 --- a/examples/s5b_transfer/s5b_receiver.py +++ b/examples/s5b_transfer/s5b_receiver.py @@ -9,7 +9,6 @@ See the file LICENSE for copying permission. """ -import asyncio import logging from getpass import getpass from argparse import ArgumentParser diff --git a/examples/s5b_transfer/s5b_sender.py b/examples/s5b_transfer/s5b_sender.py index 70a9704f..7ef5c99c 100755 --- a/examples/s5b_transfer/s5b_sender.py +++ b/examples/s5b_transfer/s5b_sender.py @@ -9,7 +9,6 @@ See the file LICENSE for copying permission. """ -import asyncio import logging from getpass import getpass from argparse import ArgumentParser @@ -36,8 +35,7 @@ class S5BSender(slixmpp.ClientXMPP): # and the XML streams are ready for use. self.add_event_handler("session_start", self.start) - @asyncio.coroutine - def start(self, event): + async def start(self, event): """ Process the session_start event. @@ -53,14 +51,14 @@ class S5BSender(slixmpp.ClientXMPP): try: # Open the S5B stream in which to write to. - proxy = yield from self['xep_0065'].handshake(self.receiver) + proxy = await self['xep_0065'].handshake(self.receiver) # Send the entire file. while True: data = self.file.read(1048576) if not data: break - yield from proxy.write(data) + await proxy.write(data) # And finally close the stream. proxy.transport.write_eof() diff --git a/examples/set_avatar.py b/examples/set_avatar.py index f9641b1e..6579b2e7 100755 --- a/examples/set_avatar.py +++ b/examples/set_avatar.py @@ -18,7 +18,6 @@ from argparse import ArgumentParser import slixmpp from slixmpp.exceptions import XMPPError -from slixmpp import asyncio class AvatarSetter(slixmpp.ClientXMPP): @@ -33,8 +32,7 @@ class AvatarSetter(slixmpp.ClientXMPP): self.filepath = filepath - @asyncio.coroutine - def start(self, event): + async def start(self, event): """ Process the session_start event. @@ -68,20 +66,20 @@ class AvatarSetter(slixmpp.ClientXMPP): used_xep84 = False print('Publish XEP-0084 avatar data') - result = yield from self['xep_0084'].publish_avatar(avatar) + result = await self['xep_0084'].publish_avatar(avatar) if isinstance(result, XMPPError): print('Could not publish XEP-0084 avatar') else: used_xep84 = True print('Update vCard with avatar') - result = yield from self['xep_0153'].set_avatar(avatar=avatar, mtype=avatar_type) + result = await self['xep_0153'].set_avatar(avatar=avatar, mtype=avatar_type) if isinstance(result, XMPPError): print('Could not set vCard avatar') if used_xep84: print('Advertise XEP-0084 avatar metadata') - result = yield from self['xep_0084'].publish_avatar_metadata([ + result = await self['xep_0084'].publish_avatar_metadata([ {'id': avatar_id, 'type': avatar_type, 'bytes': avatar_bytes} @@ -84,7 +84,7 @@ setup( platforms=['any'], packages=packages, ext_modules=ext_modules, - install_requires=['aiodns>=1.0', 'pyasn1', 'pyasn1_modules'], + install_requires=['aiodns>=1.0', 'pyasn1', 'pyasn1_modules', 'aiohttp'], classifiers=CLASSIFIERS, cmdclass={'test': TestCommand} ) diff --git a/slixmpp/features/feature_mechanisms/mechanisms.py b/slixmpp/features/feature_mechanisms/mechanisms.py index 30449de0..26af1947 100644 --- a/slixmpp/features/feature_mechanisms/mechanisms.py +++ b/slixmpp/features/feature_mechanisms/mechanisms.py @@ -97,7 +97,10 @@ class FeatureMechanisms(BasePlugin): jid = self.xmpp.requested_jid.bare result[value] = creds.get('email', jid) elif value == 'channel_binding': - result[value] = self.xmpp.socket.get_channel_binding() + if isinstance(self.xmpp.socket, (ssl.SSLSocket, ssl.SSLObject)): + result[value] = self.xmpp.socket.get_channel_binding() + else: + result[value] = None elif value == 'host': result[value] = creds.get('host', self.xmpp.requested_jid.domain) elif value == 'realm': diff --git a/slixmpp/jid.py b/slixmpp/jid.py index 9cb815db..dd6c1047 100644 --- a/slixmpp/jid.py +++ b/slixmpp/jid.py @@ -347,30 +347,10 @@ class JID: return self._node @property - def user(self): - return self._node - - @property - def local(self): - return self._node - - @property - def username(self): - return self._node - - @property def domain(self): return self._domain @property - def server(self): - return self._domain - - @property - def host(self): - return self._domain - - @property def resource(self): return self._resource @@ -382,45 +362,16 @@ class JID: def full(self): return self._full - @property - def jid(self): - return self._full - @node.setter def node(self, value): self._node = _validate_node(value) self._update_bare_full() - @user.setter - def user(self, value): - self._node = _validate_node(value) - self._update_bare_full() - - @local.setter - def local(self, value): - self._node = _validate_node(value) - self._update_bare_full() - - @username.setter - def username(self, value): - self._node = _validate_node(value) - self._update_bare_full() - @domain.setter def domain(self, value): self._domain = _validate_domain(value) self._update_bare_full() - @server.setter - def server(self, value): - self._domain = _validate_domain(value) - self._update_bare_full() - - @host.setter - def host(self, value): - self._domain = _validate_domain(value) - self._update_bare_full() - @bare.setter def bare(self, value): node, domain, resource = _parse_jid(value) @@ -439,10 +390,14 @@ class JID: self._node, self._domain, self._resource = _parse_jid(value) self._update_bare_full() - @jid.setter - def jid(self, value): - self._node, self._domain, self._resource = _parse_jid(value) - self._update_bare_full() + user = node + local = node + username = node + + server = domain + host = domain + + jid = full def __str__(self): """Use the full JID as the string value.""" diff --git a/slixmpp/plugins/xep_0030/disco.py b/slixmpp/plugins/xep_0030/disco.py index ea9a33f4..59b1e0cc 100644 --- a/slixmpp/plugins/xep_0030/disco.py +++ b/slixmpp/plugins/xep_0030/disco.py @@ -299,23 +299,27 @@ class XEP_0030(BasePlugin): return self.api['has_identity'](jid, node, ifrom, data) async def get_info_from_domain(self, domain=None, timeout=None, - cached=True, callback=None, **kwargs): + cached=True, callback=None): if domain is None: domain = self.xmpp.boundjid.domain if not cached or domain not in self.domain_infos: infos = [self.get_info( - domain, timeout=timeout, **kwargs)] + domain, timeout=timeout)] iq_items = await self.get_items( - domain, timeout=timeout, **kwargs) + domain, timeout=timeout) items = iq_items['disco_items']['items'] infos += [ - self.get_info(item[0], timeout=timeout, **kwargs) + self.get_info(item[0], timeout=timeout) for item in items] - info_futures, _ = await asyncio.wait(infos, timeout=timeout) + info_futures, _ = await asyncio.wait( + infos, + timeout=timeout, + loop=self.xmpp.loop + ) self.domain_infos[domain] = [ - future.result() for future in info_futures] + future.result() for future in info_futures if not future.exception()] results = self.domain_infos[domain] diff --git a/slixmpp/plugins/xep_0077/register.py b/slixmpp/plugins/xep_0077/register.py index 8c0c6f09..a7c6780f 100644 --- a/slixmpp/plugins/xep_0077/register.py +++ b/slixmpp/plugins/xep_0077/register.py @@ -59,7 +59,7 @@ class XEP_0077(BasePlugin): def _force_stream_feature(self, stanza): if isinstance(stanza, StreamFeatures): - if self.xmpp.use_tls or self.xmpp.use_ssl: + if not self.xmpp.disable_starttls: if 'starttls' not in self.xmpp.features: return stanza elif not isinstance(self.xmpp.socket, ssl.SSLSocket): diff --git a/slixmpp/plugins/xep_0153/vcard_avatar.py b/slixmpp/plugins/xep_0153/vcard_avatar.py index 6430e8d6..cf10283a 100644 --- a/slixmpp/plugins/xep_0153/vcard_avatar.py +++ b/slixmpp/plugins/xep_0153/vcard_avatar.py @@ -167,10 +167,7 @@ class XEP_0153(BasePlugin): data = pres['vcard_temp_update']['photo'] if data is None: return - elif data == '' or data != self.api['get_hash'](pres['from']): - ifrom = pres['to'] if self.xmpp.is_component else None - self.api['reset_hash'](pres['from'], ifrom=ifrom) - self.xmpp.event('vcard_avatar_update', pres) + self.xmpp.event('vcard_avatar_update', pres) # ================================================================= diff --git a/slixmpp/plugins/xep_0163.py b/slixmpp/plugins/xep_0163.py index 047ca5d3..4c302efa 100644 --- a/slixmpp/plugins/xep_0163.py +++ b/slixmpp/plugins/xep_0163.py @@ -62,7 +62,10 @@ class XEP_0163(BasePlugin): for ns in namespace: self.xmpp['xep_0030'].add_feature('%s+notify' % ns, jid=jid) - asyncio.ensure_future(self.xmpp['xep_0115'].update_caps(jid)) + asyncio.ensure_future( + self.xmpp['xep_0115'].update_caps(jid), + loop=self.xmpp.loop, + ) def remove_interest(self, namespace, jid=None): """ @@ -81,7 +84,10 @@ class XEP_0163(BasePlugin): for ns in namespace: self.xmpp['xep_0030'].del_feature(jid=jid, feature='%s+notify' % namespace) - asyncio.ensure_future(self.xmpp['xep_0115'].update_caps(jid)) + asyncio.ensure_future( + self.xmpp['xep_0115'].update_caps(jid), + loop=self.xmpp.loop, + ) def publish(self, stanza, node=None, id=None, options=None, ifrom=None, timeout_callback=None, callback=None, timeout=None): diff --git a/slixmpp/plugins/xep_0199/ping.py b/slixmpp/plugins/xep_0199/ping.py index 1153389b..f1070305 100644 --- a/slixmpp/plugins/xep_0199/ping.py +++ b/slixmpp/plugins/xep_0199/ping.py @@ -95,7 +95,10 @@ class XEP_0199(BasePlugin): self.timeout = timeout self.keepalive = True - handler = lambda event=None: asyncio.ensure_future(self._keepalive(event)) + handler = lambda event=None: asyncio.ensure_future( + self._keepalive(event), + loop=self.xmpp.loop, + ) self.xmpp.schedule('Ping keepalive', self.interval, handler, diff --git a/slixmpp/plugins/xep_0223.py b/slixmpp/plugins/xep_0223.py index 65d591f6..18875eee 100644 --- a/slixmpp/plugins/xep_0223.py +++ b/slixmpp/plugins/xep_0223.py @@ -26,7 +26,7 @@ class XEP_0223(BasePlugin): dependencies = {'xep_0163', 'xep_0060', 'xep_0004'} profile = {'pubsub#persist_items': True, - 'pubsub#send_last_published_item': 'never'} + 'pubsub#access_model': 'whitelist'} def configure(self, node, ifrom=None, callback=None, timeout=None): """ diff --git a/slixmpp/plugins/xep_0363/http_upload.py b/slixmpp/plugins/xep_0363/http_upload.py index 65894975..266fc656 100644 --- a/slixmpp/plugins/xep_0363/http_upload.py +++ b/slixmpp/plugins/xep_0363/http_upload.py @@ -6,7 +6,6 @@ See the file LICENSE for copying permission. """ -import asyncio import logging import os.path @@ -31,6 +30,10 @@ class UploadServiceNotFound(FileUploadError): class FileTooBig(FileUploadError): pass +class HTTPError(FileUploadError): + def __str__(self): + return 'Could not upload file: %d (%s)' % (self.args[0], self.args[1]) + class XEP_0363(BasePlugin): ''' This plugin only supports Python 3.5+ ''' @@ -68,12 +71,18 @@ class XEP_0363(BasePlugin): def _handle_request(self, iq): self.xmpp.event('http_upload_request', iq) - async def find_upload_service(self, timeout=None): - results = await self.xmpp['xep_0030'].get_info_from_domain() + async def find_upload_service(self, domain=None, timeout=None): + results = await self.xmpp['xep_0030'].get_info_from_domain( + domain=domain, timeout=timeout) + candidates = [] for info in results: for identity in info['disco_info']['identities']: if identity[0] == 'store' and identity[1] == 'file': + candidates.append(info) + for info in candidates: + for feature in info['disco_info']['features']: + if feature == Request.namespace: return info def request_slot(self, jid, filename, size, content_type=None, ifrom=None, @@ -90,11 +99,12 @@ class XEP_0363(BasePlugin): timeout_callback=timeout_callback) async def upload_file(self, filename, size=None, content_type=None, *, - input_file=None, ifrom=None, timeout=None, + input_file=None, ifrom=None, domain=None, timeout=None, callback=None, timeout_callback=None): ''' Helper function which does all of the uploading process. ''' if self.upload_service is None: - info_iq = await self.find_upload_service(timeout=timeout) + info_iq = await self.find_upload_service( + domain=domain, timeout=timeout) if info_iq is None: raise UploadServiceNotFound() self.upload_service = info_iq['from'] @@ -125,7 +135,8 @@ class XEP_0363(BasePlugin): basename = os.path.basename(filename) slot_iq = await self.request_slot(self.upload_service, basename, size, - content_type, ifrom, timeout) + content_type, ifrom, timeout, + timeout_callback=timeout_callback) slot = slot_iq['http_upload_slot'] headers = { @@ -141,6 +152,8 @@ class XEP_0363(BasePlugin): data=input_file, headers=headers, timeout=timeout) + if response.status >= 400: + raise HTTPError(response.status, await response.text()) log.info('Response code: %d (%s)', response.status, await response.text()) response.close() return slot['get']['url'] diff --git a/slixmpp/stanza/iq.py b/slixmpp/stanza/iq.py index 385bbbd9..a3f16e2f 100644 --- a/slixmpp/stanza/iq.py +++ b/slixmpp/stanza/iq.py @@ -187,6 +187,10 @@ class Iq(RootStanza): future = asyncio.Future() + # Prevents handlers from existing forever. + if timeout is None: + timeout = 120 + def callback_success(result): type_ = result['type'] if type_ == 'result': diff --git a/slixmpp/test/slixtest.py b/slixmpp/test/slixtest.py index b307b5c6..ff185368 100644 --- a/slixmpp/test/slixtest.py +++ b/slixmpp/test/slixtest.py @@ -222,7 +222,7 @@ class SlixTest(unittest.TestCase): if Matcher is None: raise ValueError("Unknown matching method.") test = Matcher(criteria) - self.failUnless(test.match(stanza), + self.assertTrue(test.match(stanza), "Stanza did not match using %s method:\n" % method + \ "Criteria:\n%s\n" % str(criteria) + \ "Stanza:\n%s" % str(stanza)) @@ -280,7 +280,7 @@ class SlixTest(unittest.TestCase): debug += "Generated stanza:\n%s\n" % highlight(tostring(stanza2.xml)) result = self.compare(xml, stanza.xml, stanza2.xml) - self.failUnless(result, debug) + self.assertTrue(result, debug) # ------------------------------------------------------------------ # Methods for simulating stanza streams. @@ -487,7 +487,7 @@ class SlixTest(unittest.TestCase): recv_xml.clear() recv_xml.attrib = attrib - self.failUnless( + self.assertTrue( self.compare(xml, recv_xml), "Stream headers do not match:\nDesired:\n%s\nReceived:\n%s" % ( '%s %s' % (xml.tag, xml.attrib), @@ -543,7 +543,7 @@ class SlixTest(unittest.TestCase): xml = self.parse_xml(header2) sent_xml = self.parse_xml(sent_header2) - self.failUnless( + self.assertTrue( self.compare(xml, sent_xml), "Stream headers do not match:\nDesired:\n%s\nSent:\n%s" % ( header, sent_header)) @@ -557,12 +557,12 @@ class SlixTest(unittest.TestCase): if sent_data is None: self.fail("No stanza was sent.") if method == 'exact': - self.failUnless(self.compare(xml, sent_xml), + self.assertTrue(self.compare(xml, sent_xml), "Features do not match.\nDesired:\n%s\nReceived:\n%s" % ( highlight(tostring(xml)), highlight(tostring(sent_xml)))) elif method == 'mask': matcher = MatchXMLMask(xml) - self.failUnless(matcher.match(sent_xml), + self.assertTrue(matcher.match(sent_xml), "Stanza did not match using %s method:\n" % method + \ "Criteria:\n%s\n" % highlight(tostring(xml)) + \ "Stanza:\n%s" % highlight(tostring(sent_xml))) diff --git a/slixmpp/util/sasl/mechanisms.py b/slixmpp/util/sasl/mechanisms.py index 36b2795c..874787a9 100644 --- a/slixmpp/util/sasl/mechanisms.py +++ b/slixmpp/util/sasl/mechanisms.py @@ -516,13 +516,13 @@ else: def setup(self, name): authzid = self.credentials['authzid'] if not authzid: - authzid = 'xmpp@%s' % self.credentials['service-name'] + authzid = 'xmpp@' + self.credentials['service-name'].decode() _, self.gss = kerberos.authGSSClientInit(authzid) self.step = 0 def process(self, challenge=b''): - b64_challenge = b64encode(challenge) + b64_challenge = b64encode(challenge).decode('ascii') try: if self.step == 0: result = kerberos.authGSSClientStep(self.gss, b64_challenge) @@ -536,7 +536,7 @@ else: kerberos.authGSSClientUnwrap(self.gss, b64_challenge) resp = kerberos.authGSSClientResponse(self.gss) - kerberos.authGSSClientWrap(self.gss, resp, username) + kerberos.authGSSClientWrap(self.gss, resp, username.decode()) resp = kerberos.authGSSClientResponse(self.gss) except kerberos.GSSError as e: diff --git a/slixmpp/version.py b/slixmpp/version.py index a3d98366..4d767f1c 100644 --- a/slixmpp/version.py +++ b/slixmpp/version.py @@ -9,5 +9,5 @@ # We don't want to have to import the entire library # just to get the version info for setup.py -__version__ = '1.4.0' -__version_info__ = (1, 4, 0) +__version__ = '1.4.1' +__version_info__ = (1, 4, 1) diff --git a/slixmpp/xmlstream/stanzabase.py b/slixmpp/xmlstream/stanzabase.py index 605dbb61..1c000b69 100644 --- a/slixmpp/xmlstream/stanzabase.py +++ b/slixmpp/xmlstream/stanzabase.py @@ -177,8 +177,9 @@ def fix_ns(xpath, split=False, propagate_ns=True, default_ns=''): if '}' in ns_block: # Apply the found namespace to following elements # that do not have namespaces. - namespace = ns_block.split('}')[0] - elements = ns_block.split('}')[1].split('/') + ns_block_split = ns_block.split('}') + namespace = ns_block_split[0] + elements = ns_block_split[1].split('/') else: # Apply the stanza's namespace to the following # elements since no namespace was provided. @@ -1291,15 +1292,6 @@ class ElementBase(object): def __bool__(self): """Stanza objects should be treated as True in boolean contexts. - - Python 3.x version. - """ - return True - - def __nonzero__(self): - """Stanza objects should be treated as True in boolean contexts. - - Python 2.x version. """ return True diff --git a/slixmpp/xmlstream/tostring.py b/slixmpp/xmlstream/tostring.py index 6726bf1e..d6cc85dd 100644 --- a/slixmpp/xmlstream/tostring.py +++ b/slixmpp/xmlstream/tostring.py @@ -45,11 +45,12 @@ def tostring(xml=None, xmlns='', stream=None, outbuffer='', output = [outbuffer] # Extract the element's tag name. - tag_name = xml.tag.split('}', 1)[-1] + tag_split = xml.tag.split('}', 1) + tag_name = tag_split[-1] # Extract the element's namespace if it is defined. if '}' in xml.tag: - tag_xmlns = xml.tag.split('}', 1)[0][1:] + tag_xmlns = tag_split[0][1:] else: tag_xmlns = '' @@ -82,8 +83,9 @@ def tostring(xml=None, xmlns='', stream=None, outbuffer='', if '}' not in attrib: output.append(' %s="%s"' % (attrib, value)) else: - attrib_ns = attrib.split('}')[0][1:] - attrib = attrib.split('}')[1] + attrib_split = attrib.split('}') + attrib_ns = attrib_split[0][1:] + attrib = attrib_split[1] if attrib_ns == XML_NS: output.append(' xml:%s="%s"' % (attrib, value)) elif stream and attrib_ns in stream.namespace_map: @@ -144,10 +146,7 @@ def escape(text, use_cdata=False): '"': '"'} if not use_cdata: - text = list(text) - for i, c in enumerate(text): - text[i] = escapes.get(c, c) - return ''.join(text) + return ''.join(escapes.get(c, c) for c in text) else: escape_needed = False for c in text: diff --git a/slixmpp/xmlstream/xmlstream.py b/slixmpp/xmlstream/xmlstream.py index 0367db02..60557fff 100644 --- a/slixmpp/xmlstream/xmlstream.py +++ b/slixmpp/xmlstream/xmlstream.py @@ -285,7 +285,10 @@ class XMLStream(asyncio.BaseProtocol): self.disable_starttls = disable_starttls self.event("connecting") - self._current_connection_attempt = asyncio.ensure_future(self._connect_routine()) + self._current_connection_attempt = asyncio.ensure_future( + self._connect_routine(), + loop=self.loop, + ) async def _connect_routine(self): self.event_when_connected = "connected" @@ -306,7 +309,7 @@ class XMLStream(asyncio.BaseProtocol): else: ssl_context = None - await asyncio.sleep(self.connect_loop_wait) + await asyncio.sleep(self.connect_loop_wait, loop=self.loop) try: await self.loop.create_connection(lambda: self, self.address[0], @@ -321,7 +324,10 @@ class XMLStream(asyncio.BaseProtocol): log.debug('Connection failed: %s', e) self.event("connection_failed", e) self.connect_loop_wait = self.connect_loop_wait * 2 + 1 - self._current_connection_attempt = asyncio.ensure_future(self._connect_routine()) + self._current_connection_attempt = asyncio.ensure_future( + self._connect_routine(), + loop=self.loop, + ) def process(self, *, forever=True, timeout=None): """Process all the available XMPP events (receiving or sending data on the @@ -336,10 +342,10 @@ class XMLStream(asyncio.BaseProtocol): else: self.loop.run_until_complete(self.disconnected) else: - tasks = [asyncio.sleep(timeout)] + tasks = [asyncio.sleep(timeout, loop=self.loop)] if not forever: tasks.append(self.disconnected) - self.loop.run_until_complete(asyncio.wait(tasks)) + self.loop.run_until_complete(asyncio.wait(tasks, loop=self.loop)) def init_parser(self): """init the XML parser. The parser must always be reset for each new @@ -781,7 +787,10 @@ class XMLStream(asyncio.BaseProtocol): old_exception(e) else: self.exception(e) - asyncio.ensure_future(handler_callback_routine(handler_callback)) + asyncio.ensure_future( + handler_callback_routine(handler_callback), + loop=self.loop, + ) else: try: handler_callback(data) @@ -995,4 +1004,3 @@ class XMLStream(asyncio.BaseProtocol): :param exception: An unhandled exception object. """ pass - diff --git a/tests/test_events.py b/tests/test_events.py index 65494d80..e7a29e71 100644 --- a/tests/test_events.py +++ b/tests/test_events.py @@ -23,7 +23,7 @@ class TestEvents(SlixTest): self.xmpp.event("test_event") msg = "Event was not triggered the correct number of times: %s" - self.failUnless(happened == [True, True], msg) + self.assertTrue(happened == [True, True], msg) def testDelEvent(self): """Test handler working, then deleted and not triggered""" @@ -41,7 +41,7 @@ class TestEvents(SlixTest): self.xmpp.event("test_event", {}) msg = "Event was not triggered the correct number of times: %s" - self.failUnless(happened == [True], msg % happened) + self.assertTrue(happened == [True], msg % happened) def testAddDelAddEvent(self): """Test adding, then removing, then adding an event handler.""" @@ -61,7 +61,7 @@ class TestEvents(SlixTest): self.xmpp.event("test_event", {}) msg = "Event was not triggered the correct number of times: %s" - self.failUnless(happened == [True, True], msg % happened) + self.assertTrue(happened == [True, True], msg % happened) def testDisposableEvent(self): """Test disposable handler working, then not being triggered again.""" @@ -78,7 +78,7 @@ class TestEvents(SlixTest): self.xmpp.event("test_event", {}) msg = "Event was not triggered the correct number of times: %s" - self.failUnless(happened == [True], msg % happened) + self.assertTrue(happened == [True], msg % happened) suite = unittest.TestLoader().loadTestsFromTestCase(TestEvents) diff --git a/tests/test_overall.py b/tests/test_overall.py index 3f32913c..70c34a6a 100644 --- a/tests/test_overall.py +++ b/tests/test_overall.py @@ -16,11 +16,11 @@ class TestOverall(unittest.TestCase): """Testing all modules by compiling them""" src = '.%sslixmpp' % os.sep rx = re.compile('/[.]svn|.*26.*') - self.failUnless(compileall.compile_dir(src, rx=rx, quiet=True)) + self.assertTrue(compileall.compile_dir(src, rx=rx, quiet=True)) def testTabNanny(self): """Testing that indentation is consistent""" - self.failIf(tabnanny.check('..%sslixmpp' % os.sep)) + self.assertFalse(tabnanny.check('..%sslixmpp' % os.sep)) suite = unittest.TestLoader().loadTestsFromTestCase(TestOverall) diff --git a/tests/test_stanza_base.py b/tests/test_stanza_base.py index dac3f046..35fa5e99 100644 --- a/tests/test_stanza_base.py +++ b/tests/test_stanza_base.py @@ -9,37 +9,37 @@ class TestStanzaBase(SlixTest): """Test the 'to' interface of StanzaBase.""" stanza = StanzaBase() stanza['to'] = 'user@example.com' - self.failUnless(str(stanza['to']) == 'user@example.com', + self.assertTrue(str(stanza['to']) == 'user@example.com', "Setting and retrieving stanza 'to' attribute did not work.") def testFrom(self): """Test the 'from' interface of StanzaBase.""" stanza = StanzaBase() stanza['from'] = 'user@example.com' - self.failUnless(str(stanza['from']) == 'user@example.com', + self.assertTrue(str(stanza['from']) == 'user@example.com', "Setting and retrieving stanza 'from' attribute did not work.") def testPayload(self): """Test the 'payload' interface of StanzaBase.""" stanza = StanzaBase() - self.failUnless(stanza['payload'] == [], + self.assertTrue(stanza['payload'] == [], "Empty stanza does not have an empty payload.") stanza['payload'] = ET.Element("{foo}foo") - self.failUnless(len(stanza['payload']) == 1, + self.assertTrue(len(stanza['payload']) == 1, "Stanza contents and payload do not match.") stanza['payload'] = ET.Element('{bar}bar') - self.failUnless(len(stanza['payload']) == 2, + self.assertTrue(len(stanza['payload']) == 2, "Stanza payload was not appended.") del stanza['payload'] - self.failUnless(stanza['payload'] == [], + self.assertTrue(stanza['payload'] == [], "Stanza payload not cleared after deletion.") stanza['payload'] = [ET.Element('{foo}foo'), ET.Element('{bar}bar')] - self.failUnless(len(stanza['payload']) == 2, + self.assertTrue(len(stanza['payload']) == 2, "Adding multiple elements to stanza's payload did not work.") def testClear(self): @@ -49,9 +49,9 @@ class TestStanzaBase(SlixTest): stanza['payload'] = ET.Element("{foo}foo") stanza.clear() - self.failUnless(stanza['payload'] == [], + self.assertTrue(stanza['payload'] == [], "Stanza payload was not cleared after calling .clear()") - self.failUnless(str(stanza['to']) == "user@example.com", + self.assertTrue(str(stanza['to']) == "user@example.com", "Stanza attributes were not preserved after calling .clear()") def testReply(self): @@ -63,9 +63,9 @@ class TestStanzaBase(SlixTest): stanza = stanza.reply() - self.failUnless(str(stanza['to'] == "sender@example.com"), + self.assertTrue(str(stanza['to'] == "sender@example.com"), "Stanza reply did not change 'to' attribute.") - self.failUnless(stanza['payload'] == [], + self.assertTrue(stanza['payload'] == [], "Stanza reply did not empty stanza payload.") def testError(self): @@ -73,7 +73,7 @@ class TestStanzaBase(SlixTest): stanza = StanzaBase() stanza['type'] = 'get' stanza.error() - self.failUnless(stanza['type'] == 'error', + self.assertTrue(stanza['type'] == 'error', "Stanza type is not 'error' after calling error()") diff --git a/tests/test_stanza_element.py b/tests/test_stanza_element.py index 89ea0310..2090f05a 100644 --- a/tests/test_stanza_element.py +++ b/tests/test_stanza_element.py @@ -17,7 +17,7 @@ class TestElementBase(SlixTest): "{%s}bar" % ns, "{abc}baz", "{%s}more" % ns]) - self.failUnless(expected == result, + self.assertTrue(expected == result, "Incorrect namespace fixing result: %s" % str(result)) @@ -80,7 +80,7 @@ class TestElementBase(SlixTest): 'lang': '', 'bar': 'c', 'baz': ''}]} - self.failUnless(values == expected, + self.assertTrue(values == expected, "Unexpected stanza values:\n%s\n%s" % (str(expected), str(values))) @@ -170,13 +170,13 @@ class TestElementBase(SlixTest): 'meh': ''} for interface, value in expected.items(): result = stanza[interface] - self.failUnless(result == value, + self.assertTrue(result == value, "Incorrect stanza interface access result: %s" % result) # Test plugin interfaces - self.failUnless(isinstance(stanza['foobar'], TestStanzaPlugin), + self.assertTrue(isinstance(stanza['foobar'], TestStanzaPlugin), "Incorrect plugin object result.") - self.failUnless(stanza['foobar']['fizz'] == 'c', + self.assertTrue(stanza['foobar']['fizz'] == 'c', "Incorrect plugin subvalue result.") def testSetItem(self): @@ -269,7 +269,7 @@ class TestElementBase(SlixTest): <foo xmlns="foo" /> """) - self.failUnless(stanza._get_attr('bar') == '', + self.assertTrue(stanza._get_attr('bar') == '', "Incorrect value returned for an unset XML attribute.") stanza._set_attr('bar', 'a') @@ -279,7 +279,7 @@ class TestElementBase(SlixTest): <foo xmlns="foo" bar="a" baz="b" /> """) - self.failUnless(stanza._get_attr('bar') == 'a', + self.assertTrue(stanza._get_attr('bar') == 'a', "Retrieved XML attribute value is incorrect.") stanza._set_attr('bar', None) @@ -289,7 +289,7 @@ class TestElementBase(SlixTest): <foo xmlns="foo" /> """) - self.failUnless(stanza._get_attr('bar', 'c') == 'c', + self.assertTrue(stanza._get_attr('bar', 'c') == 'c', "Incorrect default value returned for an unset XML attribute.") def testGetSubText(self): @@ -311,7 +311,7 @@ class TestElementBase(SlixTest): return self._get_sub_text("wrapper/bar", default="not found") stanza = TestStanza() - self.failUnless(stanza['bar'] == 'not found', + self.assertTrue(stanza['bar'] == 'not found', "Default _get_sub_text value incorrect.") stanza['bar'] = 'found' @@ -322,7 +322,7 @@ class TestElementBase(SlixTest): </wrapper> </foo> """) - self.failUnless(stanza['bar'] == 'found', + self.assertTrue(stanza['bar'] == 'found', "_get_sub_text value incorrect: %s." % stanza['bar']) def testSubElement(self): @@ -481,45 +481,45 @@ class TestElementBase(SlixTest): register_stanza_plugin(TestStanza, TestStanzaPlugin) stanza = TestStanza() - self.failUnless(stanza.match("foo"), + self.assertTrue(stanza.match("foo"), "Stanza did not match its own tag name.") - self.failUnless(stanza.match("{foo}foo"), + self.assertTrue(stanza.match("{foo}foo"), "Stanza did not match its own namespaced name.") stanza['bar'] = 'a' - self.failUnless(stanza.match("foo@bar=a"), + self.assertTrue(stanza.match("foo@bar=a"), "Stanza did not match its own name with attribute value check.") stanza['baz'] = 'b' - self.failUnless(stanza.match("foo@bar=a@baz=b"), + self.assertTrue(stanza.match("foo@bar=a@baz=b"), "Stanza did not match its own name with multiple attributes.") stanza['qux'] = 'c' - self.failUnless(stanza.match("foo/qux"), + self.assertTrue(stanza.match("foo/qux"), "Stanza did not match with subelements.") stanza['qux'] = '' - self.failUnless(stanza.match("foo/qux") == False, + self.assertTrue(stanza.match("foo/qux") == False, "Stanza matched missing subinterface element.") - self.failUnless(stanza.match("foo/bar") == False, + self.assertTrue(stanza.match("foo/bar") == False, "Stanza matched nonexistent element.") stanza['plugin']['attrib'] = 'c' - self.failUnless(stanza.match("foo/plugin@attrib=c"), + self.assertTrue(stanza.match("foo/plugin@attrib=c"), "Stanza did not match with plugin and attribute.") - self.failUnless(stanza.match("foo/{http://test/slash/bar}plugin"), + self.assertTrue(stanza.match("foo/{http://test/slash/bar}plugin"), "Stanza did not match with namespaced plugin.") substanza = TestSubStanza() substanza['attrib'] = 'd' stanza.append(substanza) - self.failUnless(stanza.match("foo/sub@attrib=d"), + self.assertTrue(stanza.match("foo/sub@attrib=d"), "Stanza did not match with substanzas and attribute.") - self.failUnless(stanza.match("foo/{baz}sub"), + self.assertTrue(stanza.match("foo/{baz}sub"), "Stanza did not match with namespaced substanza.") def testComparisons(self): @@ -533,19 +533,19 @@ class TestElementBase(SlixTest): stanza1 = TestStanza() stanza1['bar'] = 'a' - self.failUnless(stanza1, + self.assertTrue(stanza1, "Stanza object does not evaluate to True") stanza2 = TestStanza() stanza2['baz'] = 'b' - self.failUnless(stanza1 != stanza2, + self.assertTrue(stanza1 != stanza2, "Different stanza objects incorrectly compared equal.") stanza1['baz'] = 'b' stanza2['bar'] = 'a' - self.failUnless(stanza1 == stanza2, + self.assertTrue(stanza1 == stanza2, "Equal stanzas incorrectly compared inequal.") def testKeys(self): @@ -561,12 +561,12 @@ class TestElementBase(SlixTest): stanza = TestStanza() - self.failUnless(set(stanza.keys()) == {'lang', 'bar', 'baz'}, + self.assertTrue(set(stanza.keys()) == {'lang', 'bar', 'baz'}, "Returned set of interface keys does not match expected.") stanza.enable('qux') - self.failUnless(set(stanza.keys()) == {'lang', 'bar', 'baz', 'qux'}, + self.assertTrue(set(stanza.keys()) == {'lang', 'bar', 'baz', 'qux'}, "Incorrect set of interface and plugin keys.") def testGet(self): @@ -580,10 +580,10 @@ class TestElementBase(SlixTest): stanza = TestStanza() stanza['bar'] = 'a' - self.failUnless(stanza.get('bar') == 'a', + self.assertTrue(stanza.get('bar') == 'a', "Incorrect value returned by stanza.get") - self.failUnless(stanza.get('baz', 'b') == 'b', + self.assertTrue(stanza.get('baz', 'b') == 'b', "Incorrect default value returned by stanza.get") def testSubStanzas(self): @@ -608,7 +608,7 @@ class TestElementBase(SlixTest): substanza2['qux'] = 'b' # Test appending substanzas - self.failUnless(len(stanza) == 0, + self.assertTrue(len(stanza) == 0, "Incorrect empty stanza size.") stanza.append(substanza1) @@ -617,7 +617,7 @@ class TestElementBase(SlixTest): <foobar qux="a" /> </foo> """, use_values=False) - self.failUnless(len(stanza) == 1, + self.assertTrue(len(stanza) == 1, "Incorrect stanza size with 1 substanza.") stanza.append(substanza2) @@ -627,7 +627,7 @@ class TestElementBase(SlixTest): <foobar qux="b" /> </foo> """, use_values=False) - self.failUnless(len(stanza) == 2, + self.assertTrue(len(stanza) == 2, "Incorrect stanza size with 2 substanzas.") # Test popping substanzas @@ -643,7 +643,7 @@ class TestElementBase(SlixTest): results = [] for substanza in stanza: results.append(substanza['qux']) - self.failUnless(results == ['b', 'a'], + self.assertTrue(results == ['b', 'a'], "Iteration over substanzas failed: %s." % str(results)) def testCopy(self): @@ -659,11 +659,11 @@ class TestElementBase(SlixTest): stanza2 = stanza1.__copy__() - self.failUnless(stanza1 == stanza2, + self.assertTrue(stanza1 == stanza2, "Copied stanzas are not equal to each other.") stanza1['baz'] = 'b' - self.failUnless(stanza1 != stanza2, + self.assertTrue(stanza1 != stanza2, "Divergent stanza copies incorrectly compared equal.") def testExtension(self): @@ -701,7 +701,7 @@ class TestElementBase(SlixTest): </foo> """) - self.failUnless(stanza['extended'] == 'testing', + self.assertTrue(stanza['extended'] == 'testing', "Could not retrieve stanza extension value.") del stanza['extended'] diff --git a/tests/test_stanza_error.py b/tests/test_stanza_error.py index c6a92eb6..143fe479 100644 --- a/tests/test_stanza_error.py +++ b/tests/test_stanza_error.py @@ -34,7 +34,7 @@ class TestErrorStanzas(SlixTest): </message> """) - self.failUnless(msg['error']['condition'] == 'item-not-found', "Error condition doesn't match.") + self.assertTrue(msg['error']['condition'] == 'item-not-found', "Error condition doesn't match.") msg['error']['condition'] = 'resource-constraint' diff --git a/tests/test_stanza_gmail.py b/tests/test_stanza_gmail.py index a17efca2..98bb920b 100644 --- a/tests/test_stanza_gmail.py +++ b/tests/test_stanza_gmail.py @@ -62,30 +62,30 @@ class TestGmail(SlixTest): iq = self.Iq(xml=xml) mailbox = iq['mailbox'] - self.failUnless(mailbox['result-time'] == '1118012394209', "result-time doesn't match") - self.failUnless(mailbox['url'] == 'http://mail.google.com/mail', "url doesn't match") - self.failUnless(mailbox['matched'] == '95', "total-matched incorrect") - self.failUnless(mailbox['estimate'] == False, "total-estimate incorrect") - self.failUnless(len(mailbox['threads']) == 1, "could not extract message threads") + self.assertTrue(mailbox['result-time'] == '1118012394209', "result-time doesn't match") + self.assertTrue(mailbox['url'] == 'http://mail.google.com/mail', "url doesn't match") + self.assertTrue(mailbox['matched'] == '95', "total-matched incorrect") + self.assertTrue(mailbox['estimate'] == False, "total-estimate incorrect") + self.assertTrue(len(mailbox['threads']) == 1, "could not extract message threads") thread = mailbox['threads'][0] - self.failUnless(thread['tid'] == '1172320964060972012', "thread tid doesn't match") - self.failUnless(thread['participation'] == '1', "thread participation incorrect") - self.failUnless(thread['messages'] == '28', "thread message count incorrect") - self.failUnless(thread['date'] == '1118012394209', "thread date doesn't match") - self.failUnless(thread['url'] == 'http://mail.google.com/mail?view=cv', "thread url doesn't match") - self.failUnless(thread['labels'] == 'act1scene3', "thread labels incorrect") - self.failUnless(thread['subject'] == 'Put thy rapier up.', "thread subject doesn't match") - self.failUnless(thread['snippet'] == "Ay, ay, a scratch, a scratch; marry, 'tis enough.", "snippet doesn't match") - self.failUnless(len(thread['senders']) == 3, "could not extract senders") + self.assertTrue(thread['tid'] == '1172320964060972012', "thread tid doesn't match") + self.assertTrue(thread['participation'] == '1', "thread participation incorrect") + self.assertTrue(thread['messages'] == '28', "thread message count incorrect") + self.assertTrue(thread['date'] == '1118012394209', "thread date doesn't match") + self.assertTrue(thread['url'] == 'http://mail.google.com/mail?view=cv', "thread url doesn't match") + self.assertTrue(thread['labels'] == 'act1scene3', "thread labels incorrect") + self.assertTrue(thread['subject'] == 'Put thy rapier up.', "thread subject doesn't match") + self.assertTrue(thread['snippet'] == "Ay, ay, a scratch, a scratch; marry, 'tis enough.", "snippet doesn't match") + self.assertTrue(len(thread['senders']) == 3, "could not extract senders") sender1 = thread['senders'][0] - self.failUnless(sender1['name'] == 'Me', "sender name doesn't match") - self.failUnless(sender1['address'] == 'romeo@gmail.com', "sender address doesn't match") - self.failUnless(sender1['originator'] == True, "sender originator incorrect") - self.failUnless(sender1['unread'] == False, "sender unread incorrectly True") + self.assertTrue(sender1['name'] == 'Me', "sender name doesn't match") + self.assertTrue(sender1['address'] == 'romeo@gmail.com', "sender address doesn't match") + self.assertTrue(sender1['originator'] == True, "sender originator incorrect") + self.assertTrue(sender1['unread'] == False, "sender unread incorrectly True") sender2 = thread['senders'][2] - self.failUnless(sender2['unread'] == True, "sender unread incorrectly False") + self.assertTrue(sender2['unread'] == True, "sender unread incorrectly False") suite = unittest.TestLoader().loadTestsFromTestCase(TestGmail) diff --git a/tests/test_stanza_iq.py b/tests/test_stanza_iq.py index 0b248da6..2c75a64d 100644 --- a/tests/test_stanza_iq.py +++ b/tests/test_stanza_iq.py @@ -70,7 +70,7 @@ class TestIqStanzas(SlixTest): </iq> """) - self.failUnless(iq['query'] == 'query_ns2', "Query namespace doesn't match") + self.assertTrue(iq['query'] == 'query_ns2', "Query namespace doesn't match") del iq['query'] self.check(iq, """ diff --git a/tests/test_stanza_message.py b/tests/test_stanza_message.py index 8b138f74..0bedac43 100644 --- a/tests/test_stanza_message.py +++ b/tests/test_stanza_message.py @@ -18,7 +18,7 @@ class TestMessageStanzas(SlixTest): msg['type'] = 'groupchat' msg['body'] = "this is a message" msg = msg.reply() - self.failUnless(str(msg['to']) == 'room@someservice.someserver.tld') + self.assertTrue(str(msg['to']) == 'room@someservice.someserver.tld') def testHTMLPlugin(self): "Test message/html/body stanza" diff --git a/tests/test_stanza_presence.py b/tests/test_stanza_presence.py index 73aaba97..7bb41b3a 100644 --- a/tests/test_stanza_presence.py +++ b/tests/test_stanza_presence.py @@ -15,7 +15,7 @@ class TestPresenceStanzas(SlixTest): p = self.Presence() p['type'] = 'available' self.check(p, "<presence />") - self.failUnless(p['type'] == 'available', + self.assertTrue(p['type'] == 'available', "Incorrect presence['type'] for type 'available': %s" % p['type']) for showtype in ['away', 'chat', 'dnd', 'xa']: @@ -23,7 +23,7 @@ class TestPresenceStanzas(SlixTest): self.check(p, """ <presence><show>%s</show></presence> """ % showtype) - self.failUnless(p['type'] == showtype, + self.assertTrue(p['type'] == showtype, "Incorrect presence['type'] for type '%s'" % showtype) p['type'] = None @@ -47,10 +47,10 @@ class TestPresenceStanzas(SlixTest): c.add_event_handler("changed_status", handlechangedpresence) c._handle_presence(p) - self.failUnless(happened == [], + self.assertTrue(happened == [], "changed_status event triggered for extra unavailable presence") roster = c.roster['crap@wherever'] - self.failUnless(roster['bill@chadmore.com'].resources == {}, + self.assertTrue(roster['bill@chadmore.com'].resources == {}, "Roster updated for superfulous unavailable presence") def testNickPlugin(self): diff --git a/tests/test_stanza_roster.py b/tests/test_stanza_roster.py index 4496fc18..d72fdef7 100644 --- a/tests/test_stanza_roster.py +++ b/tests/test_stanza_roster.py @@ -61,7 +61,7 @@ class TestRosterStanzas(SlixTest): debug = "Roster items don't match after retrieval." debug += "\nReturned: %s" % str(iq['roster']['items']) debug += "\nExpected: %s" % str(expected) - self.failUnless(iq['roster']['items'] == expected, debug) + self.assertTrue(iq['roster']['items'] == expected, debug) def testDelItems(self): """Test clearing items from a roster stanza.""" diff --git a/tests/test_stanza_xep_0030.py b/tests/test_stanza_xep_0030.py index d85f1980..96961a3b 100644 --- a/tests/test_stanza_xep_0030.py +++ b/tests/test_stanza_xep_0030.py @@ -258,7 +258,7 @@ class TestDisco(SlixTest): ('client', 'pc', 'no', None), ('client', 'pc', 'en', None), ('client', 'pc', 'fr', None)} - self.failUnless(iq['disco_info']['identities'] == expected, + self.assertTrue(iq['disco_info']['identities'] == expected, "Identities do not match:\n%s\n%s" % ( expected, iq['disco_info']['identities'])) @@ -276,7 +276,7 @@ class TestDisco(SlixTest): expected = {('client', 'pc', 'no', None)} result = iq['disco_info'].get_identities(lang='no') - self.failUnless(result == expected, + self.assertTrue(result == expected, "Identities do not match:\n%s\n%s" % ( expected, result)) @@ -337,7 +337,7 @@ class TestDisco(SlixTest): iq['disco_info'].add_feature('baz') expected = {'foo', 'bar', 'baz'} - self.failUnless(iq['disco_info']['features'] == expected, + self.assertTrue(iq['disco_info']['features'] == expected, "Features do not match:\n%s\n%s" % ( expected, iq['disco_info']['features'])) @@ -475,7 +475,7 @@ class TestDisco(SlixTest): expected = {('user@localhost', None, None), ('user@localhost', 'foo', None), ('test@localhost', 'bar', 'Tester')} - self.failUnless(iq['disco_items']['items'] == expected, + self.assertTrue(iq['disco_items']['items'] == expected, "Items do not match:\n%s\n%s" % ( expected, iq['disco_items']['items'])) diff --git a/tests/test_stanza_xep_0050.py b/tests/test_stanza_xep_0050.py index 0898b136..ea7616f9 100644 --- a/tests/test_stanza_xep_0050.py +++ b/tests/test_stanza_xep_0050.py @@ -17,13 +17,13 @@ class TestAdHocCommandStanzas(SlixTest): iq['command']['node'] = 'foo' iq['command']['action'] = 'execute' - self.failUnless(iq['command']['action'] == 'execute') + self.assertTrue(iq['command']['action'] == 'execute') iq['command']['action'] = 'complete' - self.failUnless(iq['command']['action'] == 'complete') + self.assertTrue(iq['command']['action'] == 'complete') iq['command']['action'] = 'cancel' - self.failUnless(iq['command']['action'] == 'cancel') + self.assertTrue(iq['command']['action'] == 'cancel') def testSetActions(self): """Test setting next actions in a command stanza.""" @@ -98,7 +98,7 @@ class TestAdHocCommandStanzas(SlixTest): ('error', "I can't let you do that")] iq['command']['notes'] = notes - self.failUnless(iq['command']['notes'] == notes, + self.assertTrue(iq['command']['notes'] == notes, "Notes don't match: %s %s" % (notes, iq['command']['notes'])) self.check(iq, """ diff --git a/tests/test_stanza_xep_0059.py b/tests/test_stanza_xep_0059.py index 246481ce..028ec62f 100644 --- a/tests/test_stanza_xep_0059.py +++ b/tests/test_stanza_xep_0059.py @@ -24,7 +24,7 @@ class TestSetStanzas(SlixTest): """ s = Set(ET.fromstring(xml_string)) expected = '10' - self.failUnless(s['first_index'] == expected) + self.assertTrue(s['first_index'] == expected) def testDelFirstIndex(self): xml_string = """ @@ -57,7 +57,7 @@ class TestSetStanzas(SlixTest): """ s = Set(ET.fromstring(xml_string)) expected = True - self.failUnless(s['before'] == expected) + self.assertTrue(s['before'] == expected) def testGetBefore(self): xml_string = """ @@ -89,7 +89,7 @@ class TestSetStanzas(SlixTest): """ s = Set(ET.fromstring(xml_string)) expected = 'id' - self.failUnless(s['before'] == expected) + self.assertTrue(s['before'] == expected) def testGetBeforeVal(self): xml_string = """ diff --git a/tests/test_stream_handlers.py b/tests/test_stream_handlers.py index 24b5c1a6..a42679f2 100644 --- a/tests/test_stream_handlers.py +++ b/tests/test_stream_handlers.py @@ -112,7 +112,7 @@ class TestHandlers(SlixTest): # Check that the waiter is no longer registered waiter_exists = self.xmpp.remove_handler('IqWait_test2') - self.failUnless(waiter_exists == False, + self.assertTrue(waiter_exists == False, "Waiter handler was not removed.") def testIqCallback(self): @@ -145,7 +145,7 @@ class TestHandlers(SlixTest): </iq> """) - self.failUnless(events == ['foo'], + self.assertTrue(events == ['foo'], "Iq callback was not executed: %s" % events) def testMultipleHandlersForStanza(self): diff --git a/tests/test_stream_roster.py b/tests/test_stream_roster.py index 6a171ce7..7a94edb8 100644 --- a/tests/test_stream_roster.py +++ b/tests/test_stream_roster.py @@ -52,7 +52,7 @@ class TestStreamRoster(SlixTest): pending_out=True, groups=['Friends', 'Examples']) - self.failUnless(len(roster_updates) == 1, + self.assertTrue(len(roster_updates) == 1, "Wrong number of roster_update events fired: %s (should be 1)" % len(roster_updates)) def testRosterSet(self): @@ -89,7 +89,7 @@ class TestStreamRoster(SlixTest): groups=['Friends', 'Examples']) - self.failUnless('roster_update' in events, + self.assertTrue('roster_update' in events, "Roster updated event not triggered: %s" % events) def testRosterPushRemove(self): @@ -188,7 +188,7 @@ class TestStreamRoster(SlixTest): </iq> """) - self.failUnless(events == ['roster_callback'], + self.assertTrue(events == ['roster_callback'], "Roster timeout event not triggered: %s." % events) def testRosterUnicode(self): @@ -209,7 +209,7 @@ class TestStreamRoster(SlixTest): groups=['Unicode']) jids = list(self.xmpp.client_roster.keys()) - self.failUnless(jids == ['andré@foo'], + self.assertTrue(jids == ['andré@foo'], "Too many roster entries found: %s" % jids) self.recv(""" @@ -223,7 +223,7 @@ class TestStreamRoster(SlixTest): expected = {'bar': {'status':'Testing', 'show':'away', 'priority':0}} - self.failUnless(result == expected, + self.assertTrue(result == expected, "Unexpected roster values: %s" % result) def testSendLastPresence(self): diff --git a/tests/test_stream_xep_0047.py b/tests/test_stream_xep_0047.py index a0e6c227..f7276c0f 100644 --- a/tests/test_stream_xep_0047.py +++ b/tests/test_stream_xep_0047.py @@ -79,8 +79,7 @@ class TestInBandByteStreams(SlixTest): self.assertEqual(events, {'ibb_stream_start', 'callback'}) - @asyncio.coroutine - def testSendData(self): + async def testSendData(self): """Test sending data over an in-band bytestream.""" streams = [] @@ -117,7 +116,7 @@ class TestInBandByteStreams(SlixTest): # Test sending data out - yield from stream.send("Testing") + await stream.send("Testing") self.send(""" <iq type="set" id="2" diff --git a/tests/test_stream_xep_0050.py b/tests/test_stream_xep_0050.py index d1a94ecc..37cd233d 100644 --- a/tests/test_stream_xep_0050.py +++ b/tests/test_stream_xep_0050.py @@ -626,7 +626,7 @@ class TestAdHocCommands(SlixTest): </iq> """) - self.failUnless(results == ['foo', 'bar', 'baz'], + self.assertTrue(results == ['foo', 'bar', 'baz'], 'Incomplete command workflow: %s' % results) def testClientAPICancel(self): @@ -689,7 +689,7 @@ class TestAdHocCommands(SlixTest): </iq> """) - self.failUnless(results == ['foo', 'bar'], + self.assertTrue(results == ['foo', 'bar'], 'Incomplete command workflow: %s' % results) def testClientAPIError(self): @@ -727,7 +727,7 @@ class TestAdHocCommands(SlixTest): </iq> """) - self.failUnless(results == ['foo'], + self.assertTrue(results == ['foo'], 'Incomplete command workflow: %s' % results) def testClientAPIErrorStrippedResponse(self): @@ -762,7 +762,7 @@ class TestAdHocCommands(SlixTest): </iq> """) - self.failUnless(results == ['foo'], + self.assertTrue(results == ['foo'], 'Incomplete command workflow: %s' % results) diff --git a/tests/test_stream_xep_0085.py b/tests/test_stream_xep_0085.py index 9e3a2dd5..d63fc72b 100644 --- a/tests/test_stream_xep_0085.py +++ b/tests/test_stream_xep_0085.py @@ -50,7 +50,7 @@ class TestStreamChatStates(SlixTest): """) expected = ['active', 'inactive', 'paused', 'composing', 'gone'] - self.failUnless(results == expected, + self.assertTrue(results == expected, "Chat state event not handled: %s" % results) diff --git a/tests/test_stream_xep_0249.py b/tests/test_stream_xep_0249.py index f12978a8..4f4033d7 100644 --- a/tests/test_stream_xep_0249.py +++ b/tests/test_stream_xep_0249.py @@ -35,7 +35,7 @@ class TestStreamDirectInvite(SlixTest): </message> """) - self.failUnless(events == [True], + self.assertTrue(events == [True], "Event not raised: %s" % events) def testSentDirectInvite(self): diff --git a/tests/test_stream_xep_0323.py b/tests/test_stream_xep_0323.py index b4c18afc..7c9cc7e8 100644 --- a/tests/test_stream_xep_0323.py +++ b/tests/test_stream_xep_0323.py @@ -456,7 +456,7 @@ class TestStreamSensorData(SlixTest): </iq> """) - self.failUnless(results == ["rejected"], + self.assertTrue(results == ["rejected"], "Rejected callback was not properly executed") def testRequestAcceptedAPI(self): @@ -493,7 +493,7 @@ class TestStreamSensorData(SlixTest): </iq> """) - self.failUnless(results == ["accepted"], + self.assertTrue(results == ["accepted"], "Accepted callback was not properly executed") def testRequestFieldsAPI(self): @@ -561,19 +561,19 @@ class TestStreamSensorData(SlixTest): </message> """) - self.failUnlessEqual(results, ["accepted","fields","done"]) + self.assertEqual(results, ["accepted","fields","done"]) # self.assertIn("nodeId", callback_data); self.assertTrue("nodeId" in callback_data) - self.failUnlessEqual(callback_data["nodeId"], "Device33") + self.assertEqual(callback_data["nodeId"], "Device33") # self.assertIn("timestamp", callback_data); self.assertTrue("timestamp" in callback_data) - self.failUnlessEqual(callback_data["timestamp"], "2000-01-01T00:01:02") + self.assertEqual(callback_data["timestamp"], "2000-01-01T00:01:02") #self.assertIn("field_Voltage", callback_data); self.assertTrue("field_Voltage" in callback_data) - self.failUnlessEqual(callback_data["field_Voltage"], {"name": "Voltage", "value": "230.4", "typename": "numeric", "unit": "V", "flags": {"invoiced": "true"}}) + self.assertEqual(callback_data["field_Voltage"], {"name": "Voltage", "value": "230.4", "typename": "numeric", "unit": "V", "flags": {"invoiced": "true"}}) #self.assertIn("field_TestBool", callback_data); self.assertTrue("field_TestBool" in callback_data) - self.failUnlessEqual(callback_data["field_TestBool"], {"name": "TestBool", "value": "true", "typename": "boolean" }) + self.assertEqual(callback_data["field_TestBool"], {"name": "TestBool", "value": "true", "typename": "boolean" }) def testServiceDiscoveryClient(self): self.stream_start(mode='client', @@ -675,16 +675,16 @@ class TestStreamSensorData(SlixTest): </message> """) - self.failUnlessEqual(results, ["accepted","failure"]); + self.assertEqual(results, ["accepted","failure"]); # self.assertIn("nodeId", callback_data); self.assertTrue("nodeId" in callback_data) - self.failUnlessEqual(callback_data["nodeId"], "Device33") + self.assertEqual(callback_data["nodeId"], "Device33") # self.assertIn("timestamp", callback_data); self.assertTrue("timestamp" in callback_data) - self.failUnlessEqual(callback_data["timestamp"], "2013-03-07T17:13:30") + self.assertEqual(callback_data["timestamp"], "2013-03-07T17:13:30") # self.assertIn("error_msg", callback_data); self.assertTrue("error_msg" in callback_data) - self.failUnlessEqual(callback_data["error_msg"], "Timeout.") + self.assertEqual(callback_data["error_msg"], "Timeout.") def testDelayedRequest(self): self.stream_start(mode='component', @@ -1071,19 +1071,19 @@ class TestStreamSensorData(SlixTest): </message> """) - self.failUnlessEqual(results, ["queued","started","fields","done"]); + self.assertEqual(results, ["queued","started","fields","done"]); # self.assertIn("nodeId", callback_data); self.assertTrue("nodeId" in callback_data) - self.failUnlessEqual(callback_data["nodeId"], "Device33") + self.assertEqual(callback_data["nodeId"], "Device33") # self.assertIn("timestamp", callback_data); self.assertTrue("timestamp" in callback_data) - self.failUnlessEqual(callback_data["timestamp"], "2000-01-01T00:01:02") + self.assertEqual(callback_data["timestamp"], "2000-01-01T00:01:02") # self.assertIn("field_Voltage", callback_data); self.assertTrue("field_Voltage" in callback_data) - self.failUnlessEqual(callback_data["field_Voltage"], {"name": "Voltage", "value": "230.4", "typename": "numeric", "unit": "V", "flags": {"invoiced": "true"}}) + self.assertEqual(callback_data["field_Voltage"], {"name": "Voltage", "value": "230.4", "typename": "numeric", "unit": "V", "flags": {"invoiced": "true"}}) # self.assertIn("field_TestBool", callback_data); self.assertTrue("field_TestBool" in callback_data) - self.failUnlessEqual(callback_data["field_TestBool"], {"name": "TestBool", "value": "true", "typename": "boolean" }) + self.assertEqual(callback_data["field_TestBool"], {"name": "TestBool", "value": "true", "typename": "boolean" }) def testRequestFieldsCancelAPI(self): @@ -1139,7 +1139,7 @@ class TestStreamSensorData(SlixTest): </iq> """) - self.failUnlessEqual(results, ["accepted","cancelled"]) + self.assertEqual(results, ["accepted","cancelled"]) def testDelayedRequestCancel(self): self.stream_start(mode='component', diff --git a/tests/test_tostring.py b/tests/test_tostring.py index 72718beb..6bc7204f 100644 --- a/tests/test_tostring.py +++ b/tests/test_tostring.py @@ -25,7 +25,7 @@ class TestToString(SlixTest): else: xml=original result = tostring(xml, **kwargs) - self.failUnless(result == expected, "%s: %s" % (message, result)) + self.assertTrue(result == expected, "%s: %s" % (message, result)) def testXMLEscape(self): """Test escaping XML special characters.""" @@ -34,7 +34,7 @@ class TestToString(SlixTest): desired = """<foo bar="baz">'Hi""" desired += """ & welcome!'</foo>""" - self.failUnless(escaped == desired, + self.assertTrue(escaped == desired, "XML escaping did not work: %s." % escaped) def testEmptyElement(self): @@ -99,7 +99,7 @@ class TestToString(SlixTest): msg['body'] = utf8_message.decode('utf-8') expected = '<message><body>\xe0\xb2\xa0_\xe0\xb2\xa0</body></message>' result = msg.__str__() - self.failUnless(result == expected, + self.assertTrue(result == expected, "Stanza Unicode handling is incorrect: %s" % result) def testXMLLang(self): @@ -112,7 +112,7 @@ class TestToString(SlixTest): expected = '<message xml:lang="no" />' result = msg.__str__() - self.failUnless(expected == result, + self.assertTrue(expected == result, "Serialization with xml:lang failed: %s" % result) |