Welcome to mirror list, hosted at ThFree Co, Russian Federation.

dev.gajim.org/gajim/gajim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJefry Lagrange <jefry.reyes@gmail.com>2011-06-16 03:12:55 +0400
committerJefry Lagrange <jefry.reyes@gmail.com>2011-06-16 03:12:55 +0400
commite02088e91c418d1f24555f0df14d6226045bd967 (patch)
treed4de8fb2dce18ed5fd156dfa91f2af410fe569d4 /test
parentb8aa5185923a9412745eec33ac73ceb362d0528e (diff)
added tests for smacks.py
Diffstat (limited to 'test')
-rw-r--r--test/unit/test_xmpp_smacks.py141
1 files changed, 141 insertions, 0 deletions
diff --git a/test/unit/test_xmpp_smacks.py b/test/unit/test_xmpp_smacks.py
new file mode 100644
index 000000000..feff0e97b
--- /dev/null
+++ b/test/unit/test_xmpp_smacks.py
@@ -0,0 +1,141 @@
+'''
+Tests for smacks.py Stream Management
+'''
+import unittest
+
+import lib
+lib.setup_env()
+
+from mock import Mock
+
+from common.xmpp import dispatcher_nb
+from common.xmpp import protocol
+from common.xmpp import smacks
+
+class TestDispatcherNB(unittest.TestCase):
+ '''
+ Test class for NonBlocking dispatcher. Tested dispatcher will be plugged
+ into a mock client
+ '''
+ def setUp(self):
+ self.dispatcher = dispatcher_nb.XMPPDispatcher()
+
+ # Setup mock client
+ self.client = Mock()
+ self.client.__str__ = lambda: 'Mock' # FIXME: why do I need this one?
+ self.client._caller = Mock()
+ self.client.defaultNamespace = protocol.NS_CLIENT
+ self.client.Connection = Mock() # mock transport
+ self.con = self.client.Connection
+ self.con.sm = smacks.Smacks(self.con)
+
+
+
+
+
+ def tearDown(self):
+ # Unplug if needed
+ if hasattr(self.dispatcher, '_owner'):
+ self.dispatcher.PlugOut()
+
+ def _simulate_connect(self):
+ self.dispatcher.PlugIn(self.client) # client is owner
+ self.con.sm.set_owner(self.client)
+ self.dispatcher.sm = self.con.sm
+ # Simulate that we have established a connection
+ self.dispatcher.StreamInit()
+ self.dispatcher.ProcessNonBlocking("<stream:stream xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client'>")
+ self.dispatcher.ProcessNonBlocking("<stream:features> <sm xmlns='urn:xmpp:sm:2'> <optional/> </sm> </stream:features>")
+ self.con.sm.negociate()
+ self.dispatcher.ProcessNonBlocking("<enabled xmlns='urn:xmpp:sm:2' id='some-long-sm-id' resume='true'/>")
+ assert(self.con.sm.enabled)
+
+
+ def _simulate_resume(self):
+
+ self.con.sm.resume_request()
+ # Resuming acknowledging 5 stanzas
+ self.dispatcher.ProcessNonBlocking("<resumed xmlns='urn:xmpp:sm:2' id='some-long-sm-id' h='5'/>")
+ assert(self.con.sm.resuming)
+
+
+ def _send(self, send, r, stanza):
+ for i in range(r):
+ send(stanza)
+ def test_messages(self):
+
+ message = '<message><body>Helloo </body></message>'
+ iq = '''<iq from='proxy.jabber.ru' to='j.xxxxxxxx.org/Gajim' type='error' id='18'>
+ <query xmlns='http://jabber.org/protocol/bytestreams'/>
+ <error code='403' type='auth'>
+ <forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
+ </error>
+ </iq>'''
+ presence = '''<presence from='xxxxxxxxx.com/Talk.v1044194B1E2' to='j.xxxxxxxx.org'>
+ <priority>24</priority>
+ <c node="http://www.google.com/xmpp/client/caps" ver="1.0.0.104" ext="share-v1 voice-v1" xmlns="http://jabber.org/protocol/caps"/>
+ <x stamp="20110614T23:17:51" xmlns="jabber:x:delay"/>
+ <status>In love Kakashi Sensei :P</status>
+ <x xmlns="vcard-temp:x:update">
+ <photo>db4b7c52e39ba28562c74542d5988d47f09108a3</photo>
+ </x>
+ </presence> '''
+
+ self._simulate_connect()
+ uqueue = self.con.sm.uqueue
+ self.assertEqual(self.con.sm.out_h, 0)
+ self.assertEqual(self.con.sm.in_h, 0)
+
+ # The server sends 10 stanzas
+ self._send(self.dispatcher.ProcessNonBlocking, 5, message)
+ self._send(self.dispatcher.ProcessNonBlocking, 4, iq)
+ self._send(self.dispatcher.ProcessNonBlocking, 1, presence)
+
+ # The client has recieved 10 stanzas and sent none
+ self.assertEqual(self.con.sm.in_h, 10)
+ self.assertEqual(self.con.sm.out_h, 0)
+
+ m = protocol.Message()
+
+ # The client sends 10 stanzas
+ for i in range(10):
+ m = protocol.Message(body=str(i))
+ self.dispatcher.send(m)
+
+ # Client sends 10 stanzas and put them in the queue
+ self.assertEqual(self.con.sm.out_h, 10)
+ self.assertEqual(len(uqueue), 10)
+
+ # The server acknowledges that it recieved 5 stanzas
+ self.dispatcher.ProcessNonBlocking("<a xmlns='urn:xmpp:sm:2' h='5'/>")
+ # 5 stanzas are removed from the queue, only 5 stanzas are left
+
+ self.assertEqual(len(uqueue), 5)
+
+ # Check for the right order of stanzas in the queue
+ l = ['5', '6', '7', '8', '9']
+ for i in uqueue:
+ self.assertEqual(i.getBody(), l[0])
+ l.pop(0)
+
+
+ def test_resumption(self):
+
+ self._simulate_connect()
+
+ m = protocol.Message()
+
+ # The client sends 5 stanzas
+ for i in range(5):
+ m = protocol.Message(body=str(i))
+ self.dispatcher.send(m)
+
+ self._simulate_resume()
+ # No stanzas left
+ self.assertEqual(len(self.con.sm.uqueue), 0)
+
+
+
+
+if __name__ == '__main__':
+ unittest.main()