/* -*- C++ -*- * * Copyright (C) 2006 Trolltech AS. All rights reserved. * Author: Thiago Macieira * * Licensed under the Academic Free License version 2.1 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include const char introspectionData[] = "\n" "" "" "" "" "" "" "" "" "" "" "" "" "" ""; class MyObject: public QObject { Q_OBJECT public slots: void ping(const QDBusMessage &msg) { QDBusConnection con = QDBusConnection::addConnection(QDBusConnection::SessionBus); QDBusMessage reply = QDBusMessage::methodReply(msg); reply << static_cast >(msg); if (!con.send(reply)) exit(1); } void Introspect(const QDBusMessage &msg) { QDBusConnection con = QDBusConnection::addConnection(QDBusConnection::SessionBus); QDBusMessage reply = QDBusMessage::methodReply(msg); reply << ::introspectionData; if (!con.send(reply)) exit(1); } }; class tst_QDBusObject: public QObject { Q_OBJECT MyObject obj; private slots: void initTestCase(); // connect to D-Bus void cleanupTestCase(); // disconnect from D-Bus void construction_data(); void construction(); void introspection_data(); void introspection(); }; void tst_QDBusObject::initTestCase() { QDBusConnection con = QDBusConnection::addConnection(QDBusConnection::SessionBus); QVERIFY(con.isConnected()); QVERIFY(con.requestName("com.trolltech.tst_qdbusobject")); con.registerObject("/", "org.freedesktop.DBus.Introspectable", &obj); con.registerObject("/", "com.trolltech.tst_qdbusobject.MyObject", &obj); } void tst_QDBusObject::cleanupTestCase() { QDBusConnection::closeConnection(); QVERIFY(!QDBusConnection().isConnected()); } void tst_QDBusObject::construction_data() { QTest::addColumn("service"); QTest::addColumn("path"); QTest::addColumn("isValid"); QTest::addColumn("exists"); QTest::newRow("null") << QString() << QString() << false << false; QTest::newRow("invalid1") << "foo.foo1" << "" << false << false; QTest::newRow("invalid2") << "foo.foo1" << "foo.bar" << false << false; QTest::newRow("invalid3") << "foo.foo1" << "/foo.bar" << false << false; QTest::newRow("invalid4") << "" << "/" << false << false; QTest::newRow("invalid5") << "foo" << "/" << false << false; QTest::newRow("invalid6") << ".foo" << "/" << false << false; QTest::newRow("invalid7") << "org.freedesktop.DBus" << "" << false << false; QTest::newRow("invalid8") << "org.freedesktop.DBus" << "foo.bar" << false << false; QTest::newRow("invalid9") << "org.freedesktop.DBus" << "/foo.bar" << false << false; QTest::newRow("existing") << "org.freedesktop.DBus" << "/" << true << true; QTest::newRow("non-existing") << "org.freedesktop.DBus" << "/foo" << true << false; } void tst_QDBusObject::construction() { QDBusConnection con; // default QFETCH(QString, service); QFETCH(QString, path); QFETCH(bool, isValid); //QFETCH(bool, exists); QDBusObject o(con, service, path); QCOMPARE(o.isValid(), isValid); if (isValid) { QCOMPARE(o.service(), service); QCOMPARE(o.path(), path); } else { QVERIFY(o.service().isNull()); QVERIFY(o.path().isNull()); } //QCOMPARE(o.exists(), exists); } void tst_QDBusObject::introspection_data() { QTest::addColumn("service"); QTest::addColumn("path"); QTest::addColumn("interfaces"); QStringList interfaces; QTest::newRow("nowhere") << QString() << QString() << interfaces; // IMPORTANT! // Keep the interface list sorted! interfaces << "org.freedesktop.DBus" << DBUS_INTERFACE_INTROSPECTABLE; QTest::newRow("server") << "org.freedesktop.DBus" << "/" << interfaces; QDBusConnection con; interfaces.clear(); interfaces << "com.trolltech.tst_qdbusobject.MyObject" << DBUS_INTERFACE_INTROSPECTABLE; QTest::newRow("self1") << con.baseService() << "/" << interfaces; QTest::newRow("self2") << "com.trolltech.tst_qdbusobject" << "/" << interfaces; } void tst_QDBusObject::introspection() { QDBusConnection con; QFETCH(QString, service); QFETCH(QString, path); QDBusObject o(con, service, path); if (!o.isValid()) QVERIFY(o.introspect().isEmpty()); else { QFETCH(QStringList, interfaces); QStringList parsed = o.interfaces(); parsed.sort(); QCOMPARE(parsed.count(), interfaces.count()); QCOMPARE(parsed, interfaces); } } QTEST_MAIN(tst_QDBusObject) #include "tst_qdbusobject.moc"