1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
// SPDX-FileCopyrightText: 2021 Daniel Vrátil <dvratil@kde.org>
//
// SPDX-License-Identifier: MIT
#include "testdbusserver.h"
#include "testobject.h"
#include "qcorodbuspendingcall.h"
#include <QDBusConnection>
#include <QDBusError>
#include <QDBusInterface>
#include <QDBusReply>
class QCoroDBusPendingCallTest : public QCoro::TestObject<QCoroDBusPendingCallTest> {
Q_OBJECT
private:
QCoro::Task<> testTriggers_coro(QCoro::TestContext) {
QDBusInterface iface(DBusServer::serviceName, DBusServer::objectPath,
DBusServer::interfaceName);
QCORO_VERIFY(iface.isValid());
const QDBusReply<void> reply = co_await iface.asyncCall(QStringLiteral("foo"));
QCORO_VERIFY(reply.isValid());
}
QCoro::Task<> testReturnsResult_coro(QCoro::TestContext) {
QDBusInterface iface(DBusServer::serviceName, DBusServer::objectPath,
DBusServer::interfaceName);
QCORO_VERIFY(iface.isValid());
const QDBusReply<QString> reply =
co_await iface.asyncCall(QStringLiteral("ping"), QStringLiteral("Hello there!"));
QCORO_VERIFY(reply.isValid());
QCORO_COMPARE(reply.value(), QStringLiteral("Hello there!"));
}
void testThenReturnsResult_coro(TestLoop &el) {
QDBusInterface iface(DBusServer::serviceName, DBusServer::objectPath,
DBusServer::interfaceName);
QVERIFY(iface.isValid());
const QDBusPendingCall call =
iface.asyncCall(QStringLiteral("ping"), QStringLiteral("Hello there!"));
bool called = false;
qCoro(call).waitForFinished().then([&](const QDBusMessage &msg) {
called = true;
el.quit();
QCOMPARE(QDBusReply<QString>(msg).value(), QStringLiteral("Hello there!"));
});
el.exec();
QVERIFY(called);
}
QCoro::Task<> testDoesntBlockEventLoop_coro(QCoro::TestContext) {
QCoro::EventLoopChecker eventLoopResponsive;
QDBusInterface iface(DBusServer::serviceName, DBusServer::objectPath,
DBusServer::interfaceName);
QCORO_VERIFY(iface.isValid());
const QDBusReply<void> reply = co_await iface.asyncCall(QStringLiteral("blockFor"), 1);
QCORO_VERIFY(reply.isValid());
QCORO_VERIFY(eventLoopResponsive);
}
QCoro::Task<> testDoesntCoAwaitFinishedCall_coro(QCoro::TestContext test) {
QDBusInterface iface(DBusServer::serviceName, DBusServer::objectPath,
DBusServer::interfaceName);
QCORO_VERIFY(iface.isValid());
auto call = iface.asyncCall(QStringLiteral("foo"));
QDBusReply<void> reply = co_await call;
QCORO_VERIFY(reply.isValid());
test.setShouldNotSuspend();
reply = co_await call;
QCORO_VERIFY(reply.isValid());
}
private Q_SLOTS:
void initTestCase() {
for (int i = 0; i < 10; ++i) {
QDBusInterface iface(DBusServer::serviceName, DBusServer::objectPath,
DBusServer::interfaceName);
if (iface.isValid()) {
return;
}
QTest::qWait(100);
}
QFAIL("Failed to obtain a valid dbus interface");
}
void cleanupTestCase() {
QDBusInterface iface(DBusServer::serviceName, DBusServer::objectPath,
DBusServer::interfaceName);
iface.call(QStringLiteral("quit"));
}
addTest(Triggers)
addCoroAndThenTests(ReturnsResult)
addTest(DoesntBlockEventLoop)
addTest(DoesntCoAwaitFinishedCall)
};
DBUS_TEST_MAIN(QCoroDBusPendingCallTest)
#include "qdbuspendingcall.moc"
|