Merge branch 'exceptions' into develop

This commit is contained in:
Nathan Fritz 2011-08-12 16:35:15 -07:00
commit bd8c110f00
6 changed files with 40 additions and 21 deletions

View file

@ -227,8 +227,8 @@ class ClientXMPP(BaseXMPP):
'subscription': subscription, 'subscription': subscription,
'groups': groups}} 'groups': groups}}
response = iq.send(block, timeout, callback) response = iq.send(block, timeout, callback)
if response in [False, None] or not isinstance(response, Iq): if response is None:
return response return None
return response['type'] == 'result' return response['type'] == 'result'
def del_roster_item(self, jid): def del_roster_item(self, jid):
@ -261,12 +261,7 @@ class ClientXMPP(BaseXMPP):
iq.enable('roster') iq.enable('roster')
response = iq.send(block, timeout, callback) response = iq.send(block, timeout, callback)
if response == False: if callback is None:
self.event('roster_timeout')
if response in [False, None] or not isinstance(response, Iq):
return response
else:
return self._handle_roster(response, request=True) return self._handle_roster(response, request=True)
def _handle_connected(self, event=None): def _handle_connected(self, event=None):

View file

@ -52,3 +52,24 @@ class XMPPError(Exception):
self.extension = extension self.extension = extension
self.extension_ns = extension_ns self.extension_ns = extension_ns
self.extension_args = extension_args self.extension_args = extension_args
class IqTimeout(Exception):
"""
An exception which indicates that an IQ request response has not been
received within the alloted time window.
"""
def __init__(self, iq):
self.iq = iq
class IqError(Exception):
"""
An exception raised when an Iq stanza of type 'error' is received
after making a blocking send call.
"""
def __init__(self, iq):
self.iq = iq

View file

@ -11,6 +11,7 @@ from sleekxmpp.stanza.rootstanza import RootStanza
from sleekxmpp.xmlstream import StanzaBase, ET from sleekxmpp.xmlstream import StanzaBase, ET
from sleekxmpp.xmlstream.handler import Waiter, Callback from sleekxmpp.xmlstream.handler import Waiter, Callback
from sleekxmpp.xmlstream.matcher import MatcherId from sleekxmpp.xmlstream.matcher import MatcherId
from sleekxmpp.exceptions import IqTimeout, IqError
class Iq(RootStanza): class Iq(RootStanza):
@ -197,7 +198,12 @@ class Iq(RootStanza):
waitfor = Waiter('IqWait_%s' % self['id'], MatcherId(self['id'])) waitfor = Waiter('IqWait_%s' % self['id'], MatcherId(self['id']))
self.stream.register_handler(waitfor) self.stream.register_handler(waitfor)
StanzaBase.send(self, now=now) StanzaBase.send(self, now=now)
return waitfor.wait(timeout) result = waitfor.wait(timeout)
if not result:
raise IqTimeout(self)
if result['type'] == 'error':
raise IqError(result)
return result
else: else:
return StanzaBase.send(self, now=now) return StanzaBase.send(self, now=now)

View file

@ -16,6 +16,7 @@ import sleekxmpp
from sleekxmpp import ClientXMPP, ComponentXMPP from sleekxmpp import ClientXMPP, ComponentXMPP
from sleekxmpp.stanza import Message, Iq, Presence from sleekxmpp.stanza import Message, Iq, Presence
from sleekxmpp.test import TestSocket, TestLiveSocket from sleekxmpp.test import TestSocket, TestLiveSocket
from sleekxmpp.exceptions import XMPPError, IqTimeout, IqError
from sleekxmpp.xmlstream import ET, register_stanza_plugin from sleekxmpp.xmlstream import ET, register_stanza_plugin
from sleekxmpp.xmlstream import ElementBase, StanzaBase from sleekxmpp.xmlstream import ElementBase, StanzaBase
from sleekxmpp.xmlstream.tostring import tostring from sleekxmpp.xmlstream.tostring import tostring

View file

@ -90,7 +90,10 @@ class TestHandlers(SleekTest):
iq['id'] = 'test2' iq['id'] = 'test2'
iq['type'] = 'set' iq['type'] = 'set'
iq['query'] = 'test2' iq['query'] = 'test2'
try:
reply = iq.send(block=True, timeout=0) reply = iq.send(block=True, timeout=0)
except IqTimeout:
pass
self.xmpp.add_event_handler('message', waiter_handler, threaded=True) self.xmpp.add_event_handler('message', waiter_handler, threaded=True)

View file

@ -111,19 +111,12 @@ class TestStreamRoster(SleekTest):
def testRosterTimeout(self): def testRosterTimeout(self):
"""Test handling a timed out roster request.""" """Test handling a timed out roster request."""
self.stream_start() self.stream_start()
events = []
def roster_timeout(event): def do_test():
events.append('roster_timeout')
self.xmpp.add_event_handler('roster_timeout', roster_timeout)
self.xmpp.get_roster(timeout=0) self.xmpp.get_roster(timeout=0)
# Give the event queue time to process.
time.sleep(.1) time.sleep(.1)
self.failUnless(events == ['roster_timeout'], self.assertRaises(IqTimeout, do_test)
"Roster timeout event not triggered: %s." % events)
def testRosterCallback(self): def testRosterCallback(self):
"""Test handling a roster request callback.""" """Test handling a roster request callback."""