From b039a14a1f1600f8bc9adc8841238a036f33b9e4 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Mon, 9 Sep 2013 13:00:30 +0100 Subject: [PATCH] Add a regression test for #68829 Bug: https://bugs.freedesktop.org/show_bug.cgi?id=68829 --- tests/twisted/Makefile.am | 1 + tests/twisted/connect/disco-facebook.py | 51 +++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 tests/twisted/connect/disco-facebook.py diff --git a/tests/twisted/Makefile.am b/tests/twisted/Makefile.am index ef429bb..d93d5b3 100644 --- a/tests/twisted/Makefile.am +++ b/tests/twisted/Makefile.am @@ -21,6 +21,7 @@ TWISTED_TESTS = \ client-types.py \ cm/protocol.py \ connect/disco-error-from-bare-jid.py \ + connect/disco-facebook.py \ connect/disconnect-timeout.py \ connect/disco-no-reply.py \ connect/network-error.py \ diff --git a/tests/twisted/connect/disco-facebook.py b/tests/twisted/connect/disco-facebook.py new file mode 100644 index 0000000..39cd9e6 --- /dev/null +++ b/tests/twisted/connect/disco-facebook.py @@ -0,0 +1,51 @@ +""" +Test that Gabble is tolerant of non-RFC-compliance from Facebook. +https://bugs.freedesktop.org/show_bug.cgi?id=68829 +""" + +from gabbletest import exec_test, XmppXmlStream +import constants as cs +import ns + +from twisted.words.xish import xpath + +def test(q, bus, conn, stream): + conn.Connect() + + # everything is fine and actually very boring + q.expect('dbus-signal', signal='StatusChanged', + args=[cs.CONN_STATUS_CONNECTING, cs.CSR_REQUESTED]), + q.expect('dbus-signal', signal='StatusChanged', + args=[cs.CONN_STATUS_CONNECTED, cs.CSR_REQUESTED]) + +class XmppXmlStreamFacebook201309(XmppXmlStream): + """As of 2013-09, a new version of Facebook's XMPP server (used + consistently for beta.chat.facebook.com, and gradually being rolled out + for chat.facebook.com users) omits the 'from' attribute in its disco + reply. The disco reply is otherwise correct. + """ + + def _cb_disco_iq(self, iq): + nodes = xpath.queryForNodes( + "/iq/query[@xmlns='" + ns.DISCO_INFO + "']", iq) + query = nodes[0] + + for feature in self.disco_features: + query.addChild(elem('feature', var=feature)) + + iq['type'] = 'result' + + # The Facebook server's IQ responses have neither 'from' nor 'to' + try: + del iq['from'] + except KeyError: + pass + try: + del iq['to'] + except KeyError: + pass + + self.send(iq) + +if __name__ == '__main__': + exec_test(test, protocol=XmppXmlStreamFacebook201309, do_connect=False) -- 1.8.4.rc3