Skip to content
This repository has been archived by the owner on Jan 30, 2018. It is now read-only.

Commit

Permalink
Unit test reorganization.
Browse files Browse the repository at this point in the history
Moved SleekTest to sleekxmpp.test.

Organized test suites by their focus.
- Suites focused on testing stanza objects are named test_stanza_X.py
- Suites focused on testing stream behavior are name test_stream_X.py
  • Loading branch information
legastero committed Oct 7, 2010
1 parent 21c32c6 commit 0fffbb8
Show file tree
Hide file tree
Showing 22 changed files with 192 additions and 171 deletions.
10 changes: 10 additions & 0 deletions sleekxmpp/test/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
"""
SleekXMPP: The Sleek XMPP Library
Copyright (C) 2010 Nathanael C. Fritz, Lance J.T. Stout
This file is part of SleekXMPP.
See the file LICENSE for copying permission.
"""

from sleekxmpp.test.mocksocket import TestSocket
from sleekxmpp.test.sleektest import *
139 changes: 139 additions & 0 deletions sleekxmpp/test/mocksocket.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
"""
SleekXMPP: The Sleek XMPP Library
Copyright (C) 2010 Nathanael C. Fritz, Lance J.T. Stout
This file is part of SleekXMPP.
See the file LICENSE for copying permission.
"""

import socket
try:
import queue
except ImportError:
import Queue as queue


class TestSocket(object):

"""
A dummy socket that reads and writes to queues instead
of an actual networking socket.
Methods:
next_sent -- Return the next sent stanza.
recv_data -- Make a stanza available to read next.
recv -- Read the next stanza from the socket.
send -- Write a stanza to the socket.
makefile -- Dummy call, returns self.
read -- Read the next stanza from the socket.
"""

def __init__(self, *args, **kwargs):
"""
Create a new test socket.
Arguments:
Same as arguments for socket.socket
"""
self.socket = socket.socket(*args, **kwargs)
self.recv_queue = queue.Queue()
self.send_queue = queue.Queue()

def __getattr__(self, name):
"""
Return attribute values of internal, dummy socket.
Some attributes and methods are disabled to prevent the
socket from connecting to the network.
Arguments:
name -- Name of the attribute requested.
"""

def dummy(*args):
"""Method to do nothing and prevent actual socket connections."""
return None

overrides = {'connect': dummy,
'close': dummy,
'shutdown': dummy}

return overrides.get(name, getattr(self.socket, name))

# ------------------------------------------------------------------
# Testing Interface

def next_sent(self, timeout=None):
"""
Get the next stanza that has been 'sent'.
Arguments:
timeout -- Optional timeout for waiting for a new value.
"""
args = {'block': False}
if timeout is not None:
args = {'block': True, 'timeout': timeout}
try:
return self.send_queue.get(**args)
except:
return None

def recv_data(self, data):
"""
Add data to the receiving queue.
Arguments:
data -- String data to 'write' to the socket to be received
by the XMPP client.
"""
self.recv_queue.put(data)

# ------------------------------------------------------------------
# Socket Interface

def recv(self, *args, **kwargs):
"""
Read a value from the received queue.
Arguments:
Placeholders. Same as for socket.Socket.recv.
"""
return self.read(block=True)

def send(self, data):
"""
Send data by placing it in the send queue.
Arguments:
data -- String value to write.
"""
self.send_queue.put(data)

# ------------------------------------------------------------------
# File Socket

def makefile(self, *args, **kwargs):
"""
File socket version to use with ElementTree.
Arguments:
Placeholders, same as socket.Socket.makefile()
"""
return self

def read(self, block=True, timeout=None, **kwargs):
"""
Implement the file socket interface.
Arguments:
block -- Indicate if the read should block until a
value is ready.
timeout -- Time in seconds a block should last before
returning None.
"""
if timeout is not None:
block = True
try:
return self.recv_queue.get(block, timeout)
except:
return None
144 changes: 7 additions & 137 deletions tests/sleektest.py → sleekxmpp/test/sleektest.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,145 +7,15 @@
"""

import unittest
import socket
try:
import queue
except ImportError:
import Queue as queue

import sleekxmpp
from sleekxmpp import ClientXMPP, ComponentXMPP
from sleekxmpp.stanza import Message, Iq, Presence
from sleekxmpp.test import TestSocket
from sleekxmpp.xmlstream.stanzabase import registerStanzaPlugin, ET
from sleekxmpp.xmlstream.tostring import tostring


class TestSocket(object):

"""
A dummy socket that reads and writes to queues instead
of an actual networking socket.
Methods:
next_sent -- Return the next sent stanza.
recv_data -- Make a stanza available to read next.
recv -- Read the next stanza from the socket.
send -- Write a stanza to the socket.
makefile -- Dummy call, returns self.
read -- Read the next stanza from the socket.
"""

def __init__(self, *args, **kwargs):
"""
Create a new test socket.
Arguments:
Same as arguments for socket.socket
"""
self.socket = socket.socket(*args, **kwargs)
self.recv_queue = queue.Queue()
self.send_queue = queue.Queue()

def __getattr__(self, name):
"""
Return attribute values of internal, dummy socket.
Some attributes and methods are disabled to prevent the
socket from connecting to the network.
Arguments:
name -- Name of the attribute requested.
"""

def dummy(*args):
"""Method to do nothing and prevent actual socket connections."""
return None

overrides = {'connect': dummy,
'close': dummy,
'shutdown': dummy}

return overrides.get(name, getattr(self.socket, name))

# ------------------------------------------------------------------
# Testing Interface

def next_sent(self, timeout=None):
"""
Get the next stanza that has been 'sent'.
Arguments:
timeout -- Optional timeout for waiting for a new value.
"""
args = {'block': False}
if timeout is not None:
args = {'block': True, 'timeout': timeout}
try:
return self.send_queue.get(**args)
except:
return None

def recv_data(self, data):
"""
Add data to the receiving queue.
Arguments:
data -- String data to 'write' to the socket to be received
by the XMPP client.
"""
self.recv_queue.put(data)

# ------------------------------------------------------------------
# Socket Interface

def recv(self, *args, **kwargs):
"""
Read a value from the received queue.
Arguments:
Placeholders. Same as for socket.Socket.recv.
"""
return self.read(block=True)

def send(self, data):
"""
Send data by placing it in the send queue.
Arguments:
data -- String value to write.
"""
self.send_queue.put(data)

# ------------------------------------------------------------------
# File Socket

def makefile(self, *args, **kwargs):
"""
File socket version to use with ElementTree.
Arguments:
Placeholders, same as socket.Socket.makefile()
"""
return self

def read(self, block=True, timeout=None, **kwargs):
"""
Implement the file socket interface.
Arguments:
block -- Indicate if the read should block until a
value is ready.
timeout -- Time in seconds a block should last before
returning None.
"""
if timeout is not None:
block = True
try:
return self.recv_queue.get(block, timeout)
except:
return None


class SleekTest(unittest.TestCase):

"""
Expand Down Expand Up @@ -402,12 +272,12 @@ def stream_recv(self, data):
self.xmpp.socket.recv_data(data)

def stream_make_header(self, sto='',
sfrom='',
sid='',
stream_ns="http://etherx.jabber.org/streams",
default_ns="jabber:client",
version="1.0",
xml_header=True):
sfrom='',
sid='',
stream_ns="http://etherx.jabber.org/streams",
default_ns="jabber:client",
version="1.0",
xml_header=True):
"""
Create a stream header to be received by the test XMPP agent.
Expand Down
Empty file removed tests/__init__.py
Empty file.
3 changes: 1 addition & 2 deletions tests/test_events.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import sleekxmpp
import time
from . sleektest import *
from sleekxmpp.test import *


class TestEvents(SleekTest):
Expand Down
4 changes: 3 additions & 1 deletion tests/test_jid.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from . sleektest import *
from sleekxmpp.test import *
from sleekxmpp.xmlstream.jid import JID


class TestJIDClass(SleekTest):
def testJIDfromfull(self):
j = JID('user@someserver/some/resource')
Expand All @@ -23,4 +24,5 @@ def testJIDchange(self):
self.assertEqual(j.full, 'user@someserver/some/resource', "Full does not match")
self.assertEqual(str(j), 'user@someserver/some/resource', "String does not match")


suite = unittest.TestLoader().loadTestsFromTestCase(TestJIDClass)
4 changes: 2 additions & 2 deletions tests/test_stanzabase.py → tests/test_stanza_base.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from . sleektest import *
import sleekxmpp
from sleekxmpp.test import *
from sleekxmpp.xmlstream.stanzabase import ET, StanzaBase


class TestStanzaBase(SleekTest):

def testTo(self):
Expand Down
3 changes: 2 additions & 1 deletion tests/test_elementbase.py → tests/test_stanza_element.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from . sleektest import *
from sleekxmpp.test import *
from sleekxmpp.xmlstream.stanzabase import ElementBase


class TestElementBase(SleekTest):

def testFixNs(self):
Expand Down
3 changes: 2 additions & 1 deletion tests/test_errorstanzas.py → tests/test_stanza_error.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from . sleektest import *
from sleekxmpp.test import *


class TestErrorStanzas(SleekTest):

Expand Down
Loading

0 comments on commit 0fffbb8

Please sign in to comment.