2010-12-07 22:19:39 +00:00
|
|
|
import time
|
2014-02-06 17:13:28 +00:00
|
|
|
import threading
|
2010-12-07 22:19:39 +00:00
|
|
|
|
2013-07-26 11:02:26 +00:00
|
|
|
import unittest
|
2014-07-17 12:19:04 +00:00
|
|
|
from slixmpp.test import SlixTest
|
|
|
|
from slixmpp.exceptions import IqTimeout
|
|
|
|
from slixmpp import Callback, MatchXPath
|
2010-08-27 20:42:26 +00:00
|
|
|
|
2010-10-07 14:58:13 +00:00
|
|
|
|
2014-07-17 12:19:04 +00:00
|
|
|
class TestHandlers(SlixTest):
|
2010-08-27 20:42:26 +00:00
|
|
|
"""
|
2010-10-06 22:10:04 +00:00
|
|
|
Test using handlers and waiters.
|
2010-08-27 20:42:26 +00:00
|
|
|
"""
|
|
|
|
|
|
|
|
def setUp(self):
|
2010-10-07 13:22:27 +00:00
|
|
|
self.stream_start()
|
2010-08-27 20:42:26 +00:00
|
|
|
|
|
|
|
def tearDown(self):
|
2010-10-07 13:22:27 +00:00
|
|
|
self.stream_close()
|
2010-08-27 20:42:26 +00:00
|
|
|
|
|
|
|
def testCallback(self):
|
|
|
|
"""Test using stream callback handlers."""
|
|
|
|
|
|
|
|
def callback_handler(stanza):
|
2013-02-21 21:48:03 +00:00
|
|
|
self.xmpp.send_raw("""
|
2010-08-27 20:42:26 +00:00
|
|
|
<message>
|
|
|
|
<body>Success!</body>
|
|
|
|
</message>
|
|
|
|
""")
|
|
|
|
|
|
|
|
callback = Callback('Test Callback',
|
|
|
|
MatchXPath('{test}tester'),
|
|
|
|
callback_handler)
|
|
|
|
|
2013-02-21 21:48:03 +00:00
|
|
|
self.xmpp.register_handler(callback)
|
2010-08-27 20:42:26 +00:00
|
|
|
|
2010-11-05 18:45:58 +00:00
|
|
|
self.recv("""<tester xmlns="test" />""")
|
2010-08-27 20:42:26 +00:00
|
|
|
|
|
|
|
msg = self.Message()
|
|
|
|
msg['body'] = 'Success!'
|
2010-11-05 18:45:58 +00:00
|
|
|
self.send(msg)
|
2010-08-27 20:42:26 +00:00
|
|
|
|
|
|
|
def testWaiter(self):
|
|
|
|
"""Test using stream waiter handler."""
|
|
|
|
|
|
|
|
def waiter_handler(stanza):
|
|
|
|
iq = self.xmpp.Iq()
|
|
|
|
iq['id'] = 'test'
|
|
|
|
iq['type'] = 'set'
|
|
|
|
iq['query'] = 'test'
|
2015-02-12 11:23:47 +00:00
|
|
|
def callback_waiter(result):
|
2013-02-21 21:48:03 +00:00
|
|
|
self.xmpp.send_raw("""
|
2010-08-27 20:42:26 +00:00
|
|
|
<message>
|
|
|
|
<body>Successful: %s</body>
|
|
|
|
</message>
|
2015-02-12 11:23:47 +00:00
|
|
|
""" % result['query'])
|
|
|
|
iq.send(callback=callback_waiter)
|
2010-08-27 20:42:26 +00:00
|
|
|
|
2015-02-12 11:23:47 +00:00
|
|
|
self.xmpp.add_event_handler('message', waiter_handler)
|
2010-08-27 20:42:26 +00:00
|
|
|
|
|
|
|
# Send message to trigger waiter_handler
|
2010-11-05 18:45:58 +00:00
|
|
|
self.recv("""
|
2010-08-27 20:42:26 +00:00
|
|
|
<message>
|
|
|
|
<body>Testing</body>
|
|
|
|
</message>
|
|
|
|
""")
|
|
|
|
|
|
|
|
# Check that Iq was sent by waiter_handler
|
|
|
|
iq = self.Iq()
|
|
|
|
iq['id'] = 'test'
|
|
|
|
iq['type'] = 'set'
|
|
|
|
iq['query'] = 'test'
|
2010-11-05 18:45:58 +00:00
|
|
|
self.send(iq)
|
2010-08-27 20:42:26 +00:00
|
|
|
|
|
|
|
# Send the reply Iq
|
2010-11-05 18:45:58 +00:00
|
|
|
self.recv("""
|
2010-08-27 20:42:26 +00:00
|
|
|
<iq id="test" type="result">
|
|
|
|
<query xmlns="test" />
|
|
|
|
</iq>
|
|
|
|
""")
|
|
|
|
|
|
|
|
# Check that waiter_handler received the reply
|
|
|
|
msg = self.Message()
|
|
|
|
msg['body'] = 'Successful: test'
|
2010-11-05 18:45:58 +00:00
|
|
|
self.send(msg)
|
2010-08-27 20:42:26 +00:00
|
|
|
|
|
|
|
def testWaiterTimeout(self):
|
|
|
|
"""Test that waiter handler is removed after timeout."""
|
|
|
|
|
|
|
|
def waiter_handler(stanza):
|
|
|
|
iq = self.xmpp.Iq()
|
|
|
|
iq['id'] = 'test2'
|
|
|
|
iq['type'] = 'set'
|
|
|
|
iq['query'] = 'test2'
|
2011-05-31 19:48:43 +00:00
|
|
|
try:
|
2015-02-12 11:23:47 +00:00
|
|
|
reply = iq.send(timeout=0)
|
2011-05-31 19:48:43 +00:00
|
|
|
except IqTimeout:
|
|
|
|
pass
|
2010-08-27 20:42:26 +00:00
|
|
|
|
2015-02-12 11:23:47 +00:00
|
|
|
self.xmpp.add_event_handler('message', waiter_handler)
|
2010-08-27 20:42:26 +00:00
|
|
|
|
|
|
|
# Start test by triggerig waiter_handler
|
2010-11-05 18:45:58 +00:00
|
|
|
self.recv("""<message><body>Start Test</body></message>""")
|
2010-08-27 20:42:26 +00:00
|
|
|
|
|
|
|
# Check that Iq was sent to trigger start of timeout period
|
|
|
|
iq = self.Iq()
|
|
|
|
iq['id'] = 'test2'
|
|
|
|
iq['type'] = 'set'
|
|
|
|
iq['query'] = 'test2'
|
2010-11-05 18:45:58 +00:00
|
|
|
self.send(iq)
|
2010-08-27 20:42:26 +00:00
|
|
|
|
|
|
|
# Check that the waiter is no longer registered
|
2013-02-21 21:48:03 +00:00
|
|
|
waiter_exists = self.xmpp.remove_handler('IqWait_test2')
|
2010-08-27 20:42:26 +00:00
|
|
|
|
2018-10-08 21:25:23 +00:00
|
|
|
self.assertTrue(waiter_exists == False,
|
2010-08-27 20:42:26 +00:00
|
|
|
"Waiter handler was not removed.")
|
|
|
|
|
2010-12-07 22:19:39 +00:00
|
|
|
def testIqCallback(self):
|
|
|
|
"""Test that iq.send(callback=handle_foo) works."""
|
|
|
|
events = []
|
|
|
|
|
|
|
|
def handle_foo(iq):
|
|
|
|
events.append('foo')
|
|
|
|
|
|
|
|
iq = self.Iq()
|
|
|
|
iq['type'] = 'get'
|
|
|
|
iq['id'] = 'test-foo'
|
|
|
|
iq['to'] = 'user@localhost'
|
|
|
|
iq['query'] = 'foo'
|
|
|
|
iq.send(callback=handle_foo)
|
|
|
|
|
|
|
|
self.send("""
|
|
|
|
<iq type="get" id="test-foo" to="user@localhost">
|
|
|
|
<query xmlns="foo" />
|
|
|
|
</iq>
|
|
|
|
""")
|
|
|
|
|
|
|
|
self.recv("""
|
|
|
|
<iq type="result" id="test-foo"
|
|
|
|
to="test@localhost"
|
|
|
|
from="user@localhost">
|
|
|
|
<query xmlns="foo">
|
|
|
|
<data />
|
|
|
|
</query>
|
|
|
|
</iq>
|
|
|
|
""")
|
|
|
|
|
2018-10-08 21:25:23 +00:00
|
|
|
self.assertTrue(events == ['foo'],
|
2010-12-07 22:19:39 +00:00
|
|
|
"Iq callback was not executed: %s" % events)
|
|
|
|
|
2011-11-20 02:43:38 +00:00
|
|
|
def testMultipleHandlersForStanza(self):
|
|
|
|
"""
|
|
|
|
Test that multiple handlers for a single stanza work
|
|
|
|
without clobbering each other.
|
|
|
|
"""
|
|
|
|
|
|
|
|
def handler_1(msg):
|
|
|
|
msg.reply("Handler 1: %s" % msg['body']).send()
|
|
|
|
|
|
|
|
def handler_2(msg):
|
|
|
|
msg.reply("Handler 2: %s" % msg['body']).send()
|
|
|
|
|
|
|
|
def handler_3(msg):
|
|
|
|
msg.reply("Handler 3: %s" % msg['body']).send()
|
|
|
|
|
|
|
|
self.xmpp.add_event_handler('message', handler_1)
|
|
|
|
self.xmpp.add_event_handler('message', handler_2)
|
|
|
|
self.xmpp.add_event_handler('message', handler_3)
|
|
|
|
|
|
|
|
self.recv("""
|
|
|
|
<message to="tester@localhost" from="user@example.com">
|
|
|
|
<body>Testing</body>
|
|
|
|
</message>
|
|
|
|
""")
|
|
|
|
|
|
|
|
|
|
|
|
# This test is brittle, depending on the fact that handlers
|
|
|
|
# will be checked in the order they are registered.
|
|
|
|
self.send("""
|
|
|
|
<message to="user@example.com">
|
|
|
|
<body>Handler 1: Testing</body>
|
|
|
|
</message>
|
|
|
|
""")
|
|
|
|
self.send("""
|
|
|
|
<message to="user@example.com">
|
|
|
|
<body>Handler 2: Testing</body>
|
|
|
|
</message>
|
|
|
|
""")
|
|
|
|
self.send("""
|
|
|
|
<message to="user@example.com">
|
|
|
|
<body>Handler 3: Testing</body>
|
|
|
|
</message>
|
|
|
|
""")
|
|
|
|
|
2014-02-06 17:13:28 +00:00
|
|
|
def testWrongSender(self):
|
|
|
|
"""
|
|
|
|
Test that using the wrong sender JID in a IQ result
|
|
|
|
doesn't trigger handlers.
|
|
|
|
"""
|
|
|
|
|
|
|
|
events = []
|
|
|
|
|
2015-02-12 11:23:47 +00:00
|
|
|
def callback(result):
|
2014-02-06 17:13:28 +00:00
|
|
|
events.append(result['from'].full)
|
|
|
|
|
2015-02-12 11:23:47 +00:00
|
|
|
iq = self.Iq()
|
|
|
|
iq['id'] = 'test'
|
|
|
|
iq['to'] = 'tester@slixmpp.com/test'
|
|
|
|
iq['type'] = 'set'
|
|
|
|
iq['query'] = 'test'
|
|
|
|
iq.send(callback=callback)
|
2014-02-06 17:13:28 +00:00
|
|
|
|
|
|
|
self.recv("""
|
2014-07-17 12:19:04 +00:00
|
|
|
<iq id="test" from="evil@slixmpp.com/bad" type="result">
|
2014-02-06 17:13:28 +00:00
|
|
|
<query xmlns="test" />
|
|
|
|
</iq>
|
|
|
|
""")
|
|
|
|
self.recv("""
|
2014-07-17 12:19:04 +00:00
|
|
|
<iq id="test" from="evil2@slixmpp.com" type="result">
|
2014-02-06 17:13:28 +00:00
|
|
|
<query xmlns="test" />
|
|
|
|
</iq>
|
|
|
|
""")
|
|
|
|
self.recv("""
|
|
|
|
<iq id="test" from="evil.com" type="result">
|
|
|
|
<query xmlns="test" />
|
|
|
|
</iq>
|
|
|
|
""")
|
|
|
|
|
|
|
|
# Now for a good one
|
|
|
|
self.recv("""
|
2014-07-17 12:19:04 +00:00
|
|
|
<iq id="test" from="tester@slixmpp.com/test" type="result">
|
2014-02-06 17:13:28 +00:00
|
|
|
<query xmlns="test" />
|
|
|
|
</iq>
|
|
|
|
""")
|
|
|
|
|
2014-07-17 12:19:04 +00:00
|
|
|
self.assertEqual(events, ['tester@slixmpp.com/test'], "Did not timeout on bad sender")
|
2014-02-06 17:13:28 +00:00
|
|
|
|
|
|
|
|
2010-08-27 20:42:26 +00:00
|
|
|
suite = unittest.TestLoader().loadTestsFromTestCase(TestHandlers)
|