summaryrefslogtreecommitdiff
path: root/qt4/tests/dbus/conn-basics.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qt4/tests/dbus/conn-basics.cpp')
-rw-r--r--qt4/tests/dbus/conn-basics.cpp302
1 files changed, 302 insertions, 0 deletions
diff --git a/qt4/tests/dbus/conn-basics.cpp b/qt4/tests/dbus/conn-basics.cpp
new file mode 100644
index 000000000..a5eac4576
--- /dev/null
+++ b/qt4/tests/dbus/conn-basics.cpp
@@ -0,0 +1,302 @@
+#include <QtCore/QDebug>
+#include <QtCore/QTimer>
+
+#include <QtDBus/QtDBus>
+
+#include <QtTest/QtTest>
+
+#define TP_QT4_ENABLE_LOWLEVEL_API
+
+#include <TelepathyQt4/ChannelFactory>
+#include <TelepathyQt4/Connection>
+#include <TelepathyQt4/ConnectionLowlevel>
+#include <TelepathyQt4/ContactFactory>
+#include <TelepathyQt4/PendingChannel>
+#include <TelepathyQt4/PendingReady>
+#include <TelepathyQt4/Debug>
+
+#include <telepathy-glib/dbus.h>
+#include <telepathy-glib/debug.h>
+
+#include <tests/lib/glib/contacts-conn.h>
+#include <tests/lib/test.h>
+
+using namespace Tp;
+
+class TestConnBasics : public Test
+{
+ Q_OBJECT
+
+public:
+ TestConnBasics(QObject *parent = 0)
+ : Test(parent), mConnService(0)
+ { }
+
+protected Q_SLOTS:
+ void expectConnReady(Tp::ConnectionStatus);
+ void expectConnInvalidated();
+ void expectPresenceAvailable(const Tp::SimplePresence &);
+ void onRequestConnectFinished(Tp::PendingOperation *);
+
+private Q_SLOTS:
+ void initTestCase();
+ void init();
+
+ void testBasics();
+ void testSimplePresence();
+
+ void cleanup();
+ void cleanupTestCase();
+
+private:
+ QString mConnName, mConnPath;
+ TpTestsContactsConnection *mConnService;
+ ConnectionPtr mConn;
+ QList<ConnectionStatus> mStatuses;
+};
+
+void TestConnBasics::expectConnReady(Tp::ConnectionStatus newStatus)
+{
+ qDebug() << "connection changed to status" << newStatus;
+ switch (newStatus) {
+ case ConnectionStatusDisconnected:
+ qWarning() << "Disconnected";
+ break;
+ case ConnectionStatusConnecting:
+ QCOMPARE(mConn->isReady(Connection::FeatureConnected), false);
+ mStatuses << newStatus;
+ qDebug() << "Connecting";
+ break;
+ case ConnectionStatusConnected:
+ QCOMPARE(mConn->isReady(Connection::FeatureConnected), true);
+ mStatuses << newStatus;
+ qDebug() << "Connected";
+ break;
+ default:
+ qWarning().nospace() << "What sort of status is "
+ << newStatus << "?!";
+ break;
+ }
+}
+
+void TestConnBasics::expectConnInvalidated()
+{
+ qDebug() << "conn invalidated";
+
+ mLoop->exit(0);
+}
+
+void TestConnBasics::expectPresenceAvailable(const Tp::SimplePresence &presence)
+{
+ if (presence.type == Tp::ConnectionPresenceTypeAvailable) {
+ mLoop->exit(0);
+ return;
+ }
+ mLoop->exit(1);
+}
+
+void TestConnBasics::onRequestConnectFinished(Tp::PendingOperation *op)
+{
+ QCOMPARE(mConn->status(), ConnectionStatusConnected);
+ QVERIFY(mStatuses.contains(ConnectionStatusConnected));
+ mLoop->exit(0);
+}
+
+void TestConnBasics::initTestCase()
+{
+ initTestCaseImpl();
+
+ g_type_init();
+ g_set_prgname("conn-basics");
+ tp_debug_set_flags("all");
+ dbus_g_bus_get(DBUS_BUS_STARTER, 0);
+}
+
+void TestConnBasics::init()
+{
+ initImpl();
+
+ gchar *name;
+ gchar *connPath;
+ GError *error = 0;
+
+ mConnService = TP_TESTS_CONTACTS_CONNECTION(g_object_new(
+ TP_TESTS_TYPE_CONTACTS_CONNECTION,
+ "account", "me@example.com",
+ "protocol", "contacts",
+ NULL));
+ QVERIFY(mConnService != 0);
+ QVERIFY(tp_base_connection_register(TP_BASE_CONNECTION(mConnService),
+ "contacts", &name, &connPath, &error));
+ QVERIFY(error == 0);
+
+ QVERIFY(name != 0);
+ QVERIFY(connPath != 0);
+
+ mConnName = QLatin1String(name);
+ mConnPath = QLatin1String(connPath);
+
+ g_free(name);
+ g_free(connPath);
+
+ mConn = Connection::create(mConnName, mConnPath,
+ ChannelFactory::create(QDBusConnection::sessionBus()),
+ ContactFactory::create());
+ QCOMPARE(mConn->isReady(), false);
+
+ QVERIFY(connect(mConn.data(),
+ SIGNAL(statusChanged(Tp::ConnectionStatus)),
+ SLOT(expectConnReady(Tp::ConnectionStatus))));
+
+ qDebug() << "waiting connection to become connected";
+ PendingOperation *pr = mConn->becomeReady(Connection::FeatureConnected);
+ QVERIFY(connect(pr,
+ SIGNAL(finished(Tp::PendingOperation*)),
+ SLOT(expectSuccessfulCall(Tp::PendingOperation*))));
+
+ PendingOperation *pc = mConn->lowlevel()->requestConnect();
+ QVERIFY(connect(pc,
+ SIGNAL(finished(Tp::PendingOperation*)),
+ SLOT(onRequestConnectFinished(Tp::PendingOperation*))));
+ QCOMPARE(mLoop->exec(), 0);
+ QCOMPARE(pr->isFinished(), true);
+ QCOMPARE(mLoop->exec(), 0);
+ QCOMPARE(pc->isFinished(), true);
+ QCOMPARE(mConn->isReady(Connection::FeatureConnected), true);
+ qDebug() << "connection is now ready";
+
+ QVERIFY(disconnect(mConn.data(),
+ SIGNAL(statusChanged(Tp::ConnectionStatus)),
+ this,
+ SLOT(expectConnReady(Tp::ConnectionStatus))));
+}
+
+void TestConnBasics::testBasics()
+{
+ QCOMPARE(static_cast<uint>(mConn->statusReason()),
+ static_cast<uint>(ConnectionStatusReasonRequested));
+}
+
+void TestConnBasics::testSimplePresence()
+{
+ qDebug() << "Making SimplePresence ready";
+
+ Features features = Features() << Connection::FeatureSimplePresence;
+ QCOMPARE(mConn->isReady(features), false);
+ QVERIFY(connect(mConn->becomeReady(features),
+ SIGNAL(finished(Tp::PendingOperation*)),
+ SLOT(expectSuccessfulCall(Tp::PendingOperation*))));
+ QCOMPARE(mLoop->exec(), 0);
+ QCOMPARE(mConn->isReady(features), true);
+
+ qDebug() << "SimplePresence ready";
+ qDebug() << "mConn->status:" << mConn->status();
+
+ const QStringList canSetNames = QStringList()
+ << QLatin1String("available")
+ << QLatin1String("busy")
+ << QLatin1String("away");
+
+ const QStringList cantSetNames = QStringList()
+ << QLatin1String("offline")
+ << QLatin1String("unknown")
+ << QLatin1String("error");
+
+ const QStringList expectedNames = canSetNames + cantSetNames;
+
+ const ConnectionPresenceType expectedTypes[] = {
+ ConnectionPresenceTypeAvailable,
+ ConnectionPresenceTypeBusy,
+ ConnectionPresenceTypeAway,
+ ConnectionPresenceTypeOffline,
+ ConnectionPresenceTypeUnknown,
+ ConnectionPresenceTypeError
+ };
+
+ SimpleStatusSpecMap statuses = mConn->lowlevel()->allowedPresenceStatuses();
+ Q_FOREACH (QString name, statuses.keys()) {
+ QVERIFY(expectedNames.contains(name));
+
+ if (canSetNames.contains(name)) {
+ QVERIFY(statuses[name].maySetOnSelf);
+ QVERIFY(statuses[name].canHaveMessage);
+ } else {
+ QVERIFY(cantSetNames.contains(name));
+ QVERIFY(!statuses[name].maySetOnSelf);
+ QVERIFY(!statuses[name].canHaveMessage);
+ }
+
+ QCOMPARE(statuses[name].type,
+ static_cast<uint>(expectedTypes[expectedNames.indexOf(name)]));
+ }
+
+ QCOMPARE(mConn->lowlevel()->maxPresenceStatusMessageLength(), (uint) 512);
+}
+
+void TestConnBasics::cleanup()
+{
+ if (mConn) {
+ QVERIFY(mConn->isValid());
+
+ GHashTable *details = tp_asv_new(
+ "debug-message", G_TYPE_STRING, "woo i'm going doooooown",
+ "x-tpqt4-test-rgba-herring-color", G_TYPE_UINT, 0xff0000ffU,
+ NULL
+ );
+
+ // Disconnect and wait for invalidation
+ tp_base_connection_disconnect_with_dbus_error(TP_BASE_CONNECTION(mConnService),
+ TELEPATHY_ERROR_CANCELLED,
+ details,
+ TP_CONNECTION_STATUS_REASON_REQUESTED);
+
+ g_hash_table_destroy(details);
+
+ QVERIFY(connect(mConn.data(),
+ SIGNAL(invalidated(Tp::DBusProxy *,
+ const QString &, const QString &)),
+ SLOT(expectConnInvalidated())));
+ QCOMPARE(mLoop->exec(), 0);
+ QVERIFY(!mConn->isValid());
+
+ // Check that we got the connection error details
+ QCOMPARE(static_cast<uint>(mConn->statusReason()),
+ static_cast<uint>(ConnectionStatusReasonRequested));
+
+ QVERIFY(mConn->errorDetails().isValid());
+
+ QVERIFY(mConn->errorDetails().hasDebugMessage());
+ QCOMPARE(mConn->errorDetails().debugMessage(), QLatin1String("woo i'm going doooooown"));
+
+#if 0
+ // Not yet there
+ QVERIFY(!mConn->errorDetails().hasExpectedHostname());
+ QVERIFY(!mConn->errorDetails().hasCertificateHostname());
+#endif
+
+ QVERIFY(mConn->errorDetails().allDetails().contains(
+ QLatin1String("x-tpqt4-test-rgba-herring-color")));
+ QCOMPARE(qdbus_cast<uint>(mConn->errorDetails().allDetails().value(
+ QLatin1String("x-tpqt4-test-rgba-herring-color"))),
+ 0xff0000ffU);
+
+ processDBusQueue(mConn.data());
+
+ mConn.reset();
+ }
+
+ if (mConnService != 0) {
+ g_object_unref(mConnService);
+ mConnService = 0;
+ }
+
+ cleanupImpl();
+}
+
+void TestConnBasics::cleanupTestCase()
+{
+ cleanupTestCaseImpl();
+}
+
+QTEST_MAIN(TestConnBasics)
+#include "_gen/conn-basics.cpp.moc.hpp"