diff --git a/sleekxmpp/test/livesocket.py b/sleekxmpp/test/livesocket.py index 5e8c547..3e0f213 100644 --- a/sleekxmpp/test/livesocket.py +++ b/sleekxmpp/test/livesocket.py @@ -7,6 +7,7 @@ """ import socket +import threading try: import queue except ImportError: @@ -40,6 +41,8 @@ class TestLiveSocket(object): self.recv_buffer = [] self.recv_queue = queue.Queue() self.send_queue = queue.Queue() + self.send_queue_lock = threading.Lock() + self.recv_queue_lock = threading.Lock() self.is_live = True def __getattr__(self, name): @@ -108,7 +111,8 @@ class TestLiveSocket(object): Placeholders. Same as for socket.recv. """ data = self.socket.recv(*args, **kwargs) - self.recv_queue.put(data) + with self.recv_queue_lock: + self.recv_queue.put(data) return data def send(self, data): @@ -120,7 +124,8 @@ class TestLiveSocket(object): Arguments: data -- String value to write. """ - self.send_queue.put(data) + with self.send_queue_lock: + self.send_queue.put(data) self.socket.send(data) # ------------------------------------------------------------------ @@ -143,3 +148,15 @@ class TestLiveSocket(object): Placeholders, same as socket.recv() """ return self.recv(*args, **kwargs) + + def clear(self): + """ + Empty the send queue, typically done once the session has started to + remove the feature negotiation and log in stanzas. + """ + with self.send_queue_lock: + for i in range(0, self.send_queue.qsize()): + self.send_queue.get(block=False) + with self.recv_queue_lock: + for i in range(0, self.recv_queue.qsize()): + self.recv_queue.get(block=False) diff --git a/sleekxmpp/test/sleektest.py b/sleekxmpp/test/sleektest.py index d7a6147..27a7556 100644 --- a/sleekxmpp/test/sleektest.py +++ b/sleekxmpp/test/sleektest.py @@ -7,6 +7,10 @@ """ import unittest +try: + import Queue as queue +except: + import queue import sleekxmpp from sleekxmpp import ClientXMPP, ComponentXMPP @@ -279,6 +283,10 @@ class SleekTest(unittest.TestCase): else: raise ValueError("Unknown XMPP connection mode.") + # We will use this to wait for the session_start event + # for live connections. + skip_queue = queue.Queue() + if socket == 'mock': self.xmpp.set_socket(TestSocket()) @@ -293,6 +301,10 @@ class SleekTest(unittest.TestCase): self.xmpp.socket.recv_data(header) elif socket == 'live': self.xmpp.socket_class = TestLiveSocket + def wait_for_session(x): + self.xmpp.socket.clear() + skip_queue.put('started') + self.xmpp.add_event_handler('session_start', wait_for_session) self.xmpp.connect() else: raise ValueError("Unknown socket type.") @@ -300,10 +312,13 @@ class SleekTest(unittest.TestCase): self.xmpp.register_plugins() self.xmpp.process(threaded=True) if skip: - # Clear startup stanzas - self.xmpp.socket.next_sent(timeout=1) - if mode == 'component': + if socket != 'live': + # Clear startup stanzas self.xmpp.socket.next_sent(timeout=1) + if mode == 'component': + self.xmpp.socket.next_sent(timeout=1) + else: + skip_queue.get(block=True, timeout=10) def make_header(self, sto='', sfrom='', @@ -573,11 +588,13 @@ class SleekTest(unittest.TestCase): Defaults to the value of self.match_method. """ sent = self.xmpp.socket.next_sent(timeout) - if isinstance(data, str): - xml = self.parse_xml(data) - self.fix_namespaces(xml, 'jabber:client') - data = self.xmpp._build_stanza(xml, 'jabber:client') - self.check(data, sent, + if sent is None: + return False + print sent + xml = self.parse_xml(sent) + self.fix_namespaces(xml, 'jabber:client') + sent = self.xmpp._build_stanza(xml, 'jabber:client') + self.check(sent, data, method=method, defaults=defaults, use_values=use_values) diff --git a/tests/live_multiple_streams.py b/tests/live_multiple_streams.py new file mode 100644 index 0000000..69ee74c --- /dev/null +++ b/tests/live_multiple_streams.py @@ -0,0 +1,57 @@ +import logging + +from sleekxmpp.test import * + + +class TestMultipleStreams(SleekTest): + """ + Test that we can test a live stanza stream. + """ + + def setUp(self): + self.client1 = SleekTest() + self.client2 = SleekTest() + + def tearDown(self): + self.client1.stream_close() + self.client2.stream_close() + + def testMultipleStreams(self): + """Test that we can interact with multiple live ClientXMPP instance.""" + + client1 = self.client1 + client2 = self.client2 + + client1.stream_start(mode='client', + socket='live', + skip=True, + jid='user@localhost/test1', + password='user') + client2.stream_start(mode='client', + socket='live', + skip=True, + jid='user@localhost/test2', + password='user') + + client1.xmpp.send_message(mto='user@localhost/test2', + mbody='test') + + client1.send('message@body=test', method='stanzapath') + client2.recv('message@body=test', method='stanzapath') + + +suite = unittest.TestLoader().loadTestsFromTestCase(TestMultipleStreams) + +if __name__ == '__main__': + logging.basicConfig(level=logging.DEBUG, + format='%(levelname)-8s %(message)s') + + tests = unittest.TestSuite([suite]) + result = unittest.TextTestRunner(verbosity=2).run(tests) + test_ns = 'http://andyet.net/protocol/tests' + print("" % ( + test_ns, + 'ran="%s"' % result.testsRun, + 'errors="%s"' % len(result.errors), + 'fails="%s"' % len(result.failures), + 'success="%s"' % result.wasSuccessful())) diff --git a/tests/live_test.py b/tests/live_test.py index 16b6f1c..b71930a 100644 --- a/tests/live_test.py +++ b/tests/live_test.py @@ -1,7 +1,6 @@ import logging from sleekxmpp.test import * -import sleekxmpp.plugins.xep_0033 as xep_0033 class TestLiveStream(SleekTest):