diff options
Diffstat (limited to 'test/qt/tst_qdbusobject.cpp')
-rw-r--r-- | test/qt/tst_qdbusobject.cpp | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/test/qt/tst_qdbusobject.cpp b/test/qt/tst_qdbusobject.cpp new file mode 100644 index 00000000..24d5077e --- /dev/null +++ b/test/qt/tst_qdbusobject.cpp @@ -0,0 +1,198 @@ +/* -*- C++ -*- + * + * Copyright (C) 2006 Trolltech AS. All rights reserved. + * Author: Thiago Macieira <thiago.macieira@trolltech.com> + * + * 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 <qcoreapplication.h> +#include <qmetatype.h> +#include <QtTest/QtTest> + +#include <dbus/qdbus.h> + +const char introspectionData[] = + "<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\n" + "\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n" + "<node>" + + "<interface name=\"org.freedesktop.DBus.Introspectable\">" + "<method name=\"Introspect\">" + "<arg name=\"data\" direction=\"out\" type=\"s\"/>" + "</method>" + "</interface>" + + "<interface name=\"com.trolltech.tst_qdbusobject.MyObject\">" + "<method name=\"ping\">" + "<arg name=\"ping\" direction=\"in\" type=\"v\"/>" + "<arg name=\"pong\" direction=\"out\" type=\"v\"/>" + "</method>" + "</interface>" + "<node name=\"subObject\"/>" + "</node>"; + +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<QList<QVariant> >(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<QString>("service"); + QTest::addColumn<QString>("path"); + QTest::addColumn<bool>("isValid"); + QTest::addColumn<bool>("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<QString>("service"); + QTest::addColumn<QString>("path"); + QTest::addColumn<QStringList>("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" + |