summaryrefslogtreecommitdiff
path: root/qt4/tests/dbus/chan-conference.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qt4/tests/dbus/chan-conference.cpp')
-rw-r--r--qt4/tests/dbus/chan-conference.cpp288
1 files changed, 288 insertions, 0 deletions
diff --git a/qt4/tests/dbus/chan-conference.cpp b/qt4/tests/dbus/chan-conference.cpp
new file mode 100644
index 000000000..4e1ac7559
--- /dev/null
+++ b/qt4/tests/dbus/chan-conference.cpp
@@ -0,0 +1,288 @@
+#include <tests/lib/test.h>
+
+#include <tests/lib/glib-helpers/test-conn-helper.h>
+
+#include <tests/lib/glib/echo/chan.h>
+#include <tests/lib/glib/echo/conn.h>
+#include <tests/lib/glib/future/conference/chan.h>
+
+#include <TelepathyQt4/Connection>
+#include <TelepathyQt4/PendingReady>
+
+#include <telepathy-glib/debug.h>
+
+using namespace Tp;
+
+class TestConferenceChan : public Test
+{
+ Q_OBJECT
+
+public:
+ TestConferenceChan(QObject *parent = 0)
+ : Test(parent),
+ mConn(0), mContactRepo(0),
+ mTextChan1Service(0), mTextChan2Service(0), mConferenceChanService(0)
+ { }
+
+protected Q_SLOTS:
+ void onConferenceChannelMerged(const Tp::ChannelPtr &);
+ void onConferenceChannelRemoved(const Tp::ChannelPtr &channel,
+ const Tp::Channel::GroupMemberChangeDetails &details);
+
+private Q_SLOTS:
+ void initTestCase();
+ void init();
+
+ void testConference();
+
+ void cleanup();
+ void cleanupTestCase();
+
+private:
+ TestConnHelper *mConn;
+ TpHandleRepoIface *mContactRepo;
+
+ ChannelPtr mChan;
+ QString mTextChan1Path;
+ ExampleEchoChannel *mTextChan1Service;
+ QString mTextChan2Path;
+ ExampleEchoChannel *mTextChan2Service;
+ QString mTextChan3Path;
+ ExampleEchoChannel *mTextChan3Service;
+ QString mConferenceChanPath;
+ TpTestsConferenceChannel *mConferenceChanService;
+
+ ChannelPtr mChannelMerged;
+ ChannelPtr mChannelRemovedDetailed;
+ Channel::GroupMemberChangeDetails mChannelRemovedDetailedDetails;
+};
+
+void TestConferenceChan::onConferenceChannelMerged(const Tp::ChannelPtr &channel)
+{
+ mChannelMerged = channel;
+ mLoop->exit(0);
+}
+
+void TestConferenceChan::onConferenceChannelRemoved(const Tp::ChannelPtr &channel,
+ const Tp::Channel::GroupMemberChangeDetails &details)
+{
+ mChannelRemovedDetailed = channel;
+ mChannelRemovedDetailedDetails = details;
+ mLoop->exit(0);
+}
+
+void TestConferenceChan::initTestCase()
+{
+ initTestCaseImpl();
+
+ g_type_init();
+ g_set_prgname("chan-conference");
+ tp_debug_set_flags("all");
+ dbus_g_bus_get(DBUS_BUS_STARTER, 0);
+
+ mConn = new TestConnHelper(this,
+ EXAMPLE_TYPE_ECHO_CONNECTION,
+ "account", "me@example.com",
+ "protocol", "example",
+ NULL);
+ QCOMPARE(mConn->connect(), true);
+
+ // create a Channel by magic, rather than doing D-Bus round-trips for it
+ mContactRepo = tp_base_connection_get_handles(TP_BASE_CONNECTION(mConn->service()),
+ TP_HANDLE_TYPE_CONTACT);
+ guint handle1 = tp_handle_ensure(mContactRepo, "someone1@localhost", 0, 0);
+ guint handle2 = tp_handle_ensure(mContactRepo, "someone2@localhost", 0, 0);
+ guint handle3 = tp_handle_ensure(mContactRepo, "someone3@localhost", 0, 0);
+
+ QByteArray chanPath;
+ GPtrArray *initialChannels = g_ptr_array_new();
+
+ mTextChan1Path = mConn->objectPath() + QLatin1String("/TextChannel/1");
+ chanPath = mTextChan1Path.toAscii();
+ mTextChan1Service = EXAMPLE_ECHO_CHANNEL(g_object_new(
+ EXAMPLE_TYPE_ECHO_CHANNEL,
+ "connection", mConn->service(),
+ "object-path", chanPath.data(),
+ "handle", handle1,
+ NULL));
+ g_ptr_array_add(initialChannels, g_strdup(chanPath.data()));
+
+ mTextChan2Path = mConn->objectPath() + QLatin1String("/TextChannel/2");
+ chanPath = mTextChan2Path.toAscii();
+ mTextChan2Service = EXAMPLE_ECHO_CHANNEL(g_object_new(
+ EXAMPLE_TYPE_ECHO_CHANNEL,
+ "connection", mConn->service(),
+ "object-path", chanPath.data(),
+ "handle", handle2,
+ NULL));
+ g_ptr_array_add(initialChannels, g_strdup(chanPath.data()));
+
+ // let's not add this one to initial channels
+ mTextChan3Path = mConn->objectPath() + QLatin1String("/TextChannel/3");
+ chanPath = mTextChan3Path.toAscii();
+ mTextChan3Service = EXAMPLE_ECHO_CHANNEL(g_object_new(
+ EXAMPLE_TYPE_ECHO_CHANNEL,
+ "connection", mConn->service(),
+ "object-path", chanPath.data(),
+ "handle", handle3,
+ NULL));
+
+ mConferenceChanPath = mConn->objectPath() + QLatin1String("/ConferenceChannel");
+ chanPath = mConferenceChanPath.toAscii();
+ mConferenceChanService = TP_TESTS_CONFERENCE_CHANNEL(g_object_new(
+ TP_TESTS_TYPE_CONFERENCE_CHANNEL,
+ "connection", mConn->service(),
+ "object-path", chanPath.data(),
+ "initial-channels", initialChannels,
+ NULL));
+
+ tp_handle_unref(mContactRepo, handle1);
+ tp_handle_unref(mContactRepo, handle2);
+ tp_handle_unref(mContactRepo, handle3);
+
+ g_ptr_array_foreach(initialChannels, (GFunc) g_free, NULL);
+ g_ptr_array_free(initialChannels, TRUE);
+}
+
+void TestConferenceChan::init()
+{
+ initImpl();
+}
+
+void TestConferenceChan::testConference()
+{
+ mChan = Channel::create(mConn->client(), mConferenceChanPath, QVariantMap());
+ QCOMPARE(mChan->isConference(), false);
+ QVERIFY(mChan->conferenceInitialInviteeContacts().isEmpty());
+ QVERIFY(mChan->conferenceChannels().isEmpty());
+ QVERIFY(mChan->conferenceInitialChannels().isEmpty());
+ QVERIFY(mChan->conferenceOriginalChannels().isEmpty());
+ QCOMPARE(mChan->supportsConferenceMerging(), false);
+ QCOMPARE(mChan->supportsConferenceSplitting(), false);
+
+ QVERIFY(connect(mChan->becomeReady(),
+ SIGNAL(finished(Tp::PendingOperation*)),
+ SLOT(expectSuccessfulCall(Tp::PendingOperation*))));
+ QCOMPARE(mLoop->exec(), 0);
+ QCOMPARE(mChan->isReady(), true);
+
+ QStringList expectedObjectPaths;
+ expectedObjectPaths << mTextChan1Path << mTextChan2Path;
+
+ QStringList objectPaths;
+ Q_FOREACH (const ChannelPtr &channel, mChan->conferenceInitialChannels()) {
+ objectPaths << channel->objectPath();
+ }
+ QCOMPARE(expectedObjectPaths, objectPaths);
+
+ objectPaths.clear();
+ Q_FOREACH (const ChannelPtr &channel, mChan->conferenceChannels()) {
+ objectPaths << channel->objectPath();
+ }
+ QCOMPARE(expectedObjectPaths, objectPaths);
+
+ /*
+ // TODO - Properly check for initial invitee contacts if/when a test CM supports it
+ QVERIFY(!mChan->isReady(Channel::FeatureConferenceInitialInviteeContacts));
+ QCOMPARE(mChan->conferenceInitialInviteeContacts(), Contacts());
+
+ QVERIFY(connect(mChan->becomeReady(Channel::FeatureConferenceInitialInviteeContacts),
+ SIGNAL(finished(Tp::PendingOperation*)),
+ SLOT(expectSuccessfulCall(Tp::PendingOperation*))));
+ QCOMPARE(mLoop->exec(), 0);
+ QCOMPARE(mChan->isReady(Channel::FeatureConferenceInitialInviteeContacts), true);
+
+ QCOMPARE(mChan->conferenceInitialInviteeContacts(), Contacts());
+ */
+
+ QCOMPARE(mChan->supportsConferenceMerging(), true);
+ QCOMPARE(mChan->supportsConferenceSplitting(), false);
+ QVERIFY(connect(mChan->conferenceSplitChannel(),
+ SIGNAL(finished(Tp::PendingOperation*)),
+ SLOT(expectFailure(Tp::PendingOperation*))));
+ QCOMPARE(mLoop->exec(), 0);
+ QCOMPARE(mLastError, TP_QT4_ERROR_NOT_IMPLEMENTED);
+ QVERIFY(!mLastErrorMessage.isEmpty());
+
+ ChannelPtr otherChannel = Channel::create(mConn->client(), mTextChan3Path, QVariantMap());
+
+ QVERIFY(connect(mChan.data(),
+ SIGNAL(conferenceChannelMerged(const Tp::ChannelPtr &)),
+ SLOT(onConferenceChannelMerged(const Tp::ChannelPtr &))));
+ QVERIFY(connect(mChan->conferenceMergeChannel(otherChannel),
+ SIGNAL(finished(Tp::PendingOperation*)),
+ SLOT(expectSuccessfulCall(Tp::PendingOperation*))));
+ QCOMPARE(mLoop->exec(), 0);
+ QCOMPARE(mChan->isReady(), true);
+ while (!mChannelMerged) {
+ QCOMPARE(mLoop->exec(), 0);
+ }
+
+ QCOMPARE(mChannelMerged->objectPath(), otherChannel->objectPath());
+
+ expectedObjectPaths << mTextChan3Path;
+ objectPaths.clear();
+ Q_FOREACH (const ChannelPtr &channel, mChan->conferenceChannels()) {
+ objectPaths << channel->objectPath();
+ }
+ QCOMPARE(expectedObjectPaths, objectPaths);
+
+ QVERIFY(connect(mChan.data(),
+ SIGNAL(conferenceChannelRemoved(const Tp::ChannelPtr &,
+ const Tp::Channel::GroupMemberChangeDetails &)),
+ SLOT(onConferenceChannelRemoved(const Tp::ChannelPtr &,
+ const Tp::Channel::GroupMemberChangeDetails &))));
+ tp_tests_conference_channel_remove_channel (mConferenceChanService,
+ mChannelMerged->objectPath().toAscii().data());
+ while (!mChannelRemovedDetailed) {
+ QCOMPARE(mLoop->exec(), 0);
+ }
+ QCOMPARE(mChannelRemovedDetailed, mChannelMerged);
+ QCOMPARE(mChannelRemovedDetailedDetails.allDetails().isEmpty(), false);
+ QCOMPARE(qdbus_cast<int>(mChannelRemovedDetailedDetails.allDetails().value(
+ QLatin1String("domain-specific-detail-uint"))), 3);
+ QCOMPARE(mChannelRemovedDetailedDetails.hasActor(), true);
+ QCOMPARE(mChannelRemovedDetailedDetails.actor(), mChan->groupSelfContact());
+
+ expectedObjectPaths.clear();
+ expectedObjectPaths << mTextChan1Path << mTextChan2Path;
+ objectPaths.clear();
+ Q_FOREACH (const ChannelPtr &channel, mChan->conferenceChannels()) {
+ objectPaths << channel->objectPath();
+ }
+ QCOMPARE(expectedObjectPaths, objectPaths);
+
+ mChan.reset();
+ mChannelMerged.reset();
+}
+
+void TestConferenceChan::cleanup()
+{
+ cleanupImpl();
+}
+
+void TestConferenceChan::cleanupTestCase()
+{
+ QCOMPARE(mConn->disconnect(), true);
+ delete mConn;
+
+ if (mTextChan1Service != 0) {
+ g_object_unref(mTextChan1Service);
+ mTextChan1Service = 0;
+ }
+
+ if (mTextChan2Service != 0) {
+ g_object_unref(mTextChan2Service);
+ mTextChan2Service = 0;
+ }
+
+ if (mConferenceChanService != 0) {
+ g_object_unref(mConferenceChanService);
+ mConferenceChanService = 0;
+ }
+
+ cleanupTestCaseImpl();
+}
+
+QTEST_MAIN(TestConferenceChan)
+#include "_gen/chan-conference.cpp.moc.hpp"