| Index: third_party/twisted_8_1/twisted/words/test/test_jabberxmlstream.py
|
| diff --git a/third_party/twisted_8_1/twisted/words/test/test_jabberxmlstream.py b/third_party/twisted_8_1/twisted/words/test/test_jabberxmlstream.py
|
| deleted file mode 100644
|
| index 2313b0d036b9b2aec20092006155015c9b18f1c8..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/words/test/test_jabberxmlstream.py
|
| +++ /dev/null
|
| @@ -1,1174 +0,0 @@
|
| -# Copyright (c) 2001-2008 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -"""
|
| -Tests for L{twisted.words.protocols.jabber.xmlstream}.
|
| -"""
|
| -
|
| -from twisted.trial import unittest
|
| -
|
| -from zope.interface.verify import verifyObject
|
| -
|
| -from twisted.internet import defer, task
|
| -from twisted.internet.error import ConnectionLost
|
| -from twisted.test import proto_helpers
|
| -from twisted.words.xish import domish
|
| -from twisted.words.protocols.jabber import error, ijabber, jid, xmlstream
|
| -
|
| -
|
| -
|
| -NS_XMPP_TLS = 'urn:ietf:params:xml:ns:xmpp-tls'
|
| -
|
| -
|
| -
|
| -class IQTest(unittest.TestCase):
|
| - """
|
| - Tests both IQ and the associated IIQResponseTracker callback.
|
| - """
|
| -
|
| - def setUp(self):
|
| - authenticator = xmlstream.ConnectAuthenticator('otherhost')
|
| - authenticator.namespace = 'testns'
|
| - self.xmlstream = xmlstream.XmlStream(authenticator)
|
| - self.clock = task.Clock()
|
| - self.xmlstream._callLater = self.clock.callLater
|
| - self.xmlstream.makeConnection(proto_helpers.StringTransport())
|
| - self.xmlstream.dataReceived(
|
| - "<stream:stream xmlns:stream='http://etherx.jabber.org/streams' "
|
| - "xmlns='testns' from='otherhost' version='1.0'>")
|
| - self.iq = xmlstream.IQ(self.xmlstream, 'get')
|
| -
|
| -
|
| - def testBasic(self):
|
| - self.assertEquals(self.iq['type'], 'get')
|
| - self.assertTrue(self.iq['id'])
|
| -
|
| -
|
| - def testSend(self):
|
| - self.xmlstream.transport.clear()
|
| - self.iq.send()
|
| - self.assertEquals("<iq type='get' id='%s'/>" % self.iq['id'],
|
| - self.xmlstream.transport.value())
|
| -
|
| -
|
| - def testResultResponse(self):
|
| - def cb(result):
|
| - self.assertEquals(result['type'], 'result')
|
| -
|
| - d = self.iq.send()
|
| - d.addCallback(cb)
|
| -
|
| - xs = self.xmlstream
|
| - xs.dataReceived("<iq type='result' id='%s'/>" % self.iq['id'])
|
| - return d
|
| -
|
| -
|
| - def testErrorResponse(self):
|
| - d = self.iq.send()
|
| - self.assertFailure(d, error.StanzaError)
|
| -
|
| - xs = self.xmlstream
|
| - xs.dataReceived("<iq type='error' id='%s'/>" % self.iq['id'])
|
| - return d
|
| -
|
| -
|
| - def testNonTrackedResponse(self):
|
| - """
|
| - Test that untracked iq responses don't trigger any action.
|
| -
|
| - Untracked means that the id of the incoming response iq is not
|
| - in the stream's C{iqDeferreds} dictionary.
|
| - """
|
| - xs = self.xmlstream
|
| - xmlstream.upgradeWithIQResponseTracker(xs)
|
| -
|
| - # Make sure we aren't tracking any iq's.
|
| - self.failIf(xs.iqDeferreds)
|
| -
|
| - # Set up a fallback handler that checks the stanza's handled attribute.
|
| - # If that is set to True, the iq tracker claims to have handled the
|
| - # response.
|
| - def cb(iq):
|
| - self.failIf(getattr(iq, 'handled', False))
|
| -
|
| - xs.addObserver("/iq", cb, -1)
|
| -
|
| - # Receive an untracked iq response
|
| - xs.dataReceived("<iq type='result' id='test'/>")
|
| -
|
| -
|
| - def testCleanup(self):
|
| - """
|
| - Test if the deferred associated with an iq request is removed
|
| - from the list kept in the L{XmlStream} object after it has
|
| - been fired.
|
| - """
|
| -
|
| - d = self.iq.send()
|
| - xs = self.xmlstream
|
| - xs.dataReceived("<iq type='result' id='%s'/>" % self.iq['id'])
|
| - self.assertNotIn(self.iq['id'], xs.iqDeferreds)
|
| - return d
|
| -
|
| -
|
| - def testDisconnectCleanup(self):
|
| - """
|
| - Test if deferreds for iq's that haven't yet received a response
|
| - have their errback called on stream disconnect.
|
| - """
|
| -
|
| - d = self.iq.send()
|
| - xs = self.xmlstream
|
| - xs.connectionLost("Closed by peer")
|
| - self.assertFailure(d, ConnectionLost)
|
| - return d
|
| -
|
| -
|
| - def testNoModifyingDict(self):
|
| - """
|
| - Test to make sure the errbacks cannot cause the iteration of the
|
| - iqDeferreds to blow up in our face.
|
| - """
|
| -
|
| - def eb(failure):
|
| - d = xmlstream.IQ(self.xmlstream).send()
|
| - d.addErrback(eb)
|
| -
|
| - d = self.iq.send()
|
| - d.addErrback(eb)
|
| - self.xmlstream.connectionLost("Closed by peer")
|
| - return d
|
| -
|
| -
|
| - def testRequestTimingOut(self):
|
| - """
|
| - Test that an iq request with a defined timeout times out.
|
| - """
|
| - self.iq.timeout = 60
|
| - d = self.iq.send()
|
| - self.assertFailure(d, xmlstream.TimeoutError)
|
| -
|
| - self.clock.pump([1, 60])
|
| - self.failIf(self.clock.calls)
|
| - self.failIf(self.xmlstream.iqDeferreds)
|
| - return d
|
| -
|
| -
|
| - def testRequestNotTimingOut(self):
|
| - """
|
| - Test that an iq request with a defined timeout does not time out
|
| - when a response was received before the timeout period elapsed.
|
| - """
|
| - self.iq.timeout = 60
|
| - d = self.iq.send()
|
| - self.clock.callLater(1, self.xmlstream.dataReceived,
|
| - "<iq type='result' id='%s'/>" % self.iq['id'])
|
| - self.clock.pump([1, 1])
|
| - self.failIf(self.clock.calls)
|
| - return d
|
| -
|
| -
|
| - def testDisconnectTimeoutCancellation(self):
|
| - """
|
| - Test if timeouts for iq's that haven't yet received a response
|
| - are cancelled on stream disconnect.
|
| - """
|
| -
|
| - self.iq.timeout = 60
|
| - d = self.iq.send()
|
| -
|
| - xs = self.xmlstream
|
| - xs.connectionLost("Closed by peer")
|
| - self.assertFailure(d, ConnectionLost)
|
| - self.failIf(self.clock.calls)
|
| - return d
|
| -
|
| -
|
| -
|
| -class XmlStreamTest(unittest.TestCase):
|
| -
|
| - def onStreamStart(self, obj):
|
| - self.gotStreamStart = True
|
| -
|
| -
|
| - def onStreamEnd(self, obj):
|
| - self.gotStreamEnd = True
|
| -
|
| -
|
| - def onStreamError(self, obj):
|
| - self.gotStreamError = True
|
| -
|
| -
|
| - def setUp(self):
|
| - """
|
| - Set up XmlStream and several observers.
|
| - """
|
| - self.gotStreamStart = False
|
| - self.gotStreamEnd = False
|
| - self.gotStreamError = False
|
| - xs = xmlstream.XmlStream(xmlstream.Authenticator())
|
| - xs.addObserver('//event/stream/start', self.onStreamStart)
|
| - xs.addObserver('//event/stream/end', self.onStreamEnd)
|
| - xs.addObserver('//event/stream/error', self.onStreamError)
|
| - xs.makeConnection(proto_helpers.StringTransportWithDisconnection())
|
| - xs.transport.protocol = xs
|
| - xs.namespace = 'testns'
|
| - xs.version = (1, 0)
|
| - self.xmlstream = xs
|
| -
|
| -
|
| - def test_sendHeaderBasic(self):
|
| - """
|
| - Basic test on the header sent by sendHeader.
|
| - """
|
| - xs = self.xmlstream
|
| - xs.sendHeader()
|
| - splitHeader = self.xmlstream.transport.value()[0:-1].split(' ')
|
| - self.assertIn("<stream:stream", splitHeader)
|
| - self.assertIn("xmlns:stream='http://etherx.jabber.org/streams'",
|
| - splitHeader)
|
| - self.assertIn("xmlns='testns'", splitHeader)
|
| - self.assertIn("version='1.0'", splitHeader)
|
| - self.assertTrue(xs._headerSent)
|
| -
|
| -
|
| - def test_sendHeaderAdditionalNamespaces(self):
|
| - """
|
| - Test for additional namespace declarations.
|
| - """
|
| - xs = self.xmlstream
|
| - xs.prefixes['jabber:server:dialback'] = 'db'
|
| - xs.sendHeader()
|
| - splitHeader = self.xmlstream.transport.value()[0:-1].split(' ')
|
| - self.assertIn("<stream:stream", splitHeader)
|
| - self.assertIn("xmlns:stream='http://etherx.jabber.org/streams'",
|
| - splitHeader)
|
| - self.assertIn("xmlns:db='jabber:server:dialback'", splitHeader)
|
| - self.assertIn("xmlns='testns'", splitHeader)
|
| - self.assertIn("version='1.0'", splitHeader)
|
| - self.assertTrue(xs._headerSent)
|
| -
|
| -
|
| - def test_sendHeaderInitiating(self):
|
| - """
|
| - Test addressing when initiating a stream.
|
| - """
|
| - xs = self.xmlstream
|
| - xs.thisEntity = jid.JID('thisHost')
|
| - xs.otherEntity = jid.JID('otherHost')
|
| - xs.initiating = True
|
| - xs.sendHeader()
|
| - splitHeader = xs.transport.value()[0:-1].split(' ')
|
| - self.assertIn("to='otherhost'", splitHeader)
|
| - self.assertIn("from='thishost'", splitHeader)
|
| -
|
| -
|
| - def test_sendHeaderReceiving(self):
|
| - """
|
| - Test addressing when receiving a stream.
|
| - """
|
| - xs = self.xmlstream
|
| - xs.thisEntity = jid.JID('thisHost')
|
| - xs.otherEntity = jid.JID('otherHost')
|
| - xs.initiating = False
|
| - xs.sid = 'session01'
|
| - xs.sendHeader()
|
| - splitHeader = xs.transport.value()[0:-1].split(' ')
|
| - self.assertIn("to='otherhost'", splitHeader)
|
| - self.assertIn("from='thishost'", splitHeader)
|
| - self.assertIn("id='session01'", splitHeader)
|
| -
|
| -
|
| - def test_receiveStreamError(self):
|
| - """
|
| - Test events when a stream error is received.
|
| - """
|
| - xs = self.xmlstream
|
| - xs.dataReceived("<stream:stream xmlns='jabber:client' "
|
| - "xmlns:stream='http://etherx.jabber.org/streams' "
|
| - "from='example.com' id='12345' version='1.0'>")
|
| - xs.dataReceived("<stream:error/>")
|
| - self.assertTrue(self.gotStreamError)
|
| - self.assertTrue(self.gotStreamEnd)
|
| -
|
| -
|
| - def test_sendStreamErrorInitiating(self):
|
| - """
|
| - Test sendStreamError on an initiating xmlstream with a header sent.
|
| -
|
| - An error should be sent out and the connection lost.
|
| - """
|
| - xs = self.xmlstream
|
| - xs.initiating = True
|
| - xs.sendHeader()
|
| - xs.transport.clear()
|
| - xs.sendStreamError(error.StreamError('version-unsupported'))
|
| - self.assertNotEqual('', xs.transport.value())
|
| - self.assertTrue(self.gotStreamEnd)
|
| -
|
| -
|
| - def test_sendStreamErrorInitiatingNoHeader(self):
|
| - """
|
| - Test sendStreamError on an initiating xmlstream without having sent a
|
| - header.
|
| -
|
| - In this case, no header should be generated. Also, the error should
|
| - not be sent out on the stream. Just closing the connection.
|
| - """
|
| - xs = self.xmlstream
|
| - xs.initiating = True
|
| - xs.transport.clear()
|
| - xs.sendStreamError(error.StreamError('version-unsupported'))
|
| - self.assertNot(xs._headerSent)
|
| - self.assertEqual('', xs.transport.value())
|
| - self.assertTrue(self.gotStreamEnd)
|
| -
|
| -
|
| - def test_sendStreamErrorReceiving(self):
|
| - """
|
| - Test sendStreamError on a receiving xmlstream with a header sent.
|
| -
|
| - An error should be sent out and the connection lost.
|
| - """
|
| - xs = self.xmlstream
|
| - xs.initiating = False
|
| - xs.sendHeader()
|
| - xs.transport.clear()
|
| - xs.sendStreamError(error.StreamError('version-unsupported'))
|
| - self.assertNotEqual('', xs.transport.value())
|
| - self.assertTrue(self.gotStreamEnd)
|
| -
|
| -
|
| - def test_sendStreamErrorReceivingNoHeader(self):
|
| - """
|
| - Test sendStreamError on a receiving xmlstream without having sent a
|
| - header.
|
| -
|
| - In this case, a header should be generated. Then, the error should
|
| - be sent out on the stream followed by closing the connection.
|
| - """
|
| - xs = self.xmlstream
|
| - xs.initiating = False
|
| - xs.transport.clear()
|
| - xs.sendStreamError(error.StreamError('version-unsupported'))
|
| - self.assertTrue(xs._headerSent)
|
| - self.assertNotEqual('', xs.transport.value())
|
| - self.assertTrue(self.gotStreamEnd)
|
| -
|
| -
|
| - def test_reset(self):
|
| - """
|
| - Test resetting the XML stream to start a new layer.
|
| - """
|
| - xs = self.xmlstream
|
| - xs.sendHeader()
|
| - stream = xs.stream
|
| - xs.reset()
|
| - self.assertNotEqual(stream, xs.stream)
|
| - self.assertNot(xs._headerSent)
|
| -
|
| -
|
| - def test_send(self):
|
| - """
|
| - Test send with various types of objects.
|
| - """
|
| - xs = self.xmlstream
|
| - xs.send('<presence/>')
|
| - self.assertEqual(xs.transport.value(), '<presence/>')
|
| -
|
| - xs.transport.clear()
|
| - el = domish.Element(('testns', 'presence'))
|
| - xs.send(el)
|
| - self.assertEqual(xs.transport.value(), '<presence/>')
|
| -
|
| - xs.transport.clear()
|
| - el = domish.Element(('http://etherx.jabber.org/streams', 'features'))
|
| - xs.send(el)
|
| - self.assertEqual(xs.transport.value(), '<stream:features/>')
|
| -
|
| -
|
| - def test_authenticator(self):
|
| - """
|
| - Test that the associated authenticator is correctly called.
|
| - """
|
| - connectionMadeCalls = []
|
| - streamStartedCalls = []
|
| - associateWithStreamCalls = []
|
| -
|
| - class TestAuthenticator:
|
| - def connectionMade(self):
|
| - connectionMadeCalls.append(None)
|
| -
|
| - def streamStarted(self, rootElement):
|
| - streamStartedCalls.append(rootElement)
|
| -
|
| - def associateWithStream(self, xs):
|
| - associateWithStreamCalls.append(xs)
|
| -
|
| - a = TestAuthenticator()
|
| - xs = xmlstream.XmlStream(a)
|
| - self.assertEqual([xs], associateWithStreamCalls)
|
| - xs.connectionMade()
|
| - self.assertEqual([None], connectionMadeCalls)
|
| - xs.dataReceived("<stream:stream xmlns='jabber:client' "
|
| - "xmlns:stream='http://etherx.jabber.org/streams' "
|
| - "from='example.com' id='12345'>")
|
| - self.assertEqual(1, len(streamStartedCalls))
|
| - xs.reset()
|
| - self.assertEqual([None], connectionMadeCalls)
|
| -
|
| -
|
| -
|
| -class TestError(Exception):
|
| - pass
|
| -
|
| -
|
| -
|
| -class AuthenticatorTest(unittest.TestCase):
|
| - def setUp(self):
|
| - self.authenticator = xmlstream.ListenAuthenticator()
|
| - self.xmlstream = xmlstream.XmlStream(self.authenticator)
|
| -
|
| -
|
| - def test_streamStart(self):
|
| - """
|
| - Test streamStart to fill the appropriate attributes from the
|
| - stream header.
|
| - """
|
| - xs = self.xmlstream
|
| - xs.makeConnection(proto_helpers.StringTransport())
|
| - xs.dataReceived("<stream:stream xmlns='jabber:client' "
|
| - "xmlns:stream='http://etherx.jabber.org/streams' "
|
| - "from='example.org' to='example.com' id='12345' "
|
| - "version='1.0'>")
|
| - self.assertEqual((1, 0), xs.version)
|
| - self.assertIdentical(None, xs.sid)
|
| - self.assertEqual('jabber:client', xs.namespace)
|
| - self.assertIdentical(None, xs.otherEntity)
|
| - self.assertEqual('example.com', xs.thisEntity.host)
|
| -
|
| -
|
| - def test_streamStartLegacy(self):
|
| - """
|
| - Test streamStart to fill the appropriate attributes from the
|
| - stream header for a pre-XMPP-1.0 header.
|
| - """
|
| - xs = self.xmlstream
|
| - xs.makeConnection(proto_helpers.StringTransport())
|
| - xs.dataReceived("<stream:stream xmlns='jabber:client' "
|
| - "xmlns:stream='http://etherx.jabber.org/streams' "
|
| - "from='example.com' id='12345'>")
|
| - self.assertEqual((0, 0), xs.version)
|
| -
|
| -
|
| - def test_streamBadVersionOneDigit(self):
|
| - """
|
| - Test streamStart to fill the appropriate attributes from the
|
| - stream header for a version with only one digit.
|
| - """
|
| - xs = self.xmlstream
|
| - xs.makeConnection(proto_helpers.StringTransport())
|
| - xs.dataReceived("<stream:stream xmlns='jabber:client' "
|
| - "xmlns:stream='http://etherx.jabber.org/streams' "
|
| - "from='example.com' id='12345' version='1'>")
|
| - self.assertEqual((0, 0), xs.version)
|
| -
|
| -
|
| - def test_streamBadVersionNoNumber(self):
|
| - """
|
| - Test streamStart to fill the appropriate attributes from the
|
| - stream header for a malformed version.
|
| - """
|
| - xs = self.xmlstream
|
| - xs.makeConnection(proto_helpers.StringTransport())
|
| - xs.dataReceived("<stream:stream xmlns='jabber:client' "
|
| - "xmlns:stream='http://etherx.jabber.org/streams' "
|
| - "from='example.com' id='12345' version='blah'>")
|
| - self.assertEqual((0, 0), xs.version)
|
| -
|
| -
|
| -
|
| -class ConnectAuthenticatorTest(unittest.TestCase):
|
| -
|
| - def setUp(self):
|
| - self.gotAuthenticated = False
|
| - self.initFailure = None
|
| - self.authenticator = xmlstream.ConnectAuthenticator('otherHost')
|
| - self.xmlstream = xmlstream.XmlStream(self.authenticator)
|
| - self.xmlstream.addObserver('//event/stream/authd', self.onAuthenticated)
|
| - self.xmlstream.addObserver('//event/xmpp/initfailed', self.onInitFailed)
|
| -
|
| -
|
| - def onAuthenticated(self, obj):
|
| - self.gotAuthenticated = True
|
| -
|
| -
|
| - def onInitFailed(self, failure):
|
| - self.initFailure = failure
|
| -
|
| -
|
| - def testSucces(self):
|
| - """
|
| - Test successful completion of an initialization step.
|
| - """
|
| - class Initializer:
|
| - def initialize(self):
|
| - pass
|
| -
|
| - init = Initializer()
|
| - self.xmlstream.initializers = [init]
|
| -
|
| - self.authenticator.initializeStream()
|
| - self.assertEqual([], self.xmlstream.initializers)
|
| - self.assertTrue(self.gotAuthenticated)
|
| -
|
| -
|
| - def testFailure(self):
|
| - """
|
| - Test failure of an initialization step.
|
| - """
|
| - class Initializer:
|
| - def initialize(self):
|
| - raise TestError
|
| -
|
| - init = Initializer()
|
| - self.xmlstream.initializers = [init]
|
| -
|
| - self.authenticator.initializeStream()
|
| - self.assertEqual([init], self.xmlstream.initializers)
|
| - self.assertFalse(self.gotAuthenticated)
|
| - self.assertNotIdentical(None, self.initFailure)
|
| - self.assertTrue(self.initFailure.check(TestError))
|
| -
|
| -
|
| - def test_streamStart(self):
|
| - """
|
| - Test streamStart to fill the appropriate attributes from the
|
| - stream header.
|
| - """
|
| - self.authenticator.namespace = 'testns'
|
| - xs = self.xmlstream
|
| - xs.makeConnection(proto_helpers.StringTransport())
|
| - xs.dataReceived("<stream:stream xmlns='jabber:client' "
|
| - "xmlns:stream='http://etherx.jabber.org/streams' "
|
| - "from='example.com' to='example.org' id='12345' "
|
| - "version='1.0'>")
|
| - self.assertEqual((1, 0), xs.version)
|
| - self.assertEqual('12345', xs.sid)
|
| - self.assertEqual('testns', xs.namespace)
|
| - self.assertEqual('example.com', xs.otherEntity.host)
|
| - self.assertIdentical(None, xs.thisEntity)
|
| - self.assertNot(self.gotAuthenticated)
|
| - xs.dataReceived("<stream:features>"
|
| - "<test xmlns='testns'/>"
|
| - "</stream:features>")
|
| - self.assertIn(('testns', 'test'), xs.features)
|
| - self.assertTrue(self.gotAuthenticated)
|
| -
|
| -
|
| -
|
| -class ListenAuthenticatorTest(unittest.TestCase):
|
| - def setUp(self):
|
| - self.authenticator = xmlstream.ListenAuthenticator()
|
| - self.xmlstream = xmlstream.XmlStream(self.authenticator)
|
| -
|
| -
|
| - def test_streamStart(self):
|
| - """
|
| - Test streamStart to fill the appropriate attributes from the
|
| - stream header.
|
| - """
|
| - xs = self.xmlstream
|
| - xs.makeConnection(proto_helpers.StringTransport())
|
| - xs.dataReceived("<stream:stream xmlns='jabber:client' "
|
| - "xmlns:stream='http://etherx.jabber.org/streams' "
|
| - "from='example.org' to='example.com' id='12345' "
|
| - "version='1.0'>")
|
| - self.assertEqual((1, 0), xs.version)
|
| - self.assertIdentical(None, xs.sid)
|
| - self.assertEqual('jabber:client', xs.namespace)
|
| - self.assertIdentical(None, xs.otherEntity)
|
| - self.assertEqual('example.com', xs.thisEntity.host)
|
| -
|
| -
|
| -
|
| -class TLSInitiatingInitializerTest(unittest.TestCase):
|
| - def setUp(self):
|
| - self.output = []
|
| - self.done = []
|
| -
|
| - self.savedSSL = xmlstream.ssl
|
| -
|
| - self.authenticator = xmlstream.Authenticator()
|
| - self.xmlstream = xmlstream.XmlStream(self.authenticator)
|
| - self.xmlstream.send = self.output.append
|
| - self.xmlstream.connectionMade()
|
| - self.xmlstream.dataReceived("<stream:stream xmlns='jabber:client' "
|
| - "xmlns:stream='http://etherx.jabber.org/streams' "
|
| - "from='example.com' id='12345' version='1.0'>")
|
| - self.init = xmlstream.TLSInitiatingInitializer(self.xmlstream)
|
| -
|
| -
|
| - def tearDown(self):
|
| - xmlstream.ssl = self.savedSSL
|
| -
|
| -
|
| - def testWantedSupported(self):
|
| - """
|
| - Test start when TLS is wanted and the SSL library available.
|
| - """
|
| - self.xmlstream.transport = proto_helpers.StringTransport()
|
| - self.xmlstream.transport.startTLS = lambda ctx: self.done.append('TLS')
|
| - self.xmlstream.reset = lambda: self.done.append('reset')
|
| - self.xmlstream.sendHeader = lambda: self.done.append('header')
|
| -
|
| - d = self.init.start()
|
| - d.addCallback(self.assertEquals, xmlstream.Reset)
|
| - starttls = self.output[0]
|
| - self.assertEquals('starttls', starttls.name)
|
| - self.assertEquals(NS_XMPP_TLS, starttls.uri)
|
| - self.xmlstream.dataReceived("<proceed xmlns='%s'/>" % NS_XMPP_TLS)
|
| - self.assertEquals(['TLS', 'reset', 'header'], self.done)
|
| -
|
| - return d
|
| -
|
| - if not xmlstream.ssl:
|
| - testWantedSupported.skip = "SSL not available"
|
| -
|
| -
|
| - def testWantedNotSupportedNotRequired(self):
|
| - """
|
| - Test start when TLS is wanted and the SSL library available.
|
| - """
|
| - xmlstream.ssl = None
|
| -
|
| - d = self.init.start()
|
| - d.addCallback(self.assertEquals, None)
|
| - self.assertEquals([], self.output)
|
| -
|
| - return d
|
| -
|
| -
|
| - def testWantedNotSupportedRequired(self):
|
| - """
|
| - Test start when TLS is wanted and the SSL library available.
|
| - """
|
| - xmlstream.ssl = None
|
| - self.init.required = True
|
| -
|
| - d = self.init.start()
|
| - self.assertFailure(d, xmlstream.TLSNotSupported)
|
| - self.assertEquals([], self.output)
|
| -
|
| - return d
|
| -
|
| -
|
| - def testNotWantedRequired(self):
|
| - """
|
| - Test start when TLS is not wanted, but required by the server.
|
| - """
|
| - tls = domish.Element(('urn:ietf:params:xml:ns:xmpp-tls', 'starttls'))
|
| - tls.addElement('required')
|
| - self.xmlstream.features = {(tls.uri, tls.name): tls}
|
| - self.init.wanted = False
|
| -
|
| - d = self.init.start()
|
| - self.assertEquals([], self.output)
|
| - self.assertFailure(d, xmlstream.TLSRequired)
|
| -
|
| - return d
|
| -
|
| -
|
| - def testNotWantedNotRequired(self):
|
| - """
|
| - Test start when TLS is not wanted, but required by the server.
|
| - """
|
| - tls = domish.Element(('urn:ietf:params:xml:ns:xmpp-tls', 'starttls'))
|
| - self.xmlstream.features = {(tls.uri, tls.name): tls}
|
| - self.init.wanted = False
|
| -
|
| - d = self.init.start()
|
| - d.addCallback(self.assertEqual, None)
|
| - self.assertEquals([], self.output)
|
| - return d
|
| -
|
| -
|
| - def testFailed(self):
|
| - """
|
| - Test failed TLS negotiation.
|
| - """
|
| - # Pretend that ssl is supported, it isn't actually used when the
|
| - # server starts out with a failure in response to our initial
|
| - # C{starttls} stanza.
|
| - xmlstream.ssl = 1
|
| -
|
| - d = self.init.start()
|
| - self.assertFailure(d, xmlstream.TLSFailed)
|
| - self.xmlstream.dataReceived("<failure xmlns='%s'/>" % NS_XMPP_TLS)
|
| - return d
|
| -
|
| -
|
| -
|
| -class TestFeatureInitializer(xmlstream.BaseFeatureInitiatingInitializer):
|
| - feature = ('testns', 'test')
|
| -
|
| - def start(self):
|
| - return defer.succeed(None)
|
| -
|
| -
|
| -
|
| -class BaseFeatureInitiatingInitializerTest(unittest.TestCase):
|
| -
|
| - def setUp(self):
|
| - self.xmlstream = xmlstream.XmlStream(xmlstream.Authenticator())
|
| - self.init = TestFeatureInitializer(self.xmlstream)
|
| -
|
| -
|
| - def testAdvertized(self):
|
| - """
|
| - Test that an advertized feature results in successful initialization.
|
| - """
|
| - self.xmlstream.features = {self.init.feature:
|
| - domish.Element(self.init.feature)}
|
| - return self.init.initialize()
|
| -
|
| -
|
| - def testNotAdvertizedRequired(self):
|
| - """
|
| - Test that when the feature is not advertized, but required by the
|
| - initializer, an exception is raised.
|
| - """
|
| - self.init.required = True
|
| - self.assertRaises(xmlstream.FeatureNotAdvertized, self.init.initialize)
|
| -
|
| -
|
| - def testNotAdvertizedNotRequired(self):
|
| - """
|
| - Test that when the feature is not advertized, and not required by the
|
| - initializer, the initializer silently succeeds.
|
| - """
|
| - self.init.required = False
|
| - self.assertIdentical(None, self.init.initialize())
|
| -
|
| -
|
| -
|
| -class ToResponseTest(unittest.TestCase):
|
| -
|
| - def test_toResponse(self):
|
| - """
|
| - Test that a response stanza is generated with addressing swapped.
|
| - """
|
| - stanza = domish.Element(('jabber:client', 'iq'))
|
| - stanza['type'] = 'get'
|
| - stanza['to'] = 'user1@example.com'
|
| - stanza['from'] = 'user2@example.com/resource'
|
| - stanza['id'] = 'stanza1'
|
| - response = xmlstream.toResponse(stanza, 'result')
|
| - self.assertNotIdentical(stanza, response)
|
| - self.assertEqual(response['from'], 'user1@example.com')
|
| - self.assertEqual(response['to'], 'user2@example.com/resource')
|
| - self.assertEqual(response['type'], 'result')
|
| - self.assertEqual(response['id'], 'stanza1')
|
| -
|
| -
|
| - def test_toResponseNoFrom(self):
|
| - """
|
| - Test that a response is generated from a stanza without a from address.
|
| - """
|
| - stanza = domish.Element(('jabber:client', 'iq'))
|
| - stanza['type'] = 'get'
|
| - stanza['to'] = 'user1@example.com'
|
| - response = xmlstream.toResponse(stanza)
|
| - self.assertEqual(response['from'], 'user1@example.com')
|
| - self.failIf(response.hasAttribute('to'))
|
| -
|
| -
|
| - def test_toResponseNoTo(self):
|
| - """
|
| - Test that a response is generated from a stanza without a to address.
|
| - """
|
| - stanza = domish.Element(('jabber:client', 'iq'))
|
| - stanza['type'] = 'get'
|
| - stanza['from'] = 'user2@example.com/resource'
|
| - response = xmlstream.toResponse(stanza)
|
| - self.failIf(response.hasAttribute('from'))
|
| - self.assertEqual(response['to'], 'user2@example.com/resource')
|
| -
|
| -
|
| - def test_toResponseNoAddressing(self):
|
| - """
|
| - Test that a response is generated from a stanza without any addressing.
|
| - """
|
| - stanza = domish.Element(('jabber:client', 'message'))
|
| - stanza['type'] = 'chat'
|
| - response = xmlstream.toResponse(stanza)
|
| - self.failIf(response.hasAttribute('to'))
|
| - self.failIf(response.hasAttribute('from'))
|
| -
|
| -
|
| - def test_noID(self):
|
| - """
|
| - Test that a proper response is generated without id attribute.
|
| - """
|
| - stanza = domish.Element(('jabber:client', 'message'))
|
| - response = xmlstream.toResponse(stanza)
|
| - self.failIf(response.hasAttribute('id'))
|
| -
|
| -
|
| -
|
| -class DummyFactory(object):
|
| - """
|
| - Dummy XmlStream factory that only registers bootstrap observers.
|
| - """
|
| - def __init__(self):
|
| - self.callbacks = {}
|
| -
|
| -
|
| - def addBootstrap(self, event, callback):
|
| - self.callbacks[event] = callback
|
| -
|
| -
|
| -
|
| -class DummyXMPPHandler(xmlstream.XMPPHandler):
|
| - """
|
| - Dummy XMPP subprotocol handler to count the methods are called on it.
|
| - """
|
| - def __init__(self):
|
| - self.doneMade = 0
|
| - self.doneInitialized = 0
|
| - self.doneLost = 0
|
| -
|
| -
|
| - def makeConnection(self, xs):
|
| - self.connectionMade()
|
| -
|
| -
|
| - def connectionMade(self):
|
| - self.doneMade += 1
|
| -
|
| -
|
| - def connectionInitialized(self):
|
| - self.doneInitialized += 1
|
| -
|
| -
|
| - def connectionLost(self, reason):
|
| - self.doneLost += 1
|
| -
|
| -
|
| -
|
| -class XMPPHandlerTest(unittest.TestCase):
|
| - """
|
| - Tests for L{xmlstream.XMPPHandler}.
|
| - """
|
| -
|
| - def test_interface(self):
|
| - """
|
| - L{xmlstream.XMPPHandler} implements L{ijabber.IXMPPHandler}.
|
| - """
|
| - verifyObject(ijabber.IXMPPHandler, xmlstream.XMPPHandler())
|
| -
|
| -
|
| - def test_send(self):
|
| - """
|
| - Test that data is passed on for sending by the stream manager.
|
| - """
|
| - class DummyStreamManager(object):
|
| - def __init__(self):
|
| - self.outlist = []
|
| -
|
| - def send(self, data):
|
| - self.outlist.append(data)
|
| -
|
| - handler = xmlstream.XMPPHandler()
|
| - handler.parent = DummyStreamManager()
|
| - handler.send('<presence/>')
|
| - self.assertEquals(['<presence/>'], handler.parent.outlist)
|
| -
|
| -
|
| - def test_makeConnection(self):
|
| - """
|
| - Test that makeConnection saves the XML stream and calls connectionMade.
|
| - """
|
| - class TestXMPPHandler(xmlstream.XMPPHandler):
|
| - def connectionMade(self):
|
| - self.doneMade = True
|
| -
|
| - handler = TestXMPPHandler()
|
| - xs = xmlstream.XmlStream(xmlstream.Authenticator())
|
| - handler.makeConnection(xs)
|
| - self.assertTrue(handler.doneMade)
|
| - self.assertIdentical(xs, handler.xmlstream)
|
| -
|
| -
|
| - def test_connectionLost(self):
|
| - """
|
| - Test that connectionLost forgets the XML stream.
|
| - """
|
| - handler = xmlstream.XMPPHandler()
|
| - xs = xmlstream.XmlStream(xmlstream.Authenticator())
|
| - handler.makeConnection(xs)
|
| - handler.connectionLost(Exception())
|
| - self.assertIdentical(None, handler.xmlstream)
|
| -
|
| -
|
| -
|
| -class XMPPHandlerCollectionTest(unittest.TestCase):
|
| - """
|
| - Tests for L{xmlstream.XMPPHandlerCollection}.
|
| - """
|
| -
|
| - def setUp(self):
|
| - self.collection = xmlstream.XMPPHandlerCollection()
|
| -
|
| -
|
| - def test_interface(self):
|
| - """
|
| - L{xmlstream.StreamManager} implements L{ijabber.IXMPPHandlerCollection}.
|
| - """
|
| - verifyObject(ijabber.IXMPPHandlerCollection, self.collection)
|
| -
|
| -
|
| - def test_addHandler(self):
|
| - """
|
| - Test the addition of a protocol handler.
|
| - """
|
| - handler = DummyXMPPHandler()
|
| - handler.setHandlerParent(self.collection)
|
| - self.assertIn(handler, self.collection)
|
| - self.assertIdentical(self.collection, handler.parent)
|
| -
|
| -
|
| - def test_removeHandler(self):
|
| - """
|
| - Test removal of a protocol handler.
|
| - """
|
| - handler = DummyXMPPHandler()
|
| - handler.setHandlerParent(self.collection)
|
| - handler.disownHandlerParent(self.collection)
|
| - self.assertNotIn(handler, self.collection)
|
| - self.assertIdentical(None, handler.parent)
|
| -
|
| -
|
| -
|
| -class StreamManagerTest(unittest.TestCase):
|
| - """
|
| - Tests for L{xmlstream.StreamManager}.
|
| - """
|
| -
|
| - def setUp(self):
|
| - factory = DummyFactory()
|
| - self.streamManager = xmlstream.StreamManager(factory)
|
| -
|
| -
|
| - def test_basic(self):
|
| - """
|
| - Test correct initialization and setup of factory observers.
|
| - """
|
| - sm = self.streamManager
|
| - self.assertIdentical(None, sm.xmlstream)
|
| - self.assertEquals([], sm.handlers)
|
| - self.assertEquals(sm._connected,
|
| - sm.factory.callbacks['//event/stream/connected'])
|
| - self.assertEquals(sm._authd,
|
| - sm.factory.callbacks['//event/stream/authd'])
|
| - self.assertEquals(sm._disconnected,
|
| - sm.factory.callbacks['//event/stream/end'])
|
| - self.assertEquals(sm.initializationFailed,
|
| - sm.factory.callbacks['//event/xmpp/initfailed'])
|
| -
|
| -
|
| - def test_connected(self):
|
| - """
|
| - Test that protocol handlers have their connectionMade method called
|
| - when the XML stream is connected.
|
| - """
|
| - sm = self.streamManager
|
| - handler = DummyXMPPHandler()
|
| - handler.setHandlerParent(sm)
|
| - xs = xmlstream.XmlStream(xmlstream.Authenticator())
|
| - sm._connected(xs)
|
| - self.assertEquals(1, handler.doneMade)
|
| - self.assertEquals(0, handler.doneInitialized)
|
| - self.assertEquals(0, handler.doneLost)
|
| -
|
| -
|
| - def test_connectedLogTrafficFalse(self):
|
| - """
|
| - Test raw data functions unset when logTraffic is set to False.
|
| - """
|
| - sm = self.streamManager
|
| - handler = DummyXMPPHandler()
|
| - handler.setHandlerParent(sm)
|
| - xs = xmlstream.XmlStream(xmlstream.Authenticator())
|
| - sm._connected(xs)
|
| - self.assertIdentical(None, xs.rawDataInFn)
|
| - self.assertIdentical(None, xs.rawDataOutFn)
|
| -
|
| -
|
| - def test_connectedLogTrafficTrue(self):
|
| - """
|
| - Test raw data functions set when logTraffic is set to True.
|
| - """
|
| - sm = self.streamManager
|
| - sm.logTraffic = True
|
| - handler = DummyXMPPHandler()
|
| - handler.setHandlerParent(sm)
|
| - xs = xmlstream.XmlStream(xmlstream.Authenticator())
|
| - sm._connected(xs)
|
| - self.assertNotIdentical(None, xs.rawDataInFn)
|
| - self.assertNotIdentical(None, xs.rawDataOutFn)
|
| -
|
| -
|
| - def test_authd(self):
|
| - """
|
| - Test that protocol handlers have their connectionInitialized method
|
| - called when the XML stream is initialized.
|
| - """
|
| - sm = self.streamManager
|
| - handler = DummyXMPPHandler()
|
| - handler.setHandlerParent(sm)
|
| - xs = xmlstream.XmlStream(xmlstream.Authenticator())
|
| - sm._authd(xs)
|
| - self.assertEquals(0, handler.doneMade)
|
| - self.assertEquals(1, handler.doneInitialized)
|
| - self.assertEquals(0, handler.doneLost)
|
| -
|
| -
|
| - def test_disconnected(self):
|
| - """
|
| - Test that protocol handlers have their connectionLost method
|
| - called when the XML stream is disconnected.
|
| - """
|
| - sm = self.streamManager
|
| - handler = DummyXMPPHandler()
|
| - handler.setHandlerParent(sm)
|
| - xs = xmlstream.XmlStream(xmlstream.Authenticator())
|
| - sm._disconnected(xs)
|
| - self.assertEquals(0, handler.doneMade)
|
| - self.assertEquals(0, handler.doneInitialized)
|
| - self.assertEquals(1, handler.doneLost)
|
| -
|
| -
|
| - def test_addHandler(self):
|
| - """
|
| - Test the addition of a protocol handler while not connected.
|
| - """
|
| - sm = self.streamManager
|
| - handler = DummyXMPPHandler()
|
| - handler.setHandlerParent(sm)
|
| -
|
| - self.assertEquals(0, handler.doneMade)
|
| - self.assertEquals(0, handler.doneInitialized)
|
| - self.assertEquals(0, handler.doneLost)
|
| -
|
| -
|
| - def test_addHandlerInitialized(self):
|
| - """
|
| - Test the addition of a protocol handler after the stream
|
| - have been initialized.
|
| -
|
| - Make sure that the handler will have the connected stream
|
| - passed via C{makeConnection} and have C{connectionInitialized}
|
| - called.
|
| - """
|
| - sm = self.streamManager
|
| - xs = xmlstream.XmlStream(xmlstream.Authenticator())
|
| - sm._connected(xs)
|
| - sm._authd(xs)
|
| - handler = DummyXMPPHandler()
|
| - handler.setHandlerParent(sm)
|
| -
|
| - self.assertEquals(1, handler.doneMade)
|
| - self.assertEquals(1, handler.doneInitialized)
|
| - self.assertEquals(0, handler.doneLost)
|
| -
|
| -
|
| - def test_sendInitialized(self):
|
| - """
|
| - Test send when the stream has been initialized.
|
| -
|
| - The data should be sent directly over the XML stream.
|
| - """
|
| - factory = xmlstream.XmlStreamFactory(xmlstream.Authenticator())
|
| - sm = xmlstream.StreamManager(factory)
|
| - xs = factory.buildProtocol(None)
|
| - xs.transport = proto_helpers.StringTransport()
|
| - xs.connectionMade()
|
| - xs.dataReceived("<stream:stream xmlns='jabber:client' "
|
| - "xmlns:stream='http://etherx.jabber.org/streams' "
|
| - "from='example.com' id='12345'>")
|
| - xs.dispatch(xs, "//event/stream/authd")
|
| - sm.send("<presence/>")
|
| - self.assertEquals("<presence/>", xs.transport.value())
|
| -
|
| -
|
| - def test_sendNotConnected(self):
|
| - """
|
| - Test send when there is no established XML stream.
|
| -
|
| - The data should be cached until an XML stream has been established and
|
| - initialized.
|
| - """
|
| - factory = xmlstream.XmlStreamFactory(xmlstream.Authenticator())
|
| - sm = xmlstream.StreamManager(factory)
|
| - handler = DummyXMPPHandler()
|
| - sm.addHandler(handler)
|
| -
|
| - xs = factory.buildProtocol(None)
|
| - xs.transport = proto_helpers.StringTransport()
|
| - sm.send("<presence/>")
|
| - self.assertEquals("", xs.transport.value())
|
| - self.assertEquals("<presence/>", sm._packetQueue[0])
|
| -
|
| - xs.connectionMade()
|
| - self.assertEquals("", xs.transport.value())
|
| - self.assertEquals("<presence/>", sm._packetQueue[0])
|
| -
|
| - xs.dataReceived("<stream:stream xmlns='jabber:client' "
|
| - "xmlns:stream='http://etherx.jabber.org/streams' "
|
| - "from='example.com' id='12345'>")
|
| - xs.dispatch(xs, "//event/stream/authd")
|
| -
|
| - self.assertEquals("<presence/>", xs.transport.value())
|
| - self.failIf(sm._packetQueue)
|
| -
|
| -
|
| - def test_sendNotInitialized(self):
|
| - """
|
| - Test send when the stream is connected but not yet initialized.
|
| -
|
| - The data should be cached until the XML stream has been initialized.
|
| - """
|
| - factory = xmlstream.XmlStreamFactory(xmlstream.Authenticator())
|
| - sm = xmlstream.StreamManager(factory)
|
| - xs = factory.buildProtocol(None)
|
| - xs.transport = proto_helpers.StringTransport()
|
| - xs.connectionMade()
|
| - xs.dataReceived("<stream:stream xmlns='jabber:client' "
|
| - "xmlns:stream='http://etherx.jabber.org/streams' "
|
| - "from='example.com' id='12345'>")
|
| - sm.send("<presence/>")
|
| - self.assertEquals("", xs.transport.value())
|
| - self.assertEquals("<presence/>", sm._packetQueue[0])
|
| -
|
| -
|
| - def test_sendDisconnected(self):
|
| - """
|
| - Test send after XML stream disconnection.
|
| -
|
| - The data should be cached until a new XML stream has been established
|
| - and initialized.
|
| - """
|
| - factory = xmlstream.XmlStreamFactory(xmlstream.Authenticator())
|
| - sm = xmlstream.StreamManager(factory)
|
| - handler = DummyXMPPHandler()
|
| - sm.addHandler(handler)
|
| -
|
| - xs = factory.buildProtocol(None)
|
| - xs.connectionMade()
|
| - xs.transport = proto_helpers.StringTransport()
|
| - xs.connectionLost(None)
|
| -
|
| - sm.send("<presence/>")
|
| - self.assertEquals("", xs.transport.value())
|
| - self.assertEquals("<presence/>", sm._packetQueue[0])
|
|
|