changeset ac2f9133f663 in /home/hg/repos/gajim

details:http://hg.gajim.org/gajim?cmd=changeset;node=ac2f9133f663
description: added tests for smacks.py

diffstat:

 test/unit/test_xmpp_smacks.py |  141 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 141 insertions(+), 0 deletions(-)

diffs (145 lines):

diff -r d8abc5e99939 -r ac2f9133f663 test/unit/test_xmpp_smacks.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/test/unit/test_xmpp_smacks.py     Wed Jun 15 19:12:55 2011 -0400
@@ -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()
_______________________________________________
Commits mailing list
Commits@gajim.org
http://lists.gajim.org/cgi-bin/listinfo/commits

Reply via email to