'''
Tests for dispatcher.py
'''
import unittest
import lib
lib.setup_env()
from mock import Mock
from nbxmpp import dispatcher
from nbxmpp.namespaces import Namespace
from gajim.common.protocol.bytestream import ConnectionIBBytestream
from gajim.common.protocol.bytestream import ConnectionSocks5Bytestream
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.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 = Namespace.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',
Namespace.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()