diff options
| author | Linus Jahn <lnj@kaidan.im> | 2021-07-05 23:37:52 +0200 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2021-07-06 00:37:03 +0200 |
| commit | 6b6fdfabb1ba8051f0a55e9e7bff123907253030 (patch) | |
| tree | 5429461c7e1a0b1190772b6e5e4dbe79756f349c | |
| parent | d3db0c7e5044dc4507c82ed8f371ca8c324ac639 (diff) | |
| download | qxmpp-6b6fdfabb1ba8051f0a55e9e7bff123907253030.tar.gz | |
tests: Add TestClient class for client testing with QFutures
| -rw-r--r-- | src/base/QXmppStanza.h | 1 | ||||
| -rw-r--r-- | src/base/QXmppStream.h | 1 | ||||
| -rw-r--r-- | src/client/QXmppClient.h | 1 | ||||
| -rw-r--r-- | tests/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | tests/TestClient.h | 106 | ||||
| -rw-r--r-- | tests/util.h | 20 |
6 files changed, 129 insertions, 2 deletions
diff --git a/src/base/QXmppStanza.h b/src/base/QXmppStanza.h index a6962429..cbfcdac5 100644 --- a/src/base/QXmppStanza.h +++ b/src/base/QXmppStanza.h @@ -234,6 +234,7 @@ protected: private: QSharedDataPointer<QXmppStanzaPrivate> d; static uint s_uniqeIdNo; + friend class TestClient; }; Q_DECLARE_METATYPE(QXmppStanza::Error::Type); diff --git a/src/base/QXmppStream.h b/src/base/QXmppStream.h index 91bf7d09..3299b096 100644 --- a/src/base/QXmppStream.h +++ b/src/base/QXmppStream.h @@ -106,6 +106,7 @@ private Q_SLOTS: private: friend class QXmppStreamManager; friend class tst_QXmppStream; + friend class TestClient; void processData(const QString &data); void sendPacket(QXmppPacket &packet); diff --git a/src/client/QXmppClient.h b/src/client/QXmppClient.h index e341fad7..3337c5b1 100644 --- a/src/client/QXmppClient.h +++ b/src/client/QXmppClient.h @@ -323,6 +323,7 @@ private: QXmppClientPrivate *const d; friend class QXmppInternalClientExtension; + friend class TestClient; }; #endif // QXMPPCLIENT_H 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 |
