''' Tests for dispatcher_nb.py ''' import unittest import lib lib.setup_env() from mock import Mock from gajim.common.protocol.bytestream import ConnectionIBBytestream, ConnectionSocks5Bytestream from nbxmpp import dispatcher_nb from nbxmpp import protocol from gajim.common.jingle import ConnectionJingle from gajim.common import app from gajim.common.socks5 import SocksQueue session_init = ''' ''' transport_info = ''' ''' class Connection(Mock, ConnectionJingle, ConnectionSocks5Bytestream, ConnectionIBBytestream): def __init__(self): Mock.__init__(self) ConnectionJingle.__init__(self) ConnectionSocks5Bytestream.__init__(self) ConnectionIBBytestream.__init__(self) self.connected = 2 # This tells gajim we are connected def send(self, stanza=None, when=None): # Called when gajim wants to send something print(str(stanza)) class TestJingle(unittest.TestCase): def setUp(self): self.dispatcher = dispatcher_nb.XMPPDispatcher() app.nec = Mock() app.socks5queue = SocksQueue(Mock()) # Setup mock client self.client = Connection() self.client.__str__ = lambda: 'Mock' # FIXME: why do I need this one? self.client._caller = Connection() self.client.defaultNamespace = protocol.NS_CLIENT self.client.Connection = Connection() # mock transport self.con = self.client.Connection self.con.server_resource = None self.con.connection = Connection() ''' Fake file_props when we receive a file. Gajim creates a file_props out of a FileRequestReceive event and from then on it changes in a lot of places. It is easier to just copy it in here. If the session_initiate stanza changes, this also must change. ''' self.receive_file = {'stream-methods': 'http://jabber.org/protocol/bytestreams', 'sender': 'jtest@thiessen.im/Gajim', 'file-name': 'test_received_file', 'request-id': '43', 'sid': '39', 'session-sid': '38', 'session-type': 'jingle', 'transfered_size': [], 'receiver': 'jingleft@thiessen.im/Gajim', 'desc': '', 'size': '2273', 'type': 'r', 'streamhosts': [{'initiator': 'jtest@thiessen.im/Gajim', 'target': 'jingleft@thiessen.im/Gajim', 'cid': '41', 'state': 0, 'host': '192.168.2.100', 'type': 'direct', 'port': '28011'}, {'initiator': 'jtest@thiessen.im/Gajim', 'target': 'jingleft@thiessen.im/Gajim', 'cid': '42', 'state': 0, 'host': '192.168.2.100', 'type': 'proxy', 'port': '5000'}], 'name': 'to'} 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 # Simulate that we have established a connection self.dispatcher.StreamInit() self.dispatcher.ProcessNonBlocking("") def _simulate_jingle_session(self): self.dispatcher.RegisterHandler('iq', self.con._JingleCB, 'set', protocol.NS_JINGLE) self.dispatcher.ProcessNonBlocking(session_init) session = list(self.con._sessions.values())[0] # The only session we have jft = list(session.contents.values())[0] # jingleFT object jft.file_props = self.receive_file # We plug file_props manually # The user accepts to receive the file # we have to manually simulate this behavior session.approve_session() self.con.send_file_approval(self.receive_file) self.dispatcher.ProcessNonBlocking(transport_info) def test_jingle_session(self): self._simulate_connect() self._simulate_jingle_session() if __name__ == '__main__': unittest.main()