コード例 #1
0
ファイル: binding.py プロジェクト: AdamPrzybyla/pyxmpp2
 def test_bind_resource(self):
     handler = EventRecorder()
     handlers = [ResourceBindingHandler(), handler]
     processor = StanzaProcessor()
     self.start_transport(handlers)
     self.stream = StreamBase(u"jabber:client", processor, handlers)
     processor.uplink = self.stream
     self.stream.receive(self.transport, self.addr[0])
     self.stream.set_peer_authenticated(JID("[email protected]"))
     processor.setup_stanza_handlers(handlers, "post-auth")
     self.client.write(C2S_CLIENT_STREAM_HEAD)
     features = self.wait(
             expect = re.compile(br".*<stream:features>"
                 br"(.*<bind.*urn:ietf:params:xml:ns:xmpp-bind.*)"
                                                 br"</stream:features>"))
     self.assertIsNotNone(features)
     self.client.write(BIND_PROVIDED_REQUEST)
     resource = self.wait(
             expect = re.compile(br".*<iq.*id=(?:\"42\"|'42').*>"
                         br"<bind.*<jid>[email protected]/(.*)</jid>.*</bind>"))
     self.assertEqual(resource, b"Provided")
     self.client.write(STREAM_TAIL)
     self.client.disconnect()
     self.wait()
     event_classes = [e.__class__ for e in handler.events_received]
     self.assertEqual(event_classes, [AuthenticatedEvent,
                 StreamConnectedEvent, AuthorizedEvent, DisconnectedEvent])
コード例 #2
0
ファイル: binding.py プロジェクト: AdamPrzybyla/pyxmpp2
 def test_bind_no_resource(self):
     handler = AuthorizedEventHandler()
     handlers = [ResourceBindingHandler(), handler]
     processor = StanzaProcessor()
     processor.setup_stanza_handlers(handlers, "post-auth")
     self.stream = StreamBase(u"jabber:client", processor, handlers)
     processor.uplink = self.stream
     self.stream.me = JID("[email protected]")
     self.start_transport([handler])
     self.stream.initiate(self.transport)
     self.connect_transport()
     self.server.write(C2S_SERVER_STREAM_HEAD)
     self.wait_short(1)
     self.server.write(BIND_FEATURES)
     req_id = self.wait(1,
                 expect = re.compile(br".*<iq[^>]*id=[\"']([^\"']*)[\"']"))
     self.assertIsNotNone(req_id)
     req_id = req_id.decode("utf-8")
     self.server.write(BIND_GENERATED_RESPONSE.format(req_id)
                                                         .encode("utf-8"))
     self.wait()
     self.assertFalse(self.stream.is_connected())
     event_classes = [e.__class__ for e in handler.events_received]
     self.assertEqual(event_classes, [ConnectingEvent,
                 ConnectedEvent, StreamConnectedEvent, GotFeaturesEvent,
                 BindingResourceEvent, AuthorizedEvent, DisconnectedEvent])
コード例 #3
0
 def test_bind_resource(self):
     handler = EventRecorder()
     handlers = [ResourceBindingHandler(), handler]
     processor = StanzaProcessor()
     self.start_transport(handlers)
     self.stream = StreamBase(u"jabber:client", processor, handlers)
     processor.uplink = self.stream
     self.stream.receive(self.transport, self.addr[0])
     self.stream.set_peer_authenticated(JID("[email protected]"))
     processor.setup_stanza_handlers(handlers, "post-auth")
     self.client.write(C2S_CLIENT_STREAM_HEAD)
     features = self.wait(
         expect=re.compile(br".*<stream:features>"
                           br"(.*<bind.*urn:ietf:params:xml:ns:xmpp-bind.*)"
                           br"</stream:features>"))
     self.assertIsNotNone(features)
     self.client.write(BIND_PROVIDED_REQUEST)
     resource = self.wait(expect=re.compile(
         br".*<iq.*id=(?:\"42\"|'42').*>"
         br"<bind.*<jid>[email protected]/(.*)</jid>.*</bind>"))
     self.assertEqual(resource, b"Provided")
     self.client.write(STREAM_TAIL)
     self.client.disconnect()
     self.wait()
     event_classes = [e.__class__ for e in handler.events_received]
     self.assertEqual(event_classes, [
         AuthenticatedEvent, StreamConnectedEvent, AuthorizedEvent,
         DisconnectedEvent
     ])
コード例 #4
0
 def test_bind_no_resource(self):
     handler = AuthorizedEventHandler()
     handlers = [ResourceBindingHandler(), handler]
     processor = StanzaProcessor()
     processor.setup_stanza_handlers(handlers, "post-auth")
     self.stream = StreamBase(u"jabber:client", processor, handlers)
     processor.uplink = self.stream
     self.stream.me = JID("[email protected]")
     self.start_transport([handler])
     self.stream.initiate(self.transport)
     self.connect_transport()
     self.server.write(C2S_SERVER_STREAM_HEAD)
     self.wait_short(1)
     self.server.write(BIND_FEATURES)
     req_id = self.wait(
         1, expect=re.compile(br".*<iq[^>]*id=[\"']([^\"']*)[\"']"))
     self.assertIsNotNone(req_id)
     req_id = req_id.decode("utf-8")
     self.server.write(
         BIND_GENERATED_RESPONSE.format(req_id).encode("utf-8"))
     self.wait()
     self.assertFalse(self.stream.is_connected())
     event_classes = [e.__class__ for e in handler.events_received]
     self.assertEqual(event_classes, [
         ConnectingEvent, ConnectedEvent, StreamConnectedEvent,
         GotFeaturesEvent, BindingResourceEvent, AuthorizedEvent,
         DisconnectedEvent
     ])
コード例 #5
0
ファイル: stanzaprocessor.py プロジェクト: zeeying/pyxmpp2
 def setUp(self):
     self.handlers_called = []
     self.stanzas_sent = []
     self.proc = StanzaProcessor()
     self.proc.me = JID("[email protected]/xx")
     self.proc.peer = JID("[email protected]/yy")
     self.proc.send = self.send
     self.proc.initiator = True
コード例 #6
0
ファイル: client.py プロジェクト: binyuj/deepin-talk
 def __init__(self, jid, handlers, settings=None, main_loop=None):
     
     self._ml_handlers = []
     self._base_handlers = []
     self.jid = jid
     self.handlers = handlers
     self.settings = settings if settings else XMPPSettings()
     
     StanzaProcessor.__init__(self, self.settings[u"default_stanza_timeout"])
     self.roster_client = self.roster_client_factory()                
     self.main_loop = main_loop
     self.stream = None
コード例 #7
0
ファイル: client.py プロジェクト: disda/deepin-talk
    def __init__(self, jid, handlers, settings=None, main_loop=None):

        self._ml_handlers = []
        self._base_handlers = []
        self.jid = jid
        self.handlers = handlers
        self.settings = settings if settings else XMPPSettings()

        StanzaProcessor.__init__(self,
                                 self.settings[u"default_stanza_timeout"])
        self.roster_client = self.roster_client_factory()
        self.main_loop = main_loop
        self.stream = None
コード例 #8
0
ファイル: stanzaprocessor.py プロジェクト: DanyPlay/pyxmpp2
 def setUp(self):
     self.handlers_called = []
     self.stanzas_sent = []
     self.proc = StanzaProcessor()
     self.proc.me = JID("[email protected]/xx")
     self.proc.peer = JID("[email protected]/yy")
     self.proc.send = self.send
     self.proc.initiator = True
コード例 #9
0
ファイル: proxy.py プロジェクト: kgodlewski/xmpp-to-tlen
	def __init__(self, transport, avatars):
		StanzaProcessor.__init__(self)

		logger.debug('-- New connection')

		self.avatars = avatars

		self.settings = XMPPSettings()

		self.handlers = [self, ResourceBindingHandler(self.settings)]
		self.stream = StreamBase(u"jabber:client", self, self.handlers, self.settings)
		self.stream.set_authenticated(JID(domain='tlen.pl'))

		self.tlen = None
		self.transport = transport
		self.stream.receive(self.transport, 'tlen.pl')

		self.uplink = self.stream
		self.stream.set_authenticated(JID(domain='tlen.pl'))
コード例 #10
0
ファイル: roster.py プロジェクト: AdamPrzybyla/pyxmpp2
 def __init__(self, handlers):
     StanzaProcessor.__init__(self)
     self.setup_stanza_handlers(handlers, "post-auth")
     self.stanzas_sent = []
コード例 #11
0
ファイル: stanzaprocessor.py プロジェクト: zeeying/pyxmpp2
class TestStanzaProcessor(unittest.TestCase):
    # pylint: disable=R0904
    def setUp(self):
        self.handlers_called = []
        self.stanzas_sent = []
        self.proc = StanzaProcessor()
        self.proc.me = JID("[email protected]/xx")
        self.proc.peer = JID("[email protected]/yy")
        self.proc.send = self.send
        self.proc.initiator = True

    def send(self, stanza):
        self.stanzas_sent.append(stanza)

    def process_stanzas(self, xml_elements):
        for xml in xml_elements:
            stanza = stanza_factory(ElementTree.XML(xml))
            self.proc.process_stanza(stanza)

    def ignore_iq_get(self, stanza):
        self.handlers_called.append("ignore_iq_get")
        self.assertIsInstance(stanza, Iq)
        self.assertEqual(stanza.stanza_type, "get")
        return True

    def ignore_iq_set(self, stanza):
        self.handlers_called.append("ignore_iq_set")
        self.assertIsInstance(stanza, Iq)
        self.assertEqual(stanza.stanza_type, "set")
        return True

    def reply_iq_get(self, stanza):
        self.handlers_called.append("reply_iq_get")
        self.assertIsInstance(stanza, Iq)
        self.assertEqual(stanza.stanza_type, "get")
        reply = stanza.make_result_response()
        element = ElementTree.Element(
            "{http://pyxmpp.jajcus.net/xmlns/test}payload")
        ElementTree.SubElement(element,
                               "{http://pyxmpp.jajcus.net/xmlns/test}abc")
        reply.set_payload(element)
        return reply

    def reply_iq_set(self, stanza):
        self.handlers_called.append("reply_iq_set")
        self.assertIsInstance(stanza, Iq)
        self.assertEqual(stanza.stanza_type, "set")
        reply = stanza.make_result_response()
        return reply

    def echo_message(self, stanza):
        self.handlers_called.append("echo_message")
        self.assertIsInstance(stanza, Message)
        self.assertNotEqual(stanza.stanza_type, "error")
        message = Message(to_jid=stanza.from_jid,
                          from_jid=stanza.to_jid,
                          stanza_type=stanza.stanza_type,
                          thread=stanza.thread,
                          subject=stanza.subject,
                          body=stanza.body)
        return message

    def eat1(self, stanza):
        # pylint: disable=W0613
        self.handlers_called.append("eat1")
        return True

    def eat2(self, stanza):
        # pylint: disable=W0613
        self.handlers_called.append("eat2")
        return True

    def pass1(self, stanza):
        # pylint: disable=W0613
        self.handlers_called.append("pass1")

    def pass2(self, stanza):
        # pylint: disable=W0613
        self.handlers_called.append("pass2")

    def test_iq_ignore_handlers(self):
        parent = self

        class Handlers(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @iq_get_stanza_handler(
                XMLPayload, "{http://pyxmpp.jajcus.net/xmlns/test}payload")
            def handler1(self, stanza):
                return parent.ignore_iq_get(stanza)

            @iq_set_stanza_handler(
                XMLPayload, "{http://pyxmpp.jajcus.net/xmlns/test}payload")
            def handler2(self, stanza):
                return parent.ignore_iq_set(stanza)

        self.proc.setup_stanza_handlers([Handlers()], "post-auth")
        self.process_stanzas(ALL_STANZAS)
        self.assertEqual(self.handlers_called,
                         ["ignore_iq_get", "ignore_iq_set"])
        self.assertFalse(self.stanzas_sent)

    def test_iq_reply_handlers(self):
        parent = self

        class Handlers(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @iq_get_stanza_handler(
                XMLPayload, "{http://pyxmpp.jajcus.net/xmlns/test}payload")
            def handler1(self, stanza):
                return parent.reply_iq_get(stanza)

            @iq_set_stanza_handler(
                XMLPayload, "{http://pyxmpp.jajcus.net/xmlns/test}payload")
            def handler2(self, stanza):
                return parent.reply_iq_set(stanza)

        self.proc.setup_stanza_handlers([Handlers()], "post-auth")
        self.process_stanzas(ALL_STANZAS)
        self.assertEqual(self.handlers_called,
                         ["reply_iq_get", "reply_iq_set"])
        self.assertEqual(len(self.stanzas_sent), 2)
        stanza1 = self.stanzas_sent[0]
        self.assertTrue(
            xml_elements_equal(stanza1.as_xml(), ElementTree.XML(IQ2), True))
        stanza2 = self.stanzas_sent[1]
        self.assertTrue(
            xml_elements_equal(stanza2.as_xml(), ElementTree.XML(IQ4), True))

    def test_no_handlers(self):
        self.process_stanzas(ALL_STANZAS)
        self.assertEqual(self.handlers_called, [])
        self.assertFalse(self.handlers_called)
        self.assertEqual(len(self.stanzas_sent), 2)
        stanza1 = self.stanzas_sent[0]
        self.assertIsInstance(stanza1, Iq)
        self.assertEqual(stanza1.stanza_type, u"error")
        self.assertEqual(stanza1.error.condition_name, u"service-unavailable")
        self.assertEqual(stanza1.stanza_id, u"1")
        self.assertEqual(stanza1.to_jid, JID(u"[email protected]/res"))
        stanza2 = self.stanzas_sent[1]
        self.assertIsInstance(stanza2, Iq)
        self.assertEqual(stanza2.stanza_type, u"error")
        self.assertEqual(stanza2.error.condition_name, u"service-unavailable")
        self.assertEqual(stanza2.stanza_id, u"2")
        self.assertEqual(stanza2.to_jid, JID(u"[email protected]/res"))

    def test_message_handler(self):
        parent = self

        class Handlers(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @message_stanza_handler()
            def handler1(self, stanza):
                return parent.echo_message(stanza)

        self.proc.setup_stanza_handlers([Handlers()], "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(self.handlers_called,
                         ["echo_message", "echo_message", "echo_message"])
        self.assertEqual(len(self.stanzas_sent), 3)
        stanza1 = self.stanzas_sent[0]
        self.assertIsInstance(stanza1, Message)
        self.assertEqual(stanza1.stanza_type, u"normal")
        stanza2 = self.stanzas_sent[1]
        self.assertIsInstance(stanza2, Message)
        self.assertEqual(stanza2.stanza_type, None)
        stanza2 = self.stanzas_sent[2]
        self.assertIsInstance(stanza2, Message)
        self.assertEqual(stanza2.stanza_type, u"chat")

    def test_message_pass1_pass2(self):
        parent = self

        class Handlers1(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @message_stanza_handler()
            def handler1(self, stanza):
                return parent.pass1(stanza)

        class Handlers2(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @message_stanza_handler()
            def handler1(self, stanza):
                return parent.pass2(stanza)

        self.proc.setup_stanza_handlers([Handlers1(), Handlers2()],
                                        "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(
            self.handlers_called,
            ["pass1", "pass2", "pass1", "pass2", "pass1", "pass2"])
        self.assertEqual(len(self.stanzas_sent), 0)

    def test_message_pass2_pass1(self):
        parent = self

        class Handlers1(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @message_stanza_handler()
            def handler1(self, stanza):
                return parent.pass1(stanza)

        class Handlers2(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @message_stanza_handler()
            def handler1(self, stanza):
                return parent.pass2(stanza)

        self.proc.setup_stanza_handlers([Handlers2(), Handlers1()],
                                        "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(
            self.handlers_called,
            ["pass2", "pass1", "pass2", "pass1", "pass2", "pass1"])
        self.assertEqual(len(self.stanzas_sent), 0)

    def test_message_eat1_eat2(self):
        parent = self

        class Handlers1(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @message_stanza_handler()
            def handler1(self, stanza):
                return parent.eat1(stanza)

        class Handlers2(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @message_stanza_handler()
            def handler1(self, stanza):
                return parent.eat2(stanza)

        self.proc.setup_stanza_handlers([Handlers1(), Handlers2()],
                                        "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(self.handlers_called, ["eat1", "eat1", "eat1"])
        self.assertEqual(len(self.stanzas_sent), 0)

    def test_message_pass1_eat2(self):
        parent = self

        class Handlers1(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @message_stanza_handler()
            def handler1(self, stanza):
                return parent.pass1(stanza)

        class Handlers2(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @message_stanza_handler()
            def handler1(self, stanza):
                return parent.eat2(stanza)

        self.proc.setup_stanza_handlers([Handlers1(), Handlers2()],
                                        "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(self.handlers_called,
                         ["pass1", "eat2", "pass1", "eat2", "pass1", "eat2"])
        self.assertEqual(len(self.stanzas_sent), 0)

    def test_message_chat_handler(self):
        parent = self

        class Handlers(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @message_stanza_handler("chat")
            def handler1(self, stanza):
                return parent.pass1(stanza)

        self.proc.setup_stanza_handlers([Handlers()], "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(self.handlers_called, ["pass1"])
        self.assertEqual(len(self.stanzas_sent), 0)

    def test_presence_pass1_pass2(self):
        parent = self

        class Handlers1(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @presence_stanza_handler()
            def handler1(self, stanza):
                return parent.pass1(stanza)

        class Handlers2(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @presence_stanza_handler()
            def handler1(self, stanza):
                return parent.pass2(stanza)

        self.proc.setup_stanza_handlers([Handlers1(), Handlers2()],
                                        "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(self.handlers_called,
                         ["pass1", "pass2", "pass1", "pass2"])
        self.assertEqual(len(self.stanzas_sent), 0)

    def test_presence_pass2_pass1(self):
        parent = self

        class Handlers1(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @presence_stanza_handler()
            def handler1(self, stanza):
                return parent.pass1(stanza)

        class Handlers2(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @presence_stanza_handler()
            def handler1(self, stanza):
                return parent.pass2(stanza)

        self.proc.setup_stanza_handlers([Handlers2(), Handlers1()],
                                        "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(self.handlers_called,
                         ["pass2", "pass1", "pass2", "pass1"])
        self.assertEqual(len(self.stanzas_sent), 0)

    def test_presence_eat1_eat2(self):
        parent = self

        class Handlers1(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @presence_stanza_handler()
            def handler1(self, stanza):
                return parent.eat1(stanza)

        class Handlers2(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @presence_stanza_handler()
            def handler1(self, stanza):
                return parent.eat2(stanza)

        self.proc.setup_stanza_handlers([Handlers1(), Handlers2()],
                                        "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(self.handlers_called, ["eat1", "eat1"])
        self.assertEqual(len(self.stanzas_sent), 0)

    def test_presence_pass1_eat2(self):
        parent = self

        class Handlers1(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @presence_stanza_handler()
            def handler1(self, stanza):
                return parent.pass1(stanza)

        class Handlers2(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @presence_stanza_handler()
            def handler1(self, stanza):
                return parent.eat2(stanza)

        self.proc.setup_stanza_handlers([Handlers1(), Handlers2()],
                                        "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(self.handlers_called,
                         ["pass1", "eat2", "pass1", "eat2"])
        self.assertEqual(len(self.stanzas_sent), 0)

    def test_presence_subscribe_handler(self):
        parent = self

        class Handlers(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @presence_stanza_handler("subscribe")
            def handler1(self, stanza):
                return parent.pass1(stanza)

        self.proc.setup_stanza_handlers([Handlers()], "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(self.handlers_called, ["pass1"])
        self.assertEqual(len(self.stanzas_sent), 0)
コード例 #12
0
ファイル: ext_version.py プロジェクト: zeeying/pyxmpp2
 def __init__(self, handlers):
     StanzaProcessor.__init__(self)
     self.setup_stanza_handlers(handlers, "post-auth")
     self.stanzas_sent = []
コード例 #13
0
ファイル: stanzaprocessor.py プロジェクト: DanyPlay/pyxmpp2
class TestStanzaProcessor(unittest.TestCase):
    # pylint: disable=R0904
    def setUp(self):
        self.handlers_called = []
        self.stanzas_sent = []
        self.proc = StanzaProcessor()
        self.proc.me = JID("[email protected]/xx")
        self.proc.peer = JID("[email protected]/yy")
        self.proc.send = self.send
        self.proc.initiator = True

    def send(self, stanza):
        self.stanzas_sent.append(stanza)

    def process_stanzas(self, xml_elements):
        for xml in xml_elements:
            stanza = stanza_factory(ElementTree.XML(xml))
            self.proc.process_stanza(stanza)

    def ignore_iq_get(self, stanza):
        self.handlers_called.append("ignore_iq_get")
        self.assertIsInstance(stanza, Iq)
        self.assertEqual(stanza.stanza_type, "get")
        return True

    def ignore_iq_set(self, stanza):
        self.handlers_called.append("ignore_iq_set")
        self.assertIsInstance(stanza, Iq)
        self.assertEqual(stanza.stanza_type, "set")
        return True

    def reply_iq_get(self, stanza):
        self.handlers_called.append("reply_iq_get")
        self.assertIsInstance(stanza, Iq)
        self.assertEqual(stanza.stanza_type, "get")
        reply = stanza.make_result_response()
        element = ElementTree.Element(
                                "{http://pyxmpp.jajcus.net/xmlns/test}payload")
        ElementTree.SubElement(element,
                                    "{http://pyxmpp.jajcus.net/xmlns/test}abc")
        reply.set_payload(element)
        return reply

    def reply_iq_set(self, stanza):
        self.handlers_called.append("reply_iq_set")
        self.assertIsInstance(stanza, Iq)
        self.assertEqual(stanza.stanza_type, "set")
        reply = stanza.make_result_response()
        return reply

    def echo_message(self, stanza):
        self.handlers_called.append("echo_message")
        self.assertIsInstance(stanza, Message)
        self.assertNotEqual(stanza.stanza_type, "error")
        message = Message(to_jid = stanza.from_jid,
                    from_jid = stanza.to_jid,
                    stanza_type = stanza.stanza_type,
                    thread = stanza.thread,
                    subject = stanza.subject,
                    body = stanza.body)
        return message

    def eat1(self, stanza):
        # pylint: disable=W0613
        self.handlers_called.append("eat1")
        return True
    def eat2(self, stanza):
        # pylint: disable=W0613
        self.handlers_called.append("eat2")
        return True
    def pass1(self, stanza):
        # pylint: disable=W0613
        self.handlers_called.append("pass1")
    def pass2(self, stanza):
        # pylint: disable=W0613
        self.handlers_called.append("pass2")

    def test_iq_ignore_handlers(self):
        parent = self
        class Handlers(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @iq_get_stanza_handler(XMLPayload,
                                "{http://pyxmpp.jajcus.net/xmlns/test}payload")
            def handler1(self, stanza):
                return parent.ignore_iq_get(stanza)
            @iq_set_stanza_handler(XMLPayload,
                                "{http://pyxmpp.jajcus.net/xmlns/test}payload")
            def handler2(self, stanza):
                return parent.ignore_iq_set(stanza)
        self.proc.setup_stanza_handlers([Handlers()], "post-auth")
        self.process_stanzas(ALL_STANZAS)
        self.assertEqual(self.handlers_called, ["ignore_iq_get",
                                                    "ignore_iq_set"])
        self.assertFalse(self.stanzas_sent)

    def test_iq_reply_handlers(self):
        parent = self
        class Handlers(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @iq_get_stanza_handler(XMLPayload,
                                "{http://pyxmpp.jajcus.net/xmlns/test}payload")
            def handler1(self, stanza):
                return parent.reply_iq_get(stanza)
            @iq_set_stanza_handler(XMLPayload,
                                "{http://pyxmpp.jajcus.net/xmlns/test}payload")
            def handler2(self, stanza):
                return parent.reply_iq_set(stanza)
        self.proc.setup_stanza_handlers([Handlers()], "post-auth")
        self.process_stanzas(ALL_STANZAS)
        self.assertEqual(self.handlers_called, ["reply_iq_get",
                                                    "reply_iq_set"])
        self.assertEqual(len(self.stanzas_sent), 2)
        stanza1 = self.stanzas_sent[0]
        self.assertTrue(xml_elements_equal(stanza1.as_xml(),
                                                    ElementTree.XML(IQ2), True))
        stanza2 = self.stanzas_sent[1]
        self.assertTrue(xml_elements_equal(stanza2.as_xml(),
                                                    ElementTree.XML(IQ4), True))

    def test_no_handlers(self):
        self.process_stanzas(ALL_STANZAS)
        self.assertEqual(self.handlers_called, [])
        self.assertFalse(self.handlers_called)
        self.assertEqual(len(self.stanzas_sent), 2)
        stanza1 = self.stanzas_sent[0]
        self.assertIsInstance(stanza1, Iq)
        self.assertEqual(stanza1.stanza_type, u"error")
        self.assertEqual(stanza1.error.condition_name, u"service-unavailable")
        self.assertEqual(stanza1.stanza_id, u"1")
        self.assertEqual(stanza1.to_jid, JID(u"[email protected]/res"))
        stanza2 = self.stanzas_sent[1]
        self.assertIsInstance(stanza2, Iq)
        self.assertEqual(stanza2.stanza_type, u"error")
        self.assertEqual(stanza2.error.condition_name, u"service-unavailable")
        self.assertEqual(stanza2.stanza_id, u"2")
        self.assertEqual(stanza2.to_jid, JID(u"[email protected]/res"))

    def test_message_handler(self):
        parent = self
        class Handlers(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @message_stanza_handler()
            def handler1(self, stanza):
                return parent.echo_message(stanza)
        self.proc.setup_stanza_handlers([Handlers()], "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(self.handlers_called, ["echo_message", "echo_message",
                                                        "echo_message"])
        self.assertEqual(len(self.stanzas_sent), 3)
        stanza1 = self.stanzas_sent[0]
        self.assertIsInstance(stanza1, Message)
        self.assertEqual(stanza1.stanza_type, u"normal")
        stanza2 = self.stanzas_sent[1]
        self.assertIsInstance(stanza2, Message)
        self.assertEqual(stanza2.stanza_type, None)
        stanza2 = self.stanzas_sent[2]
        self.assertIsInstance(stanza2, Message)
        self.assertEqual(stanza2.stanza_type, u"chat")

    def test_message_pass1_pass2(self):
        parent = self
        class Handlers1(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @message_stanza_handler()
            def handler1(self, stanza):
                return parent.pass1(stanza)
        class Handlers2(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @message_stanza_handler()
            def handler1(self, stanza):
                return parent.pass2(stanza)
        self.proc.setup_stanza_handlers([Handlers1(), Handlers2()], "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(self.handlers_called, ["pass1", "pass2",
                                        "pass1", "pass2", "pass1", "pass2"])
        self.assertEqual(len(self.stanzas_sent), 0)

    def test_message_pass2_pass1(self):
        parent = self
        class Handlers1(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @message_stanza_handler()
            def handler1(self, stanza):
                return parent.pass1(stanza)
        class Handlers2(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @message_stanza_handler()
            def handler1(self, stanza):
                return parent.pass2(stanza)
        self.proc.setup_stanza_handlers([Handlers2(), Handlers1()], "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(self.handlers_called, ["pass2", "pass1",
                                        "pass2", "pass1", "pass2", "pass1"])
        self.assertEqual(len(self.stanzas_sent), 0)


    def test_message_eat1_eat2(self):
        parent = self
        class Handlers1(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @message_stanza_handler()
            def handler1(self, stanza):
                return parent.eat1(stanza)
        class Handlers2(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @message_stanza_handler()
            def handler1(self, stanza):
                return parent.eat2(stanza)
        self.proc.setup_stanza_handlers([Handlers1(), Handlers2()], "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(self.handlers_called, ["eat1", "eat1", "eat1"])
        self.assertEqual(len(self.stanzas_sent), 0)

    def test_message_pass1_eat2(self):
        parent = self
        class Handlers1(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @message_stanza_handler()
            def handler1(self, stanza):
                return parent.pass1(stanza)
        class Handlers2(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @message_stanza_handler()
            def handler1(self, stanza):
                return parent.eat2(stanza)
        self.proc.setup_stanza_handlers([Handlers1(), Handlers2()], "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(self.handlers_called, ["pass1", "eat2",
                                        "pass1", "eat2", "pass1", "eat2"])
        self.assertEqual(len(self.stanzas_sent), 0)

    def test_message_chat_handler(self):
        parent = self
        class Handlers(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @message_stanza_handler("chat")
            def handler1(self, stanza):
                return parent.pass1(stanza)
        self.proc.setup_stanza_handlers([Handlers()], "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(self.handlers_called, ["pass1"])
        self.assertEqual(len(self.stanzas_sent), 0)

    def test_presence_pass1_pass2(self):
        parent = self
        class Handlers1(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @presence_stanza_handler()
            def handler1(self, stanza):
                return parent.pass1(stanza)
        class Handlers2(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @presence_stanza_handler()
            def handler1(self, stanza):
                return parent.pass2(stanza)
        self.proc.setup_stanza_handlers([Handlers1(), Handlers2()], "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(self.handlers_called, ["pass1", "pass2",
                                                        "pass1", "pass2"])
        self.assertEqual(len(self.stanzas_sent), 0)

    def test_presence_pass2_pass1(self):
        parent = self
        class Handlers1(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @presence_stanza_handler()
            def handler1(self, stanza):
                return parent.pass1(stanza)
        class Handlers2(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @presence_stanza_handler()
            def handler1(self, stanza):
                return parent.pass2(stanza)
        self.proc.setup_stanza_handlers([Handlers2(), Handlers1()], "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(self.handlers_called, ["pass2", "pass1",
                                                        "pass2", "pass1"])
        self.assertEqual(len(self.stanzas_sent), 0)


    def test_presence_eat1_eat2(self):
        parent = self
        class Handlers1(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @presence_stanza_handler()
            def handler1(self, stanza):
                return parent.eat1(stanza)
        class Handlers2(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @presence_stanza_handler()
            def handler1(self, stanza):
                return parent.eat2(stanza)
        self.proc.setup_stanza_handlers([Handlers1(), Handlers2()], "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(self.handlers_called, ["eat1", "eat1"])
        self.assertEqual(len(self.stanzas_sent), 0)

    def test_presence_pass1_eat2(self):
        parent = self
        class Handlers1(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @presence_stanza_handler()
            def handler1(self, stanza):
                return parent.pass1(stanza)
        class Handlers2(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @presence_stanza_handler()
            def handler1(self, stanza):
                return parent.eat2(stanza)
        self.proc.setup_stanza_handlers([Handlers1(), Handlers2()], "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(self.handlers_called, ["pass1", "eat2",
                                                    "pass1", "eat2"])
        self.assertEqual(len(self.stanzas_sent), 0)

    def test_presence_subscribe_handler(self):
        parent = self
        class Handlers(XMPPFeatureHandler):
            # pylint: disable=W0232,R0201,R0903
            @presence_stanza_handler("subscribe")
            def handler1(self, stanza):
                return parent.pass1(stanza)
        self.proc.setup_stanza_handlers([Handlers()], "post-auth")
        self.process_stanzas(NON_IQ_STANZAS)
        self.assertEqual(self.handlers_called, ["pass1"])
        self.assertEqual(len(self.stanzas_sent), 0)