summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitlab-ci.yml13
-rw-r--r--INSTALL1
-rw-r--r--docs/conf.py13
-rwxr-xr-xexamples/confirm_answer.py1
-rwxr-xr-xexamples/confirm_ask.py7
-rwxr-xr-xexamples/disco_browser.py8
-rwxr-xr-xexamples/download_avatars.py17
-rwxr-xr-xexamples/http_upload.py16
-rwxr-xr-xexamples/ibb_transfer/ibb_sender.py10
-rwxr-xr-xexamples/mam.py1
-rwxr-xr-xexamples/ping.py6
-rwxr-xr-xexamples/pubsub_client.py46
-rwxr-xr-xexamples/register_account.py4
-rwxr-xr-xexamples/roster_browser.py7
-rwxr-xr-xexamples/s5b_transfer/s5b_receiver.py1
-rwxr-xr-xexamples/s5b_transfer/s5b_sender.py8
-rwxr-xr-xexamples/set_avatar.py10
-rwxr-xr-xsetup.py2
-rw-r--r--slixmpp/features/feature_mechanisms/mechanisms.py5
-rw-r--r--slixmpp/jid.py61
-rw-r--r--slixmpp/plugins/xep_0030/disco.py16
-rw-r--r--slixmpp/plugins/xep_0077/register.py2
-rw-r--r--slixmpp/plugins/xep_0153/vcard_avatar.py5
-rw-r--r--slixmpp/plugins/xep_0163.py10
-rw-r--r--slixmpp/plugins/xep_0199/ping.py5
-rw-r--r--slixmpp/plugins/xep_0223.py2
-rw-r--r--slixmpp/plugins/xep_0363/http_upload.py25
-rw-r--r--slixmpp/stanza/iq.py4
-rw-r--r--slixmpp/test/slixtest.py12
-rw-r--r--slixmpp/util/sasl/mechanisms.py6
-rw-r--r--slixmpp/version.py4
-rw-r--r--slixmpp/xmlstream/stanzabase.py14
-rw-r--r--slixmpp/xmlstream/tostring.py15
-rw-r--r--slixmpp/xmlstream/xmlstream.py22
-rw-r--r--tests/test_events.py8
-rw-r--r--tests/test_overall.py4
-rw-r--r--tests/test_stanza_base.py24
-rw-r--r--tests/test_stanza_element.py70
-rw-r--r--tests/test_stanza_error.py2
-rw-r--r--tests/test_stanza_gmail.py38
-rw-r--r--tests/test_stanza_iq.py2
-rw-r--r--tests/test_stanza_message.py2
-rw-r--r--tests/test_stanza_presence.py8
-rw-r--r--tests/test_stanza_roster.py2
-rw-r--r--tests/test_stanza_xep_0030.py8
-rw-r--r--tests/test_stanza_xep_0050.py8
-rw-r--r--tests/test_stanza_xep_0059.py6
-rw-r--r--tests/test_stream_handlers.py4
-rw-r--r--tests/test_stream_roster.py10
-rw-r--r--tests/test_stream_xep_0047.py5
-rw-r--r--tests/test_stream_xep_0050.py8
-rw-r--r--tests/test_stream_xep_0085.py2
-rw-r--r--tests/test_stream_xep_0249.py2
-rw-r--r--tests/test_stream_xep_0323.py34
-rw-r--r--tests/test_tostring.py8
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
diff --git a/INSTALL b/INSTALL
index 982911ed..9b14b232 100644
--- a/INSTALL
+++ b/INSTALL
@@ -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}
diff --git a/setup.py b/setup.py
index b751a62b..4578a32c 100755
--- a/setup.py
+++ b/setup.py
@@ -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):
'"': '&quot;'}
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 = """&lt;foo bar=&quot;baz&quot;&gt;&apos;Hi"""
desired += """ &amp; welcome!&apos;&lt;/foo&gt;"""
- 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)