diff options
author | Liang Qi <liang.qi@theqtcompany.com> | 2015-09-25 14:02:04 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@theqtcompany.com> | 2015-09-25 14:02:04 +0200 |
commit | a1ad9a74ebb3c556c5f70f7e03be68b09598ac53 (patch) | |
tree | 615a96db418219a57a745a5899e39a9ac90744ec /tests/auto/dbus | |
parent | 6d78b7a0c46ea04f4bb771d960e2f7dff1362341 (diff) | |
parent | 462f355e4fb16cc7a1838fa2dda0f763eee58c84 (diff) |
Merge remote-tracking branch 'origin/5.6' into dev
Conflicts:
src/corelib/io/io.pri
src/corelib/io/qdatastream.cpp
src/corelib/io/qdatastream.h
src/network/socket/qabstractsocket.cpp
src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp
src/plugins/platforms/cocoa/qcocoaaccessibilityelement.h
src/widgets/styles/qgtkstyle.cpp
tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/qmimedatabase-cache.pro
tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/qmimedatabase-xml.pro
tests/auto/dbus/qdbusconnection/qdbusconnection.pro
tests/auto/dbus/qdbuspendingcall/tst_qdbuspendingcall.cpp
tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
Change-Id: I347549a024eb5bfa986699e0a11f96cc55c797a7
Diffstat (limited to 'tests/auto/dbus')
11 files changed, 503 insertions, 298 deletions
diff --git a/tests/auto/dbus/dbus.pro b/tests/auto/dbus/dbus.pro index cd845d7043..bd1fef5193 100644 --- a/tests/auto/dbus/dbus.pro +++ b/tests/auto/dbus/dbus.pro @@ -3,6 +3,7 @@ SUBDIRS=\ qdbusabstractadaptor \ qdbusabstractinterface \ qdbusconnection \ + qdbusconnection_no_app \ qdbusconnection_no_bus \ qdbuscontext \ qdbusinterface \ @@ -16,7 +17,7 @@ SUBDIRS=\ qdbusservicewatcher \ qdbustype \ qdbusthreading \ - qdbusxmlparser \ + qdbusxmlparser !contains(QT_CONFIG,private_tests): SUBDIRS -= \ qdbusmarshall \ diff --git a/tests/auto/dbus/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp b/tests/auto/dbus/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp index 22984743e7..7a73dddfe3 100644 --- a/tests/auto/dbus/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp +++ b/tests/auto/dbus/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp @@ -346,7 +346,7 @@ void syncPeer() // wait for the sync signal with the right ID QEventLoop loop; QDBusConnection con("peer"); - con.connect(serviceName, objectPath, interfaceName, "syncReceived", + con.connect(QString(), objectPath, interfaceName, "syncReceived", QStringList() << reqId, QString(), &loop, SLOT(quit())); QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "requestSync"); diff --git a/tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp b/tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp index d862e4321c..2db687e21b 100644 --- a/tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp +++ b/tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp @@ -1012,8 +1012,14 @@ void tst_QDBusAbstractInterface::followSignal() QVERIFY(!con.interface()->isServiceRegistered(serviceToFollow)); Pinger control = getPinger(""); - // we need to connect the signal somewhere in order for D-Bus to enable the rules - QTestEventLoop::instance().connect(p.data(), SIGNAL(voidSignal()), SLOT(exitLoop())); + // connect our test signal + // FRAGILE CODE AHEAD: + // Connection order is important: we connect the control first because that + // needs to be delivered last, to ensure that we don't exitLoop() before + // the signal delivery to QSignalSpy is posted to the current thread. That + // happens because QDBusConnectionPrivate runs in a separate thread and + // uses a QMultiHash and insertMulti prepends to the list of items with the + // same key. QTestEventLoop::instance().connect(control.data(), SIGNAL(voidSignal()), SLOT(exitLoop())); QSignalSpy s(p.data(), SIGNAL(voidSignal())); diff --git a/tests/auto/dbus/qdbusconnection/qdbusconnection.pro b/tests/auto/dbus/qdbusconnection/qdbusconnection.pro index 8c729aaf33..3fcf3e076b 100644 --- a/tests/auto/dbus/qdbusconnection/qdbusconnection.pro +++ b/tests/auto/dbus/qdbusconnection/qdbusconnection.pro @@ -2,3 +2,4 @@ CONFIG += testcase TARGET = tst_qdbusconnection QT = core dbus testlib SOURCES += tst_qdbusconnection.cpp +HEADERS += tst_qdbusconnection.h diff --git a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp index a3de878ffb..7cd8c875ec 100644 --- a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp +++ b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. +** Copyright (C) 2015 Intel Corporation. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -30,34 +31,15 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ + +#include "tst_qdbusconnection.h" + #include <qcoreapplication.h> #include <qdebug.h> #include <QtTest/QtTest> #include <QtDBus/QtDBus> -class BaseObject: public QObject -{ - Q_OBJECT - Q_CLASSINFO("D-Bus Interface", "local.BaseObject") -public: - BaseObject(QObject *parent = 0) : QObject(parent) { } -public slots: - void anotherMethod() { } -}; - -class MyObject: public BaseObject -{ - Q_OBJECT -public slots: - void method(const QDBusMessage &msg); - -public: - static QString path; - int callCount; - MyObject(QObject *parent = 0) : BaseObject(parent), callCount(0) {} -}; - void MyObject::method(const QDBusMessage &msg) { path = msg.path(); @@ -65,19 +47,6 @@ void MyObject::method(const QDBusMessage &msg) //qDebug() << msg; } -class MyObjectWithoutInterface: public QObject -{ - Q_OBJECT -public slots: - void method(const QDBusMessage &msg); - -public: - static QString path; - static QString interface; - int callCount; - MyObjectWithoutInterface(QObject *parent = 0) : QObject(parent), callCount(0) {} -}; - void MyObjectWithoutInterface::method(const QDBusMessage &msg) { path = msg.path(); @@ -86,72 +55,6 @@ void MyObjectWithoutInterface::method(const QDBusMessage &msg) //qDebug() << msg; } -class tst_QDBusConnection: public QObject -{ - Q_OBJECT - - int signalsReceived; -public slots: - void oneSlot() { ++signalsReceived; } - void exitLoop() { ++signalsReceived; QTestEventLoop::instance().exitLoop(); } - void secondCallWithCallback(); - -private slots: - void noConnection(); - void connectToBus(); - void connectToPeer(); - void connect(); - void send(); - void sendWithGui(); - void sendAsync(); - void sendSignal(); - void sendSignalToName(); - void sendSignalToOtherName(); - - void registerObject_data(); - void registerObject(); - void registerObjectWithInterface_data(); - void registerObjectWithInterface(); - void registerObjectPeer_data(); - void registerObjectPeer(); - void registerObject2(); - void registerObjectPeer2(); - - void registerQObjectChildren(); - void registerQObjectChildrenPeer(); - - void callSelf(); - void callSelfByAnotherName_data(); - void callSelfByAnotherName(); - void multipleInterfacesInQObject(); - - void slotsWithLessParameters(); - void nestedCallWithCallback(); - - void serviceRegistrationRaceCondition(); - - void registerVirtualObject(); - void callVirtualObject(); - void callVirtualObjectLocal(); - -public: - QString serviceName() const { return "org.qtproject.Qt.Autotests.QDBusConnection"; } - bool callMethod(const QDBusConnection &conn, const QString &path); - bool callMethod(const QDBusConnection &conn, const QString &path, const QString &interface); - bool callMethodPeer(const QDBusConnection &conn, const QString &path); -}; - -class QDBusSpy: public QObject -{ - Q_OBJECT -public slots: - void handlePing(const QString &str) { args.clear(); args << str; } - void asyncReply(const QDBusMessage &msg) { args = msg.arguments(); } - -public: - QList<QVariant> args; -}; - void tst_QDBusConnection::noConnection() { QDBusConnection con = QDBusConnection::connectToBus("unix:path=/dev/null", "testconnection"); @@ -187,12 +90,13 @@ void tst_QDBusConnection::sendSignal() msg << QLatin1String("ping"); QVERIFY(con.send(msg)); - - QTest::qWait(1000); } void tst_QDBusConnection::sendSignalToName() { + if (!QCoreApplication::instance()) + QSKIP("Test requires a QCoreApplication"); // because of the qWait() + QDBusSpy spy; QDBusConnection con = QDBusConnection::sessionBus(); @@ -215,6 +119,9 @@ void tst_QDBusConnection::sendSignalToName() void tst_QDBusConnection::sendSignalToOtherName() { + if (!QCoreApplication::instance()) + QSKIP("Test requires a QCoreApplication"); // because of the qWait() + QDBusSpy spy; QDBusConnection con = QDBusConnection::sessionBus(); @@ -252,6 +159,9 @@ void tst_QDBusConnection::send() void tst_QDBusConnection::sendWithGui() { + if (!QCoreApplication::instance()) + QSKIP("Test requires a QCoreApplication"); + QDBusConnection con = QDBusConnection::sessionBus(); QVERIFY(con.isConnected()); @@ -268,6 +178,9 @@ void tst_QDBusConnection::sendWithGui() void tst_QDBusConnection::sendAsync() { + if (!QCoreApplication::instance()) + QSKIP("Test requires a QCoreApplication"); + QDBusConnection con = QDBusConnection::sessionBus(); QVERIFY(con.isConnected()); @@ -289,6 +202,9 @@ void tst_QDBusConnection::connect() QDBusConnection con = QDBusConnection::sessionBus(); + if (!QCoreApplication::instance()) + return; // cannot receive signals in this thread without QCoreApplication + con.connect(con.baseService(), "/org/kde/selftest", "org.kde.selftest", "ping", &spy, SLOT(handlePing(QString))); @@ -482,58 +398,6 @@ void tst_QDBusConnection::registerObjectWithInterface() QVERIFY(!callMethod(con, path, interface)); } -class MyServer : public QDBusServer -{ - Q_OBJECT -public: - MyServer(QString path) : m_path(path), m_connections() - { - connect(this, SIGNAL(newConnection(QDBusConnection)), SLOT(handleConnection(QDBusConnection))); - } - - bool registerObject(const QDBusConnection& c) - { - QDBusConnection conn(c); - if (!conn.registerObject(m_path, &m_obj, QDBusConnection::ExportAllSlots)) - return false; - if (!(conn.objectRegisteredAt(m_path) == &m_obj)) - return false; - return true; - } - - bool registerObject() - { - Q_FOREACH (const QString &name, m_connections) { - if (!registerObject(QDBusConnection(name))) - return false; - } - return true; - } - - void unregisterObject() - { - Q_FOREACH (const QString &name, m_connections) { - QDBusConnection c(name); - c.unregisterObject(m_path); - } - } - -public slots: - void handleConnection(const QDBusConnection& c) - { - m_connections << c.name(); - QVERIFY(isConnected()); - QVERIFY(c.isConnected()); - QVERIFY(registerObject(c)); - } - -private: - MyObject m_obj; - QString m_path; - QStringList m_connections; -}; - - void tst_QDBusConnection::registerObjectPeer_data() { QTest::addColumn<QString>("path"); @@ -547,16 +411,22 @@ void tst_QDBusConnection::registerObjectPeer_data() void tst_QDBusConnection::registerObjectPeer() { + if (!QCoreApplication::instance()) + QSKIP("Test requires a QCoreApplication"); + QFETCH(QString, path); MyServer server(path); QDBusConnection::connectToPeer(server.address(), "beforeFoo"); + QTestEventLoop::instance().enterLoop(2); + QVERIFY(!QTestEventLoop::instance().timeout()); { QDBusConnection con = QDBusConnection::connectToPeer(server.address(), "foo"); - QCoreApplication::processEvents(); + QTestEventLoop::instance().enterLoop(2); + QVERIFY(!QTestEventLoop::instance().timeout()); QVERIFY(con.isConnected()); MyObject obj; @@ -565,6 +435,7 @@ void tst_QDBusConnection::registerObjectPeer() } QDBusConnection::connectToPeer(server.address(), "afterFoo"); + QTestEventLoop::instance().enterLoop(2); { QDBusConnection con("foo"); @@ -617,7 +488,6 @@ void tst_QDBusConnection::registerObject2() MyObject obj; QVERIFY(con.registerObject("/", &obj, QDBusConnection::ExportAllSlots)); QVERIFY(callMethod(con, "/")); - qDebug() << obj.path; QCOMPARE(obj.path, QString("/")); } // make sure it's gone @@ -629,7 +499,6 @@ void tst_QDBusConnection::registerObject2() QVERIFY(con.registerObject("/p1", &obj, QDBusConnection::ExportAllSlots)); QVERIFY(!callMethod(con, "/")); QVERIFY(callMethod(con, "/p1")); - qDebug() << obj.path; QCOMPARE(obj.path, QString("/p1")); // re-register it somewhere else @@ -693,38 +562,15 @@ void tst_QDBusConnection::registerObject2() } } -class MyServer2 : public QDBusServer -{ - Q_OBJECT -public: - MyServer2() : m_conn("none") - { - connect(this, SIGNAL(newConnection(QDBusConnection)), SLOT(handleConnection(QDBusConnection))); - } - - QDBusConnection connection() - { - return m_conn; - } - -public slots: - void handleConnection(const QDBusConnection& c) - { - m_conn = c; - QVERIFY(isConnected()); - QVERIFY(m_conn.isConnected()); - } - -private: - MyObject m_obj; - QDBusConnection m_conn; -}; - void tst_QDBusConnection::registerObjectPeer2() { + if (!QCoreApplication::instance()) + QSKIP("Test requires a QCoreApplication"); + MyServer2 server; QDBusConnection con = QDBusConnection::connectToPeer(server.address(), "foo"); - QCoreApplication::processEvents(); + QTestEventLoop::instance().enterLoop(2); + QVERIFY(!QTestEventLoop::instance().timeout()); QVERIFY(con.isConnected()); QDBusConnection srv_con = server.connection(); @@ -741,7 +587,6 @@ void tst_QDBusConnection::registerObjectPeer2() MyObject obj; QVERIFY(con.registerObject("/", &obj, QDBusConnection::ExportAllSlots)); QVERIFY(callMethodPeer(srv_con, "/")); - qDebug() << obj.path; QCOMPARE(obj.path, QString("/")); } // make sure it's gone @@ -753,7 +598,6 @@ void tst_QDBusConnection::registerObjectPeer2() QVERIFY(con.registerObject("/p1", &obj, QDBusConnection::ExportAllSlots)); QVERIFY(!callMethodPeer(srv_con, "/")); QVERIFY(callMethodPeer(srv_con, "/p1")); - qDebug() << obj.path; QCOMPARE(obj.path, QString("/p1")); // re-register it somewhere else @@ -877,8 +721,13 @@ void tst_QDBusConnection::registerQObjectChildren() void tst_QDBusConnection::registerQObjectChildrenPeer() { + if (!QCoreApplication::instance()) + QSKIP("Test requires a QCoreApplication"); + MyServer2 server; QDBusConnection con = QDBusConnection::connectToPeer(server.address(), "foo"); + QTestEventLoop::instance().enterLoop(2); + QVERIFY(!QTestEventLoop::instance().timeout()); QCoreApplication::processEvents(); QVERIFY(con.isConnected()); @@ -968,22 +817,6 @@ bool tst_QDBusConnection::callMethodPeer(const QDBusConnection &conn, const QStr return (MyObject::path == path); } -class TestObject : public QObject -{ -Q_OBJECT -public: - TestObject(QObject *parent = 0) : QObject(parent) {} - ~TestObject() {} - - QString func; - -public slots: - void test0() { func = "test0"; } - void test1(int i) { func = "test1 " + QString::number(i); } - int test2() { func = "test2"; return 43; } - int test3(int i) { func = "test2"; return i + 1; } -}; - void tst_QDBusConnection::callSelf() { TestObject testObject; @@ -1020,6 +853,9 @@ void tst_QDBusConnection::callSelfByAnotherName_data() void tst_QDBusConnection::callSelfByAnotherName() { + if (!QCoreApplication::instance()) + QSKIP("Test requires a QCoreApplication"); + static int counter = 0; QString sname = serviceName() + QString::number(counter++); @@ -1092,6 +928,9 @@ void tst_QDBusConnection::multipleInterfacesInQObject() void tst_QDBusConnection::slotsWithLessParameters() { + if (!QCoreApplication::instance()) + QSKIP("Test requires a QCoreApplication"); + QDBusConnection con = QDBusConnection::sessionBus(); QDBusMessage signal = QDBusMessage::createSignal("/", "org.qtproject.TestCase", @@ -1118,7 +957,6 @@ void tst_QDBusConnection::slotsWithLessParameters() void tst_QDBusConnection::secondCallWithCallback() { - qDebug("Hello"); QDBusConnection con = QDBusConnection::sessionBus(); QDBusMessage msg = QDBusMessage::createMethodCall(con.baseService(), "/test", QString(), "test0"); @@ -1127,6 +965,9 @@ void tst_QDBusConnection::secondCallWithCallback() void tst_QDBusConnection::nestedCallWithCallback() { + if (!QCoreApplication::instance()) + QSKIP("Test requires a QCoreApplication"); + TestObject testObject; QDBusConnection connection = QDBusConnection::sessionBus(); QVERIFY(connection.registerObject("/test", &testObject, @@ -1142,22 +983,11 @@ void tst_QDBusConnection::nestedCallWithCallback() QCOMPARE(signalsReceived, 1); } -class RaceConditionSignalWaiter : public QObject -{ - Q_OBJECT -public: - int count; - RaceConditionSignalWaiter() : count (0) {} - virtual ~RaceConditionSignalWaiter() {} - -public slots: - void countUp() { ++count; emit done(); } -signals: - void done(); -}; - void tst_QDBusConnection::serviceRegistrationRaceCondition() { + if (!QCoreApplication::instance()) + QSKIP("Test requires a QCoreApplication"); + // There was a race condition in the updating of list of name owners in // Qt D-Bus. When the user connects to a signal coming from a given // service, we must listen for NameOwnerChanged signals relevant to that @@ -1209,39 +1039,6 @@ void tst_QDBusConnection::serviceRegistrationRaceCondition() QCOMPARE(recv.count, 1); } -class VirtualObject: public QDBusVirtualObject -{ - Q_OBJECT -public: - VirtualObject() :success(true) {} - - QString introspect(const QString & /* path */) const - { - return QString(); - } - - bool handleMessage(const QDBusMessage &message, const QDBusConnection &connection) { - ++callCount; - lastMessage = message; - - if (success) { - QDBusMessage reply = message.createReply(replyArguments); - connection.send(reply); - } - emit messageReceived(message); - return success; - } -signals: - void messageReceived(const QDBusMessage &message) const; - -public: - mutable QDBusMessage lastMessage; - QVariantList replyArguments; - mutable int callCount; - bool success; -}; - - void tst_QDBusConnection::registerVirtualObject() { QDBusConnection con = QDBusConnection::sessionBus(); @@ -1324,6 +1121,9 @@ void tst_QDBusConnection::registerVirtualObject() void tst_QDBusConnection::callVirtualObject() { + if (!QCoreApplication::instance()) + QSKIP("Test requires a QCoreApplication"); + QDBusConnection con = QDBusConnection::sessionBus(); QVERIFY(con.isConnected()); @@ -1381,7 +1181,6 @@ void tst_QDBusConnection::callVirtualObject() QVERIFY(!QTestEventLoop::instance().timeout()); QTest::qWait(100); QVERIFY(errorReply.isError()); - qDebug() << errorReply.reply().arguments(); QCOMPARE(errorReply.reply().errorName(), QString("org.freedesktop.DBus.Error.UnknownObject")); QDBusConnection::disconnectFromBus("con2"); @@ -1422,7 +1221,7 @@ void tst_QDBusConnection::callVirtualObjectLocal() QString MyObject::path; QString MyObjectWithoutInterface::path; QString MyObjectWithoutInterface::interface; -QTEST_MAIN(tst_QDBusConnection) - -#include "tst_qdbusconnection.moc" +#ifndef tst_QDBusConnection +QTEST_MAIN(tst_QDBusConnection) +#endif diff --git a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h new file mode 100644 index 0000000000..a53ba320f8 --- /dev/null +++ b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.h @@ -0,0 +1,287 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Copyright (C) 2015 Intel Corporation. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** 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 http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef TST_QDBUSCONNECTION_H +#define TST_QDBUSCONNECTION_H + +#include <QObject> +#include <QtDBus/QtDBus> +#include <QtTest/QtTest> + +class BaseObject: public QObject +{ + Q_OBJECT + Q_CLASSINFO("D-Bus Interface", "local.BaseObject") +public: + BaseObject(QObject *parent = 0) : QObject(parent) { } +public slots: + void anotherMethod() { } +}; + +class MyObject: public BaseObject +{ + Q_OBJECT +public slots: + void method(const QDBusMessage &msg); + +public: + static QString path; + int callCount; + MyObject(QObject *parent = 0) : BaseObject(parent), callCount(0) {} +}; + +class MyObjectWithoutInterface: public QObject +{ + Q_OBJECT +public slots: + void method(const QDBusMessage &msg); + +public: + static QString path; + static QString interface; + int callCount; + MyObjectWithoutInterface(QObject *parent = 0) : QObject(parent), callCount(0) {} +}; + +class tst_QDBusConnection: public QObject +{ + Q_OBJECT + + int signalsReceived; +public slots: + void oneSlot() { ++signalsReceived; } + void exitLoop() { ++signalsReceived; QTestEventLoop::instance().exitLoop(); } + void secondCallWithCallback(); + +private slots: + void noConnection(); + void connectToBus(); + void connectToPeer(); + void connect(); + void send(); + void sendWithGui(); + void sendAsync(); + void sendSignal(); + void sendSignalToName(); + void sendSignalToOtherName(); + + void registerObject_data(); + void registerObject(); + void registerObjectWithInterface_data(); + void registerObjectWithInterface(); + void registerObjectPeer_data(); + void registerObjectPeer(); + void registerObject2(); + void registerObjectPeer2(); + + void registerQObjectChildren(); + void registerQObjectChildrenPeer(); + + void callSelf(); + void callSelfByAnotherName_data(); + void callSelfByAnotherName(); + void multipleInterfacesInQObject(); + + void slotsWithLessParameters(); + void nestedCallWithCallback(); + + void serviceRegistrationRaceCondition(); + + void registerVirtualObject(); + void callVirtualObject(); + void callVirtualObjectLocal(); + +public: + QString serviceName() const { return "org.qtproject.Qt.Autotests.QDBusConnection"; } + bool callMethod(const QDBusConnection &conn, const QString &path); + bool callMethod(const QDBusConnection &conn, const QString &path, const QString &interface); + bool callMethodPeer(const QDBusConnection &conn, const QString &path); +}; + +class QDBusSpy: public QObject +{ + Q_OBJECT +public slots: + void handlePing(const QString &str) { args.clear(); args << str; } + void asyncReply(const QDBusMessage &msg) { args = msg.arguments(); } + +public: + QList<QVariant> args; +}; + +class MyServer : public QDBusServer +{ + Q_OBJECT +public: + MyServer(QString path) : m_path(path), m_connections() + { + connect(this, SIGNAL(newConnection(QDBusConnection)), SLOT(handleConnection(QDBusConnection))); + } + + bool registerObject(const QDBusConnection& c) + { + QDBusConnection conn(c); + if (!conn.registerObject(m_path, &m_obj, QDBusConnection::ExportAllSlots)) + return false; + if (!(conn.objectRegisteredAt(m_path) == &m_obj)) + return false; + return true; + } + + bool registerObject() + { + Q_FOREACH (const QString &name, m_connections) { + if (!registerObject(QDBusConnection(name))) + return false; + } + return true; + } + + void unregisterObject() + { + Q_FOREACH (const QString &name, m_connections) { + QDBusConnection c(name); + c.unregisterObject(m_path); + } + } + +public slots: + void handleConnection(const QDBusConnection& c) + { + m_connections << c.name(); + QVERIFY(isConnected()); + QVERIFY(c.isConnected()); + QVERIFY(registerObject(c)); + QTestEventLoop::instance().exitLoop(); + } + +private: + MyObject m_obj; + QString m_path; + QStringList m_connections; +}; + +class MyServer2 : public QDBusServer +{ + Q_OBJECT +public: + MyServer2() : m_conn("none") + { + connect(this, SIGNAL(newConnection(QDBusConnection)), SLOT(handleConnection(QDBusConnection))); + } + + QDBusConnection connection() + { + return m_conn; + } + +public slots: + void handleConnection(const QDBusConnection& c) + { + m_conn = c; + QVERIFY(isConnected()); + QVERIFY(m_conn.isConnected()); + QTestEventLoop::instance().exitLoop(); + } + +private: + MyObject m_obj; + QDBusConnection m_conn; +}; + +class TestObject : public QObject +{ +Q_OBJECT +public: + TestObject(QObject *parent = 0) : QObject(parent) {} + ~TestObject() {} + + QString func; + +public slots: + void test0() { func = "test0"; } + void test1(int i) { func = "test1 " + QString::number(i); } + int test2() { func = "test2"; return 43; } + int test3(int i) { func = "test2"; return i + 1; } +}; + +class RaceConditionSignalWaiter : public QObject +{ + Q_OBJECT +public: + int count; + RaceConditionSignalWaiter() : count (0) {} + virtual ~RaceConditionSignalWaiter() {} + +public slots: + void countUp() { ++count; emit done(); } +signals: + void done(); +}; + +class VirtualObject: public QDBusVirtualObject +{ + Q_OBJECT +public: + VirtualObject() :success(true) {} + + QString introspect(const QString & /* path */) const + { + return QString(); + } + + bool handleMessage(const QDBusMessage &message, const QDBusConnection &connection) { + ++callCount; + lastMessage = message; + + if (success) { + QDBusMessage reply = message.createReply(replyArguments); + connection.send(reply); + } + emit messageReceived(message); + return success; + } +signals: + void messageReceived(const QDBusMessage &message) const; + +public: + mutable QDBusMessage lastMessage; + QVariantList replyArguments; + mutable int callCount; + bool success; +}; + + +#endif // TST_QDBUSCONNECTION_H + diff --git a/tests/auto/dbus/qdbusconnection_no_app/qdbusconnection_no_app.pro b/tests/auto/dbus/qdbusconnection_no_app/qdbusconnection_no_app.pro new file mode 100644 index 0000000000..ba3a13caa9 --- /dev/null +++ b/tests/auto/dbus/qdbusconnection_no_app/qdbusconnection_no_app.pro @@ -0,0 +1,6 @@ +CONFIG += testcase +TARGET = tst_qdbusconnection_no_app +QT = core dbus testlib +SOURCES += tst_qdbusconnection_no_app.cpp +HEADERS += ../qdbusconnection/tst_qdbusconnection.h +DEFINES += SRCDIR=\\\"$$PWD/\\\" tst_QDBusConnection=tst_QDBusConnection_NoApplication diff --git a/tests/auto/dbus/qdbusconnection_no_app/tst_qdbusconnection_no_app.cpp b/tests/auto/dbus/qdbusconnection_no_app/tst_qdbusconnection_no_app.cpp new file mode 100644 index 0000000000..816f75f82e --- /dev/null +++ b/tests/auto/dbus/qdbusconnection_no_app/tst_qdbusconnection_no_app.cpp @@ -0,0 +1,37 @@ +/**************************************************************************** +** +** Copyright (C) 2015 Intel Corporation. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** 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 http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// Ugly hack, look away +#include "../qdbusconnection/tst_qdbusconnection.cpp" + +QTEST_APPLESS_MAIN(tst_QDBusConnection_NoApplication) diff --git a/tests/auto/dbus/qdbuspendingcall/tst_qdbuspendingcall.cpp b/tests/auto/dbus/qdbuspendingcall/tst_qdbuspendingcall.cpp index 9833d17a1c..8cb9aa70e9 100644 --- a/tests/auto/dbus/qdbuspendingcall/tst_qdbuspendingcall.cpp +++ b/tests/auto/dbus/qdbuspendingcall/tst_qdbuspendingcall.cpp @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2015 The Qt Company Ltd. +** Copyright (C) 2015 Intel Corporation. ** Contact: http://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -172,10 +173,6 @@ QDBusPendingCall tst_QDBusPendingCall::sendError() void tst_QDBusPendingCall::waitForFinished() { QDBusPendingCall ac = sendMessage(); - QVERIFY(!ac.isFinished()); - QVERIFY(!ac.isError()); - QCOMPARE(ac.reply().type(), QDBusMessage::InvalidMessage); - ac.waitForFinished(); QVERIFY(ac.isFinished()); QVERIFY(!ac.isError()); @@ -195,10 +192,6 @@ void tst_QDBusPendingCall::waitForFinished() void tst_QDBusPendingCall::waitForFinished_error() { QDBusPendingCall ac = sendError(); - QVERIFY(!ac.isFinished()); - QVERIFY(!ac.isError()); - QCOMPARE(ac.reply().type(), QDBusMessage::InvalidMessage); - ac.waitForFinished(); QVERIFY(ac.isFinished()); QVERIFY(ac.isError()); @@ -254,10 +247,6 @@ void tst_QDBusPendingCall::callWithCallback_localLoop_errorReply() void tst_QDBusPendingCall::watcher() { QDBusPendingCall ac = sendMessage(); - QVERIFY(!ac.isFinished()); - QVERIFY(!ac.isError()); - QCOMPARE(ac.reply().type(), QDBusMessage::InvalidMessage); - callCount = 0; watchArgument = 0; @@ -284,10 +273,6 @@ void tst_QDBusPendingCall::watcher() void tst_QDBusPendingCall::watcher_error() { QDBusPendingCall ac = sendError(); - QVERIFY(!ac.isFinished()); - QVERIFY(!ac.isError()); - QCOMPARE(ac.reply().type(), QDBusMessage::InvalidMessage); - callCount = 0; watchArgument = 0; @@ -312,10 +297,6 @@ void tst_QDBusPendingCall::watcher_error() void tst_QDBusPendingCall::watcher_waitForFinished() { QDBusPendingCall ac = sendMessage(); - QVERIFY(!ac.isFinished()); - QVERIFY(!ac.isError()); - QCOMPARE(ac.reply().type(), QDBusMessage::InvalidMessage); - callCount = 0; watchArgument = 0; @@ -391,10 +372,6 @@ void tst_QDBusPendingCall::watcher_waitForFinished_threaded() void tst_QDBusPendingCall::watcher_waitForFinished_alreadyFinished() { QDBusPendingCall ac = sendMessage(); - QVERIFY(!ac.isFinished()); - QVERIFY(!ac.isError()); - QCOMPARE(ac.reply().type(), QDBusMessage::InvalidMessage); - ac.waitForFinished(); QVERIFY(ac.isFinished()); QVERIFY(!ac.isError()); @@ -425,10 +402,6 @@ void tst_QDBusPendingCall::watcher_waitForFinished_alreadyFinished() void tst_QDBusPendingCall::watcher_waitForFinished_alreadyFinished_eventLoop() { QDBusPendingCall ac = sendMessage(); - QVERIFY(!ac.isFinished()); - QVERIFY(!ac.isError()); - QCOMPARE(ac.reply().type(), QDBusMessage::InvalidMessage); - ac.waitForFinished(); QVERIFY(ac.isFinished()); QVERIFY(!ac.isError()); @@ -462,10 +435,6 @@ void tst_QDBusPendingCall::watcher_waitForFinished_alreadyFinished_eventLoop() void tst_QDBusPendingCall::watcher_waitForFinished_error() { QDBusPendingCall ac = sendError(); - QVERIFY(!ac.isFinished()); - QVERIFY(!ac.isError()); - QCOMPARE(ac.reply().type(), QDBusMessage::InvalidMessage); - callCount = 0; watchArgument = 0; diff --git a/tests/auto/dbus/qdbusservicewatcher/tst_qdbusservicewatcher.cpp b/tests/auto/dbus/qdbusservicewatcher/tst_qdbusservicewatcher.cpp index 9dd2e4bb83..e7fa1e6484 100644 --- a/tests/auto/dbus/qdbusservicewatcher/tst_qdbusservicewatcher.cpp +++ b/tests/auto/dbus/qdbusservicewatcher/tst_qdbusservicewatcher.cpp @@ -49,8 +49,11 @@ private slots: void watchForCreation(); void watchForDisappearance(); + void watchForDisappearanceUniqueConnection(); void watchForOwnerChange(); void modeChange(); + void disconnectedConnection(); + void setConnection(); }; tst_QDBusServiceWatcher::tst_QDBusServiceWatcher() @@ -155,6 +158,40 @@ void tst_QDBusServiceWatcher::watchForDisappearance() QVERIFY(spyO.at(0).at(2).toString().isEmpty()); } +void tst_QDBusServiceWatcher::watchForDisappearanceUniqueConnection() +{ + QDBusConnection con = QDBusConnection::sessionBus(); + QVERIFY(con.isConnected()); + + // second connection + QString watchedName = QDBusConnection::connectToBus(QDBusConnection::SessionBus, "session2").baseService(); + QVERIFY(!watchedName.isEmpty()); + + QDBusServiceWatcher watcher(watchedName, con, QDBusServiceWatcher::WatchForUnregistration); + watcher.setObjectName("watcher for disappearance"); + + QSignalSpy spyR(&watcher, SIGNAL(serviceRegistered(QString))); + QSignalSpy spyU(&watcher, SIGNAL(serviceUnregistered(QString))); + QSignalSpy spyO(&watcher, SIGNAL(serviceOwnerChanged(QString,QString,QString))); + QTestEventLoop::instance().connect(&watcher, SIGNAL(serviceUnregistered(QString)), SLOT(exitLoop())); + + // unregister it: + QDBusConnection::disconnectFromBus("session2"); + + QTestEventLoop::instance().enterLoop(1); + QVERIFY(!QTestEventLoop::instance().timeout()); + + QCOMPARE(spyR.count(), 0); + + QCOMPARE(spyU.count(), 1); + QCOMPARE(spyU.at(0).at(0).toString(), watchedName); + + QCOMPARE(spyO.count(), 1); + QCOMPARE(spyO.at(0).at(0).toString(), watchedName); + QCOMPARE(spyO.at(0).at(1).toString(), watchedName); + QVERIFY(spyO.at(0).at(2).toString().isEmpty()); +} + void tst_QDBusServiceWatcher::watchForOwnerChange() { QDBusConnection con = QDBusConnection::sessionBus(); @@ -263,5 +300,72 @@ void tst_QDBusServiceWatcher::modeChange() QVERIFY(spyO.at(0).at(2).toString().isEmpty()); } +void tst_QDBusServiceWatcher::disconnectedConnection() +{ + QDBusConnection con(""); + QVERIFY(!con.isConnected()); + + QDBusServiceWatcher watcher(serviceName, con, QDBusServiceWatcher::WatchForRegistration); + watcher.addWatchedService("com.example.somethingelse"); + watcher.addWatchedService("org.freedesktop.DBus"); + + watcher.setWatchMode(QDBusServiceWatcher::WatchForUnregistration); + watcher.setWatchMode(QDBusServiceWatcher::WatchForOwnerChange); + + watcher.setWatchedServices(QStringList()); +} + +void tst_QDBusServiceWatcher::setConnection() +{ + // begin with a disconnected connection + QDBusConnection con(""); + QVERIFY(!con.isConnected()); + + QDBusServiceWatcher watcher(serviceName, con, QDBusServiceWatcher::WatchForRegistration); + + QSignalSpy spyR(&watcher, SIGNAL(serviceRegistered(QString))); + QSignalSpy spyU(&watcher, SIGNAL(serviceUnregistered(QString))); + QTestEventLoop::instance().connect(&watcher, SIGNAL(serviceOwnerChanged(QString,QString,QString)), SLOT(exitLoop())); + + // move to the session bus + con = QDBusConnection::sessionBus(); + QVERIFY(con.isConnected()); + watcher.setConnection(con); + + // register a name + QVERIFY(con.registerService(serviceName)); + + QTestEventLoop::instance().enterLoop(1); + QVERIFY(!QTestEventLoop::instance().timeout()); + + QCOMPARE(spyR.count(), 1); + QCOMPARE(spyR.at(0).at(0).toString(), serviceName); + QCOMPARE(spyU.count(), 0); + + // is the system bus available? + if (!QDBusConnection::systemBus().isConnected()) + return; + + // connect to the system bus and ask to watch that base service + QString watchedName = QDBusConnection::connectToBus(QDBusConnection::SystemBus, "system2").baseService(); + watcher.setWatchedServices(QStringList() << watchedName); + watcher.setWatchMode(QDBusServiceWatcher::WatchForUnregistration); + + // move to the system bus + watcher.setConnection(QDBusConnection::systemBus()); + spyR.clear(); + spyU.clear(); + + QDBusConnection::disconnectFromBus("system2"); + + QTestEventLoop::instance().enterLoop(1); + QVERIFY(!QTestEventLoop::instance().timeout()); + + QCOMPARE(spyR.count(), 0); + + QCOMPARE(spyU.count(), 1); + QCOMPARE(spyU.at(0).at(0).toString(), watchedName); +} + QTEST_MAIN(tst_QDBusServiceWatcher) #include "tst_qdbusservicewatcher.moc" diff --git a/tests/auto/dbus/qdbusxmlparser/tst_qdbusxmlparser.cpp b/tests/auto/dbus/qdbusxmlparser/tst_qdbusxmlparser.cpp index 4dbe0aae7d..c57292b7db 100644 --- a/tests/auto/dbus/qdbusxmlparser/tst_qdbusxmlparser.cpp +++ b/tests/auto/dbus/qdbusxmlparser/tst_qdbusxmlparser.cpp @@ -64,15 +64,10 @@ private slots: void properties(); }; -QT_BEGIN_NAMESPACE -// Avoid QHash randomization so that the order of the XML attributes is stable -extern Q_CORE_EXPORT QBasicAtomicInt qt_qhash_seed; // from qhash.cpp -QT_END_NAMESPACE - void tst_QDBusXmlParser::initTestCase() { // Always initialize the hash seed to 0 to get reliable test results - qt_qhash_seed.store(0); + qSetGlobalQHashSeed(0); } void tst_QDBusXmlParser::parsing_data() |