aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2021-07-05 23:37:52 +0200
committerLinus Jahn <lnj@kaidan.im>2021-07-06 00:37:03 +0200
commit6b6fdfabb1ba8051f0a55e9e7bff123907253030 (patch)
tree5429461c7e1a0b1190772b6e5e4dbe79756f349c /tests
parentd3db0c7e5044dc4507c82ed8f371ca8c324ac639 (diff)
downloadqxmpp-6b6fdfabb1ba8051f0a55e9e7bff123907253030.tar.gz
tests: Add TestClient class for client testing with QFutures
Diffstat (limited to 'tests')
-rw-r--r--tests/CMakeLists.txt2
-rw-r--r--tests/TestClient.h106
-rw-r--r--tests/util.h20
3 files changed, 126 insertions, 2 deletions
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index a7d50ce0..2022b75a 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -3,7 +3,7 @@ include_directories(.)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Test)
macro(add_simple_test TEST_NAME)
- add_executable(tst_${TEST_NAME} ${TEST_NAME}/tst_${TEST_NAME}.cpp)
+ add_executable(tst_${TEST_NAME} ${TEST_NAME}/tst_${TEST_NAME}.cpp ${ARGN})
add_test(tst_${TEST_NAME} tst_${TEST_NAME})
target_link_libraries(tst_${TEST_NAME} Qt${QT_VERSION_MAJOR}::Test qxmpp)
endmacro()
diff --git a/tests/TestClient.h b/tests/TestClient.h
new file mode 100644
index 00000000..6dcec3de
--- /dev/null
+++ b/tests/TestClient.h
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2008-2021 The QXmpp developers
+ *
+ * Author:
+ * 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.
+ *
+ */
+
+#ifndef CLIENTTESTING_H
+#define CLIENTTESTING_H
+
+#include "QXmppClient.h"
+#include "QXmppClient_p.h"
+#include "QXmppOutgoingClient.h"
+#include "util.h"
+
+class TestClient : public QXmppClient
+{
+ Q_OBJECT
+public:
+ TestClient(bool enableDebug = false)
+ : QXmppClient(),
+ debugEnabled(enableDebug)
+ {
+ // clear extensions
+ qDeleteAll(d->extensions);
+ d->extensions.clear();
+ // enable stream management (so IQ requests are not stopped)
+ d->stream->enableStreamManagement(true);
+ // setup logging (for expect())
+ logger()->setLoggingType(QXmppLogger::SignalLogging);
+ connect(logger(), &QXmppLogger::message, this, &TestClient::onLoggerMessage);
+ resetIdCount();
+ }
+
+ ~TestClient() override
+ {
+ }
+
+ template<typename T, typename ...Args>
+ T *addNewExtension(Args... args)
+ {
+ auto *ext = new T(args...);
+ addExtension(ext);
+ return ext;
+ }
+
+ void inject(const QByteArray &xml)
+ {
+ d->stream->handleIqResponse(xmlToDom(xml));
+ QCoreApplication::processEvents();
+ resetIdCount();
+ }
+
+ void expect(QString &&packet)
+ {
+ QVERIFY2(!m_sentPackets.empty(), "No packet was sent!");
+ QCOMPARE(m_sentPackets.takeFirst(), packet.replace(u'\'', u'"'));
+ resetIdCount();
+ }
+ void ignore()
+ {
+ m_sentPackets.takeFirst();
+ resetIdCount();
+ }
+
+ void resetIdCount()
+ {
+ QXmppStanza::s_uniqeIdNo = 0;
+ }
+
+private:
+ void onLoggerMessage(QXmppLogger::MessageType type, const QString &text)
+ {
+ if (type != QXmppLogger::SentMessage ||
+ text == QLatin1String("<r xmlns=\"urn:xmpp:sm:3\"/>")) {
+ return;
+ }
+
+ if (debugEnabled) {
+ qDebug() << "LOG" << text;
+ }
+
+ m_sentPackets << text;
+ }
+
+ bool debugEnabled;
+ QList<QString> m_sentPackets;
+};
+
+#endif // CLIENTTESTING_H
diff --git a/tests/util.h b/tests/util.h
index 7711518e..dc36e7af 100644
--- a/tests/util.h
+++ b/tests/util.h
@@ -23,8 +23,13 @@
*
*/
+#ifndef TESTS_UTIL_H
+#define TESTS_UTIL_H
+
#include "QXmppPasswordChecker.h"
+#include <variant>
+
#include <QDomDocument>
#include <QtTest>
@@ -33,7 +38,7 @@
if (!QTest::qVerify(statement, #statement, description, __FILE__, __LINE__)) \
return {};
-QDomElement xmlToDom(const QByteArray &xml)
+inline QDomElement xmlToDom(const QByteArray &xml)
{
QDomDocument doc;
QVERIFY_RV(doc.setContent(xml, true), "XML is not valid");
@@ -73,6 +78,17 @@ QDomElement writePacketToDom(T packet)
return doc.documentElement();
}
+template<typename T, typename Input>
+T expectFutureVariant(const QFuture<Input> &future)
+{
+#define return \
+ return { }
+ QVERIFY(future.isFinished());
+ QVERIFY2(std::holds_alternative<T>(future.result()), "Variant contains wrong type!");
+#undef return
+ return std::get<T>(future.result());
+}
+
class TestPasswordChecker : public QXmppPasswordChecker
{
public:
@@ -101,3 +117,5 @@ public:
private:
QMap<QString, QString> m_credentials;
};
+
+#endif // TESTS_UTIL_H