/**************************************************************************** ** ** Copyright (C) 2016 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #ifdef Q_OS_WIN # include # define getpid _getpid #else # include # include #endif class tst_QDBusConnection_Delayed : public QObject { Q_OBJECT private slots: void delayedMessages(); }; class Foo : public QObject { Q_OBJECT Q_CLASSINFO("D-Bus Interface", "org.qtproject.tst_qdbusconnection_delayed.Foo") public slots: int bar() { return 42; } }; static bool executedOnce = false; void tst_QDBusConnection_Delayed::delayedMessages() { if (executedOnce) QSKIP("This test can only be executed once"); executedOnce = true; int argc = 1; char *argv[] = { const_cast("tst_qdbusconnection_delayed"), 0 }; QCoreApplication app(argc, argv); QDBusConnection session = QDBusConnection::sessionBus(); QVERIFY(session.isConnected()); QVERIFY(!session.baseService().isEmpty()); QDBusConnection other = QDBusConnection::connectToBus(QDBusConnection::SessionBus, "other"); QVERIFY(other.isConnected()); QVERIFY(!other.baseService().isEmpty()); // make a method call: those should work even if delivery is disabled QVERIFY(session.interface()->isServiceRegistered(other.baseService())); // acquire a name in the main session bus connection: the effect is immediate QString name = "org.qtproject.tst_qdbusconnection_delayed-" + QString::number(getpid()); QVERIFY(session.registerService(name)); QVERIFY(other.interface()->isServiceRegistered(name)); // make an asynchronous call to a yet-unregistered object QDBusPendingCallWatcher pending(other.asyncCall(QDBusMessage::createMethodCall(name, "/foo", QString(), "bar"))); // sleep the main thread without running the event loop; // the call must not be delivered QTest::qSleep(1000); QVERIFY(!pending.isFinished()); // now register the object Foo foo; session.registerObject("/foo", &foo, QDBusConnection::ExportAllSlots); connect(&pending, &QDBusPendingCallWatcher::finished, &QTestEventLoop::instance(), &QTestEventLoop::exitLoop); QTestEventLoop::instance().enterLoop(2); QVERIFY(!QTestEventLoop::instance().timeout()); QVERIFY(pending.isFinished()); QVERIFY2(!pending.isError(), pending.error().name().toLatin1()); QVERIFY(!pending.reply().arguments().isEmpty()); QCOMPARE(pending.reply().arguments().at(0), QVariant(42)); } QTEST_APPLESS_MAIN(tst_QDBusConnection_Delayed) #include "tst_qdbusconnection_delayed.moc"