Updated SleekTest and related tests.
May now use a component for stream testing. Methods provided for testing stream headers.
This commit is contained in:
parent
c294c1a85c
commit
f234dc02cf
3 changed files with 128 additions and 17 deletions
|
@ -14,7 +14,7 @@ except ImportError:
|
||||||
import Queue as queue
|
import Queue as queue
|
||||||
|
|
||||||
import sleekxmpp
|
import sleekxmpp
|
||||||
from sleekxmpp import ClientXMPP
|
from sleekxmpp import ClientXMPP, ComponentXMPP
|
||||||
from sleekxmpp.stanza import Message, Iq, Presence
|
from sleekxmpp.stanza import Message, Iq, Presence
|
||||||
from sleekxmpp.xmlstream.stanzabase import registerStanzaPlugin, ET
|
from sleekxmpp.xmlstream.stanzabase import registerStanzaPlugin, ET
|
||||||
from sleekxmpp.xmlstream.tostring import tostring
|
from sleekxmpp.xmlstream.tostring import tostring
|
||||||
|
@ -307,7 +307,7 @@ class SleekTest(unittest.TestCase):
|
||||||
|
|
||||||
return self.checkStanza(Message, msg, xml_string,
|
return self.checkStanza(Message, msg, xml_string,
|
||||||
defaults=['type'],
|
defaults=['type'],
|
||||||
use_values = use_values)
|
use_values=use_values)
|
||||||
|
|
||||||
def checkIq(self, iq, xml_string, use_values=True):
|
def checkIq(self, iq, xml_string, use_values=True):
|
||||||
"""
|
"""
|
||||||
|
@ -348,7 +348,7 @@ class SleekTest(unittest.TestCase):
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
# Methods for simulating stanza streams.
|
# Methods for simulating stanza streams.
|
||||||
|
|
||||||
def streamStart(self, mode='client', skip=True):
|
def streamStart(self, mode='client', skip=True, header=None):
|
||||||
"""
|
"""
|
||||||
Initialize an XMPP client or component using a dummy XML stream.
|
Initialize an XMPP client or component using a dummy XML stream.
|
||||||
|
|
||||||
|
@ -361,21 +361,30 @@ class SleekTest(unittest.TestCase):
|
||||||
"""
|
"""
|
||||||
if mode == 'client':
|
if mode == 'client':
|
||||||
self.xmpp = ClientXMPP('tester@localhost', 'test')
|
self.xmpp = ClientXMPP('tester@localhost', 'test')
|
||||||
self.xmpp.setSocket(TestSocket())
|
elif mode == 'component':
|
||||||
|
self.xmpp = ComponentXMPP('tester.localhost', 'test',
|
||||||
|
'localhost', 8888)
|
||||||
|
else:
|
||||||
|
raise ValueError("Unknown XMPP connection mode.")
|
||||||
|
|
||||||
self.xmpp.state.set('reconnect', False)
|
self.xmpp.setSocket(TestSocket())
|
||||||
self.xmpp.state.set('is client', True)
|
self.xmpp.state.set('reconnect', False)
|
||||||
self.xmpp.state.set('connected', True)
|
self.xmpp.state.set('is client', True)
|
||||||
|
self.xmpp.state.set('connected', True)
|
||||||
|
|
||||||
# Must have the stream header ready for xmpp.process() to work
|
# Must have the stream header ready for xmpp.process() to work.
|
||||||
self.xmpp.socket.recvData(self.xmpp.stream_header)
|
if not header:
|
||||||
|
header = self.xmpp.stream_header
|
||||||
|
self.xmpp.socket.recvData(header)
|
||||||
|
|
||||||
self.xmpp.connectTCP = lambda a, b, c, d: True
|
self.xmpp.connect = lambda a=None, b=None, c=None, d=None: True
|
||||||
self.xmpp.startTLS = lambda: True
|
self.xmpp.start_tls = lambda: True
|
||||||
self.xmpp.process(threaded=True)
|
self.xmpp.process(threaded=True)
|
||||||
if skip:
|
if skip:
|
||||||
# Clear startup stanzas
|
# Clear startup stanzas
|
||||||
self.xmpp.socket.nextSent(timeout=0.01)
|
self.xmpp.socket.nextSent(timeout=0.01)
|
||||||
|
if mode == 'component':
|
||||||
|
self.xmpp.socket.nextSent(timeout=0.01)
|
||||||
|
|
||||||
def streamRecv(self, data):
|
def streamRecv(self, data):
|
||||||
"""
|
"""
|
||||||
|
@ -388,6 +397,87 @@ class SleekTest(unittest.TestCase):
|
||||||
data = str(data)
|
data = str(data)
|
||||||
self.xmpp.socket.recvData(data)
|
self.xmpp.socket.recvData(data)
|
||||||
|
|
||||||
|
def makeStreamHeader(self, sto='',
|
||||||
|
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.
|
||||||
|
|
||||||
|
The header must be saved and passed to streamStart.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
sto -- The recipient of the stream header.
|
||||||
|
sfrom -- The agent sending the stream header.
|
||||||
|
sid -- The stream's id.
|
||||||
|
stream_ns -- The namespace of the stream's root element.
|
||||||
|
default_ns -- The default stanza namespace.
|
||||||
|
version -- The stream version.
|
||||||
|
xml_header -- Indicates if the XML version header should be
|
||||||
|
appended before the stream header.
|
||||||
|
"""
|
||||||
|
header = '<stream:stream %s>'
|
||||||
|
if xml_header:
|
||||||
|
header = '<?xml version="1.0"?>' + header
|
||||||
|
if sto:
|
||||||
|
parts.append('to="%s"' % sto)
|
||||||
|
if sfrom:
|
||||||
|
parts.append('from="%s"' % sfrom)
|
||||||
|
if sid:
|
||||||
|
parts.append('id="%s"' % sid)
|
||||||
|
parts.append('version="%s"' % version)
|
||||||
|
parts.append('xmlns:stream="%s"' % stream_ns)
|
||||||
|
parts.append('xmlns="%s"' % default_ns)
|
||||||
|
return header % ' '.join(parts)
|
||||||
|
|
||||||
|
def streamSendHeader(self, sto='',
|
||||||
|
sfrom='',
|
||||||
|
sid='',
|
||||||
|
stream_ns="http://etherx.jabber.org/streams",
|
||||||
|
default_ns="jabber:client",
|
||||||
|
version="1.0",
|
||||||
|
xml_header=False,
|
||||||
|
timeout=0.1):
|
||||||
|
"""
|
||||||
|
Check that a given stream header was sent.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
sto -- The recipient of the stream header.
|
||||||
|
sfrom -- The agent sending the stream header.
|
||||||
|
sid -- The stream's id.
|
||||||
|
stream_ns -- The namespace of the stream's root element.
|
||||||
|
default_ns -- The default stanza namespace.
|
||||||
|
version -- The stream version.
|
||||||
|
xml_header -- Indicates if the XML version header should be
|
||||||
|
appended before the stream header.
|
||||||
|
timeout -- Length of time to wait in seconds for a
|
||||||
|
response.
|
||||||
|
"""
|
||||||
|
header = self.makeStreamHeader(sto, sfrom, sid,
|
||||||
|
stream_ns=stream_ns,
|
||||||
|
default_ns=default_ns,
|
||||||
|
version=version,
|
||||||
|
xml_header=xml_header)
|
||||||
|
sent_header = self.xmpp.socket.nextSent(timeout)
|
||||||
|
if sent_header is None:
|
||||||
|
raise ValueError("Socket did not return data.")
|
||||||
|
|
||||||
|
# Apply closing elements so that we can construct
|
||||||
|
# XML objects for comparison.
|
||||||
|
header2 += '</stream:stream>'
|
||||||
|
sent_header2 += '</stream:stream>'
|
||||||
|
|
||||||
|
xml = ET.fromstring(header2)
|
||||||
|
sent_xml = ET.fromstring(sent_header2)
|
||||||
|
|
||||||
|
self.failUnless(
|
||||||
|
self.compare(xml, sent_xml),
|
||||||
|
"Stream headers do not match:\nDesired:\n%s\nSent:\n%s" % (
|
||||||
|
header, sent_header))
|
||||||
|
|
||||||
def streamSendMessage(self, data, use_values=True, timeout=.1):
|
def streamSendMessage(self, data, use_values=True, timeout=.1):
|
||||||
"""
|
"""
|
||||||
Check that the XMPP client sent the given stanza XML.
|
Check that the XMPP client sent the given stanza XML.
|
||||||
|
@ -481,7 +571,7 @@ class SleekTest(unittest.TestCase):
|
||||||
Compare XML objects.
|
Compare XML objects.
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
xml -- The XML object to compare against.
|
xml -- The XML object to compare against.
|
||||||
*other -- The list of XML objects to compare.
|
*other -- The list of XML objects to compare.
|
||||||
"""
|
"""
|
||||||
if not other:
|
if not other:
|
||||||
|
|
|
@ -5,7 +5,7 @@ from sleekxmpp.xmlstream.matcher import *
|
||||||
|
|
||||||
class TestHandlers(SleekTest):
|
class TestHandlers(SleekTest):
|
||||||
"""
|
"""
|
||||||
Test that we can simulate and test a stanza stream.
|
Test using handlers and waiters.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|
|
@ -7,13 +7,13 @@ class TestStreamTester(SleekTest):
|
||||||
Test that we can simulate and test a stanza stream.
|
Test that we can simulate and test a stanza stream.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
self.streamStart()
|
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
self.streamClose()
|
self.streamClose()
|
||||||
|
|
||||||
def testEcho(self):
|
def testClientEcho(self):
|
||||||
|
"""Test that we can interact with a ClientXMPP instance."""
|
||||||
|
self.streamStart(mode='client')
|
||||||
|
|
||||||
def echo(msg):
|
def echo(msg):
|
||||||
msg.reply('Thanks for sending: %(body)s' % msg).send()
|
msg.reply('Thanks for sending: %(body)s' % msg).send()
|
||||||
|
|
||||||
|
@ -31,4 +31,25 @@ class TestStreamTester(SleekTest):
|
||||||
</message>
|
</message>
|
||||||
""")
|
""")
|
||||||
|
|
||||||
|
def testComponentEcho(self):
|
||||||
|
"""Test that we can interact with a ComponentXMPP instance."""
|
||||||
|
self.streamStart(mode='component')
|
||||||
|
|
||||||
|
def echo(msg):
|
||||||
|
msg.reply('Thanks for sending: %(body)s' % msg).send()
|
||||||
|
|
||||||
|
self.xmpp.add_event_handler('message', echo)
|
||||||
|
|
||||||
|
self.streamRecv("""
|
||||||
|
<message to="tester.localhost" from="user@localhost">
|
||||||
|
<body>Hi!</body>
|
||||||
|
</message>
|
||||||
|
""")
|
||||||
|
|
||||||
|
self.streamSendMessage("""
|
||||||
|
<message to="user@localhost" from="tester.localhost">
|
||||||
|
<body>Thanks for sending: Hi!</body>
|
||||||
|
</message>
|
||||||
|
""")
|
||||||
|
|
||||||
suite = unittest.TestLoader().loadTestsFromTestCase(TestStreamTester)
|
suite = unittest.TestLoader().loadTestsFromTestCase(TestStreamTester)
|
Loading…
Reference in a new issue