aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2020-10-02 23:13:21 +0200
committerLNJ <lnj@kaidan.im>2020-10-10 22:33:41 +0200
commitf28225a6b3413b8e8decac40bfd0ee394e6dee01 (patch)
treed7d056032248ecf64a38fa0af6961a4f25022880
parent6dce271072303362c8914d096d85be4760129757 (diff)
downloadqxmpp-f28225a6b3413b8e8decac40bfd0ee394e6dee01.tar.gz
Add extra unit test for QXmppStream
-rw-r--r--src/base/QXmppStream.cpp7
-rw-r--r--src/base/QXmppStream.h4
-rw-r--r--tests/CMakeLists.txt1
-rw-r--r--tests/qxmppstream/cd0
-rw-r--r--tests/qxmppstream/tst_qxmppstream.cpp141
5 files changed, 152 insertions, 1 deletions
diff --git a/src/base/QXmppStream.cpp b/src/base/QXmppStream.cpp
index be4bf9b7..e90bd4a3 100644
--- a/src/base/QXmppStream.cpp
+++ b/src/base/QXmppStream.cpp
@@ -215,6 +215,11 @@ void QXmppStream::_q_socketError(QAbstractSocket::SocketError socketError)
void QXmppStream::_q_socketReadyRead()
{
+ processData(QString::fromUtf8(d->socket->readAll()));
+}
+
+void QXmppStream::processData(const QString &data)
+{
// As we may only have partial XML content, we need to cache the received
// data until it has been successfully parsed. In case it can't be parsed,
//
@@ -226,7 +231,7 @@ void QXmppStream::_q_socketReadyRead()
// However, both issues could only be solved using an XML stream reader
// which would cause many other problems since we don't actually use it for
// parsing the content.
- d->dataBuffer.append(QString::fromUtf8(d->socket->readAll()));
+ d->dataBuffer.append(data);
//
// Check for whitespace pings
diff --git a/src/base/QXmppStream.h b/src/base/QXmppStream.h
index 0156fe80..2e807549 100644
--- a/src/base/QXmppStream.h
+++ b/src/base/QXmppStream.h
@@ -96,6 +96,10 @@ private Q_SLOTS:
void _q_socketReadyRead();
private:
+ void processData(const QString &data);
+
+ friend class tst_QXmppStream;
+
QXmppStreamPrivate *const d;
};
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index faa70200..3b94bcc6 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -51,6 +51,7 @@ add_simple_test(qxmppsessioniq)
add_simple_test(qxmppsocks)
add_simple_test(qxmppstanza)
add_simple_test(qxmppstarttlspacket)
+add_simple_test(qxmppstream)
add_simple_test(qxmppstreamfeatures)
add_simple_test(qxmppstunmessage)
add_simple_test(qxmppvcardiq)
diff --git a/tests/qxmppstream/cd b/tests/qxmppstream/cd
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/qxmppstream/cd
diff --git a/tests/qxmppstream/tst_qxmppstream.cpp b/tests/qxmppstream/tst_qxmppstream.cpp
new file mode 100644
index 00000000..67bc9f77
--- /dev/null
+++ b/tests/qxmppstream/tst_qxmppstream.cpp
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2008-2020 The QXmpp developers
+ *
+ * Authors:
+ * Linus Jahn
+ *
+ * Source:
+ * https://github.com/qxmpp-project/qxmpp
+ *
+ * This file is a part of QXmpp library.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ */
+
+#include "QXmppStream.h"
+
+#include "util.h"
+
+Q_DECLARE_METATYPE(QDomElement)
+
+class TestStream : public QXmppStream
+{
+ Q_OBJECT
+
+public:
+ TestStream(QObject *parent)
+ : QXmppStream(parent)
+ {
+ }
+
+ void handleStart() override
+ {
+ QXmppStream::handleStart();
+ emit started();
+ }
+
+ void handleStream(const QDomElement &element) override
+ {
+ emit streamReceived(element);
+ }
+
+ void handleStanza(const QDomElement &element) override
+ {
+ emit stanzaReceived(element);
+ }
+
+ Q_SIGNAL void started();
+ Q_SIGNAL void streamReceived(const QDomElement &element);
+ Q_SIGNAL void stanzaReceived(const QDomElement &element);
+};
+
+class tst_QXmppStream : public QObject
+{
+ Q_OBJECT
+
+private:
+ Q_SLOT void initTestCase();
+ Q_SLOT void testProcessData();
+};
+
+void tst_QXmppStream::initTestCase()
+{
+ qRegisterMetaType<QDomElement>();
+}
+
+void tst_QXmppStream::testProcessData()
+{
+ TestStream stream(this);
+
+ QSignalSpy onStarted(&stream, &TestStream::started);
+ QSignalSpy onStreamReceived(&stream, &TestStream::streamReceived);
+ QSignalSpy onStanzaReceived(&stream, &TestStream::stanzaReceived);
+
+ stream.processData(R"(<?xml version="1.0" encoding="UTF-8"?>)");
+ stream.processData(R"(
+ <stream:stream from='juliet@im.example.com'
+ to='im.example.com'
+ version='1.0'
+ xml:lang='en'
+ xmlns='jabber:client'
+ xmlns:stream='http://etherx.jabber.org/streams'>)");
+
+ // check stream was found
+ QCOMPARE(onStreamReceived.size(), 1);
+ QCOMPARE(onStanzaReceived.size(), 0);
+ QCOMPARE(onStarted.size(), 0);
+
+ // check stream information
+ const auto streamElement = onStreamReceived[0][0].value<QDomElement>();
+ QCOMPARE(streamElement.tagName(), QStringLiteral("stream"));
+ QCOMPARE(streamElement.namespaceURI(), QStringLiteral("http://etherx.jabber.org/streams"));
+ QCOMPARE(streamElement.attribute("from"), QStringLiteral("juliet@im.example.com"));
+ QCOMPARE(streamElement.attribute("to"), QStringLiteral("im.example.com"));
+ QCOMPARE(streamElement.attribute("version"), QStringLiteral("1.0"));
+ QCOMPARE(streamElement.attribute("lang"), QStringLiteral("en"));
+
+ stream.processData(R"(
+ <stream:features>
+ <starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'>
+ <required/>
+ </starttls>
+ </stream:features>)");
+
+ QCOMPARE(onStreamReceived.size(), 1);
+ QCOMPARE(onStanzaReceived.size(), 1);
+ QCOMPARE(onStarted.size(), 0);
+
+ const auto features = onStanzaReceived[0][0].value<QDomElement>();
+ QCOMPARE(features.tagName(), QStringLiteral("features"));
+ QCOMPARE(features.namespaceURI(), QStringLiteral("http://etherx.jabber.org/streams"));
+
+ // test partial data
+ stream.processData(R"(<message from="juliet@im.example.co)");
+ QCOMPARE(onStreamReceived.size(), 1);
+ QCOMPARE(onStanzaReceived.size(), 1);
+ QCOMPARE(onStarted.size(), 0);
+ stream.processData(R"(m" to="stpeter@im.example.com">)");
+ stream.processData(R"(<body>Moin</body>)");
+ stream.processData(R"(</message>)");
+ QCOMPARE(onStreamReceived.size(), 1);
+ QCOMPARE(onStanzaReceived.size(), 2);
+ QCOMPARE(onStarted.size(), 0);
+
+ const auto message = onStanzaReceived[1][0].value<QDomElement>();
+ QCOMPARE(message.tagName(), QStringLiteral("message"));
+ QCOMPARE(message.namespaceURI(), QStringLiteral("jabber:client"));
+
+ stream.processData(R"(</stream:stream>)");
+}
+
+QTEST_MAIN(tst_QXmppStream)
+#include "tst_qxmppstream.moc"