/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** 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 class tst_QDBusServiceWatcher: public QObject { Q_OBJECT int testCounter; public: tst_QDBusServiceWatcher(); private slots: void initTestCase(); void watchForCreation_data(); void watchForCreation(); void watchForDisappearance_data(); void watchForDisappearance(); void watchForDisappearanceUniqueConnection(); void watchForOwnerChange_data(); void watchForOwnerChange(); void modeChange_data(); void modeChange(); void disconnectedConnection(); void setConnection_data(); void setConnection(); private: QString generateServiceName(); }; tst_QDBusServiceWatcher::tst_QDBusServiceWatcher() : testCounter(0) { } void tst_QDBusServiceWatcher::initTestCase() { QDBusConnection con = QDBusConnection::sessionBus(); QVERIFY(con.isConnected()); } QString tst_QDBusServiceWatcher::generateServiceName() { return "com.example.TestService" + QString::number(testCounter++); } void tst_QDBusServiceWatcher::watchForCreation_data() { QTest::addColumn("watchedName"); QTest::addColumn("registeredName"); //com.example.TestService5 matches com.example.TestService5 QString name = generateServiceName(); QTest::newRow("normal") << name << name; //com.example* matches com.example.TestService5 name = generateServiceName(); QTest::newRow("wildcard") << "com.example*" << name; //com.example.TestService5* matches com.example.TestService5 name = generateServiceName(); QTest::newRow("wildcard_exact") << name+"*" << name; //com.example.TestService5* matches com.example.TestService5.Foo name = generateServiceName(); QTest::newRow("wildcard_subdomain") << name+"*" << name + ".Foo"; //com.example.TestService5* matches com.example.TestService5.Foo.Bar name = generateServiceName(); QTest::newRow("wildcard_subsubdomain") << name+"*" << name + ".Foo.Bar"; } void tst_QDBusServiceWatcher::watchForCreation() { QFETCH(QString, watchedName); QFETCH(QString, registeredName); QDBusConnection con = QDBusConnection::sessionBus(); QVERIFY(con.isConnected()); QDBusServiceWatcher watcher(watchedName, con, QDBusServiceWatcher::WatchForRegistration); 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(serviceRegistered(QString)), SLOT(exitLoop())); // register a name QVERIFY(con.registerService(registeredName)); QTestEventLoop::instance().enterLoop(1); QVERIFY(!QTestEventLoop::instance().timeout()); QCOMPARE(spyR.count(), 1); QCOMPARE(spyR.at(0).at(0).toString(), registeredName); QCOMPARE(spyU.count(), 0); QCOMPARE(spyO.count(), 1); QCOMPARE(spyO.at(0).at(0).toString(), registeredName); QVERIFY(spyO.at(0).at(1).toString().isEmpty()); QCOMPARE(spyO.at(0).at(2).toString(), con.baseService()); spyR.clear(); spyU.clear(); spyO.clear(); // unregister it: con.unregisterService(registeredName); // and register again QVERIFY(con.registerService(registeredName)); QTestEventLoop::instance().enterLoop(1); QVERIFY(!QTestEventLoop::instance().timeout()); QCOMPARE(spyR.count(), 1); QCOMPARE(spyR.at(0).at(0).toString(), registeredName); QCOMPARE(spyU.count(), 0); QCOMPARE(spyO.count(), 1); QCOMPARE(spyO.at(0).at(0).toString(), registeredName); QVERIFY(spyO.at(0).at(1).toString().isEmpty()); QCOMPARE(spyO.at(0).at(2).toString(), con.baseService()); } void tst_QDBusServiceWatcher::watchForDisappearance_data() { tst_QDBusServiceWatcher::watchForCreation_data(); } void tst_QDBusServiceWatcher::watchForDisappearance() { QFETCH(QString, watchedName); QFETCH(QString, registeredName); QDBusConnection con = QDBusConnection::sessionBus(); QVERIFY(con.isConnected()); 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())); // register a name QVERIFY(con.registerService(registeredName)); // unregister it: con.unregisterService(registeredName); QTestEventLoop::instance().enterLoop(1); QVERIFY(!QTestEventLoop::instance().timeout()); QCOMPARE(spyR.count(), 0); QCOMPARE(spyU.count(), 1); QCOMPARE(spyU.at(0).at(0).toString(), registeredName); QCOMPARE(spyO.count(), 1); QCOMPARE(spyO.at(0).at(0).toString(), registeredName); QCOMPARE(spyO.at(0).at(1).toString(), con.baseService()); 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_data() { watchForCreation_data(); } void tst_QDBusServiceWatcher::watchForOwnerChange() { QFETCH(QString, watchedName); QFETCH(QString, registeredName); QDBusConnection con = QDBusConnection::sessionBus(); QVERIFY(con.isConnected()); QDBusServiceWatcher watcher(watchedName, con, QDBusServiceWatcher::WatchForOwnerChange); 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(serviceRegistered(QString)), SLOT(exitLoop())); // register a name QVERIFY(con.registerService(registeredName)); QTestEventLoop::instance().enterLoop(1); QVERIFY(!QTestEventLoop::instance().timeout()); QCOMPARE(spyR.count(), 1); QCOMPARE(spyR.at(0).at(0).toString(), registeredName); QCOMPARE(spyU.count(), 0); QCOMPARE(spyO.count(), 1); QCOMPARE(spyO.at(0).at(0).toString(), registeredName); QVERIFY(spyO.at(0).at(1).toString().isEmpty()); QCOMPARE(spyO.at(0).at(2).toString(), con.baseService()); spyR.clear(); spyU.clear(); spyO.clear(); // unregister it: con.unregisterService(registeredName); // and register again QVERIFY(con.registerService(registeredName)); QTestEventLoop::instance().enterLoop(1); QVERIFY(!QTestEventLoop::instance().timeout()); QCOMPARE(spyR.count(), 1); QCOMPARE(spyR.at(0).at(0).toString(), registeredName); QCOMPARE(spyU.count(), 1); QCOMPARE(spyU.at(0).at(0).toString(), registeredName); QCOMPARE(spyO.count(), 2); QCOMPARE(spyO.at(0).at(0).toString(), registeredName); QCOMPARE(spyO.at(0).at(1).toString(), con.baseService()); QVERIFY(spyO.at(0).at(2).toString().isEmpty()); QCOMPARE(spyO.at(1).at(0).toString(), registeredName); QVERIFY(spyO.at(1).at(1).toString().isEmpty()); QCOMPARE(spyO.at(1).at(2).toString(), con.baseService()); } void tst_QDBusServiceWatcher::modeChange_data() { watchForCreation_data(); } void tst_QDBusServiceWatcher::modeChange() { QFETCH(QString, watchedName); QFETCH(QString, registeredName); QDBusConnection con = QDBusConnection::sessionBus(); QVERIFY(con.isConnected()); QDBusServiceWatcher watcher(watchedName, con, QDBusServiceWatcher::WatchForRegistration); 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(serviceRegistered(QString)), SLOT(exitLoop())); // register a name QVERIFY(con.registerService(registeredName)); QTestEventLoop::instance().enterLoop(1); QVERIFY(!QTestEventLoop::instance().timeout()); QCOMPARE(spyR.count(), 1); QCOMPARE(spyR.at(0).at(0).toString(), registeredName); QCOMPARE(spyU.count(), 0); QCOMPARE(spyO.count(), 1); QCOMPARE(spyO.at(0).at(0).toString(), registeredName); QVERIFY(spyO.at(0).at(1).toString().isEmpty()); QCOMPARE(spyO.at(0).at(2).toString(), con.baseService()); spyR.clear(); spyU.clear(); spyO.clear(); watcher.setWatchMode(QDBusServiceWatcher::WatchForUnregistration); // unregister it: con.unregisterService(registeredName); QTestEventLoop::instance().connect(&watcher, SIGNAL(serviceUnregistered(QString)), SLOT(exitLoop())); QTestEventLoop::instance().enterLoop(1); QVERIFY(!QTestEventLoop::instance().timeout()); QCOMPARE(spyR.count(), 0); QCOMPARE(spyU.count(), 1); QCOMPARE(spyU.at(0).at(0).toString(), registeredName); QCOMPARE(spyO.count(), 1); QCOMPARE(spyO.at(0).at(0).toString(), registeredName); QCOMPARE(spyO.at(0).at(1).toString(), con.baseService()); QVERIFY(spyO.at(0).at(2).toString().isEmpty()); } void tst_QDBusServiceWatcher::disconnectedConnection() { QDBusConnection con(""); QVERIFY(!con.isConnected()); QDBusServiceWatcher watcher(generateServiceName(), 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_data() { QTest::addColumn("serviceName"); QTest::newRow("normal") << generateServiceName(); } void tst_QDBusServiceWatcher::setConnection() { QFETCH(QString, serviceName); // 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"