diff options
Diffstat (limited to 'test/lib')
-rw-r--r-- | test/lib/__init__.py | 10 | ||||
-rwxr-xr-x | test/lib/data.py | 2 | ||||
-rw-r--r-- | test/lib/gajim_mocks.py (renamed from test/lib/mocks.py) | 6 | ||||
-rw-r--r-- | test/lib/xmpp_mocks.py | 98 |
4 files changed, 110 insertions, 6 deletions
diff --git a/test/lib/__init__.py b/test/lib/__init__.py index 2b99a7e23..4b5f8ca12 100644 --- a/test/lib/__init__.py +++ b/test/lib/__init__.py @@ -1,5 +1,5 @@ import sys -import os.path +import os import getopt use_x = True @@ -12,7 +12,8 @@ for o, a in opts: gajim_root = os.path.join(os.path.abspath(os.path.dirname(__file__)), '../..') -# look for modules in the CWD, then gajim/test/lib, then gajim/src, then everywhere else +# look for modules in the CWD, then gajim/test/lib, then gajim/src, +# then everywhere else sys.path.insert(1, gajim_root + '/src') sys.path.insert(1, gajim_root + '/test/lib') @@ -23,8 +24,6 @@ configdir = gajim_root + '/test/tmp' import __builtin__ __builtin__._ = lambda x: x -import os - def setup_env(): # wipe config directory if os.path.isdir(configdir): @@ -40,6 +39,9 @@ def setup_env(): # for some reason common.gajim needs to be imported before xmpppy? from common import gajim + import logging + logging.basicConfig() + gajim.DATA_DIR = gajim_root + '/data' gajim.use_x = use_x diff --git a/test/lib/data.py b/test/lib/data.py index e74e9c01b..c713de0ac 100755 --- a/test/lib/data.py +++ b/test/lib/data.py @@ -52,6 +52,7 @@ contacts[account3] = { # 'ask': None, 'groups': [], 'name': None, # 'resources': {}, 'subscription': u'both'} } + # We have contacts that are not in roster but only specified in the metadata metacontact_data = [ [{'account': account3, @@ -75,3 +76,4 @@ metacontact_data = [ 'order': 0}] ] +# vim: se ts=3: diff --git a/test/lib/mocks.py b/test/lib/gajim_mocks.py index a58d24de8..44b18f037 100644 --- a/test/lib/mocks.py +++ b/test/lib/gajim_mocks.py @@ -1,6 +1,8 @@ -# gajim-specific mock objects -from mock import Mock +''' +Module with dummy classes for Gajim specific unit testing +''' +from mock import Mock from common import gajim from common.connection_handlers import ConnectionHandlersBase diff --git a/test/lib/xmpp_mocks.py b/test/lib/xmpp_mocks.py new file mode 100644 index 000000000..4b6b469ad --- /dev/null +++ b/test/lib/xmpp_mocks.py @@ -0,0 +1,98 @@ +''' +Module with dummy classes for unit testing of XMPP and related code. +''' + +import threading, time + +from mock import Mock + +from common.xmpp import idlequeue +from common.xmpp.plugin import PlugIn + +IDLEQUEUE_INTERVAL = 0.2 # polling interval. 200ms is used in Gajim as default +IDLEMOCK_TIMEOUT = 30 # how long we wait for an event + +class IdleQueueThread(threading.Thread): + ''' + Thread for regular processing of idlequeue. + ''' + def __init__(self): + self.iq = idlequeue.IdleQueue() + self.stop = threading.Event() # Event to stop the thread main loop. + self.stop.clear() + threading.Thread.__init__(self) + + def run(self): + while not self.stop.isSet(): + self.iq.process() + time.sleep(IDLEQUEUE_INTERVAL) + + def stop_thread(self): + self.stop.set() + + +class IdleMock: + ''' + Serves as template for testing objects that are normally controlled by GUI. + Allows to wait for asynchronous callbacks with wait() method. + ''' + def __init__(self): + self._event = threading.Event() + self._event.clear() + + def wait(self): + ''' + Block until some callback sets the event and clearing the event + subsequently. + Returns True if event was set, False on timeout + ''' + self._event.wait(IDLEMOCK_TIMEOUT) + if self._event.is_set(): + self._event.clear() + return True + else: + return False + + def set_event(self): + self._event.set() + + +class MockConnection(IdleMock, Mock): + ''' + Class simulating Connection class from src/common/connection.py + + It is derived from Mock in order to avoid defining all methods + from real Connection that are called from NBClient or Dispatcher + ( _event_dispatcher for example) + ''' + + def __init__(self, *args): + self.connect_succeeded = True + IdleMock.__init__(self) + Mock.__init__(self, *args) + + def on_connect(self, success, *args): + ''' + Method called after connecting - after receiving <stream:features> + from server (NOT after TLS stream restart) or connect failure + ''' + self.connect_succeeded = success + self.set_event() + + + def on_auth(self, con, auth): + ''' + Method called after authentication, regardless of the result. + + :Parameters: + con : NonBlockingClient + reference to authenticated object + auth : string + type of authetication in case of success ('old_auth', 'sasl') or + None in case of auth failure + ''' + self.auth_connection = con + self.auth = auth + self.set_event() + +# vim: se ts=3: |