summaryrefslogtreecommitdiff
path: root/qt4/tests/channel-class-spec.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qt4/tests/channel-class-spec.cpp')
-rw-r--r--qt4/tests/channel-class-spec.cpp153
1 files changed, 153 insertions, 0 deletions
diff --git a/qt4/tests/channel-class-spec.cpp b/qt4/tests/channel-class-spec.cpp
new file mode 100644
index 000000000..9fb6cffc2
--- /dev/null
+++ b/qt4/tests/channel-class-spec.cpp
@@ -0,0 +1,153 @@
+#include <QtTest/QtTest>
+
+#include <TelepathyQt4/Constants>
+#include <TelepathyQt4/Debug>
+#include <TelepathyQt4/ChannelClassSpec>
+#include <TelepathyQt4/Types>
+
+using namespace Tp;
+
+namespace {
+
+ChannelClassSpecList reverse(const ChannelClassSpecList &list)
+{
+ ChannelClassSpecList ret(list);
+ for (int k = 0; k < (list.size() / 2); k++) {
+ ret.swap(k, list.size() - (1 + k));
+ }
+ return ret;
+}
+
+};
+
+class TestChannelClassSpec : public QObject
+{
+ Q_OBJECT
+
+public:
+ TestChannelClassSpec(QObject *parent = 0);
+
+private Q_SLOTS:
+ void testChannelClassSpecHash();
+ void testServiceLeaks();
+};
+
+TestChannelClassSpec::TestChannelClassSpec(QObject *parent)
+ : QObject(parent)
+{
+ Tp::enableDebug(true);
+ Tp::enableWarnings(true);
+}
+
+void TestChannelClassSpec::testChannelClassSpecHash()
+{
+ ChannelClassSpec st1 = ChannelClassSpec::textChat();
+ ChannelClassSpec st2 = ChannelClassSpec::textChat();
+ ChannelClassSpec ssm1 = ChannelClassSpec::streamedMediaCall();
+ ChannelClassSpec ssm2 = ChannelClassSpec::streamedMediaCall();
+
+ QCOMPARE(qHash(st1), qHash(st2));
+ QCOMPARE(qHash(ssm1), qHash(ssm2));
+ QVERIFY(qHash(st1) != qHash(ssm1));
+
+ // hash of list with duplicated elements should be the same as hash of the list of same items
+ // but with no duplicates
+ ChannelClassSpecList sl1;
+ sl1 << st1 << st2;
+ ChannelClassSpecList sl2;
+ sl2 << st1;
+ QCOMPARE(qHash(sl1), qHash(sl2));
+
+ // hash of list with same elements but different order should be the same
+ sl1.clear();
+ sl2.clear();
+ sl1 << st1 << ssm1;
+ sl2 << ssm1 << st1;
+ QCOMPARE(qHash(sl1), qHash(sl2));
+
+ // still the same but with duplicated elements
+ sl2 << ssm2 << st2;
+ QCOMPARE(qHash(sl1), qHash(sl2));
+ sl1 << st2;
+ QCOMPARE(qHash(sl1), qHash(sl2));
+
+ // now sl2 is different from sl1, hash should be different
+ sl2 << ChannelClassSpec::unnamedTextChat();
+ QVERIFY(qHash(sl1) != qHash(sl2));
+
+ // same again
+ sl1.prepend(ChannelClassSpec::unnamedTextChat());
+ QCOMPARE(qHash(sl1), qHash(sl2));
+
+ sl1.clear();
+ sl2.clear();
+
+ for (int i = 0; i < 100; ++i) {
+ sl1 << ChannelClassSpec::textChat() <<
+ ChannelClassSpec::streamedMediaCall() <<
+ ChannelClassSpec::unnamedTextChat();
+ }
+
+ ChannelClassSpec specs[3] = {
+ ChannelClassSpec::textChat(),
+ ChannelClassSpec::streamedMediaCall(),
+ ChannelClassSpec::unnamedTextChat()
+ };
+ for (int i = 0; i < 3; ++i) {
+ ChannelClassSpec spec = specs[i];
+ for (int j = 0; j < 100; ++j) {
+ sl2 << spec;
+ }
+ }
+
+ QCOMPARE(qHash(sl1), qHash(ChannelClassSpecList() <<
+ ChannelClassSpec::unnamedTextChat() <<
+ ChannelClassSpec::streamedMediaCall() <<
+ ChannelClassSpec::textChat()));
+
+ for (int i = 0; i < 1000; ++i) {
+ ChannelClassSpec spec = ChannelClassSpec::outgoingStreamTube(QString::number(i));
+ sl1 << spec;
+ sl2.prepend(spec);
+ }
+
+ QCOMPARE(qHash(sl1), qHash(sl2));
+
+ sl1 = reverse(sl1);
+ sl2 = reverse(sl2);
+ QCOMPARE(qHash(sl1), qHash(sl2));
+
+ sl2 << ChannelClassSpec::outgoingFileTransfer();
+ QVERIFY(qHash(sl1) != qHash(sl2));
+}
+
+void TestChannelClassSpec::testServiceLeaks()
+{
+ ChannelClassSpec bareTube = ChannelClassSpec::outgoingStreamTube();
+ QVERIFY(!bareTube.allProperties().contains(TP_QT4_IFACE_CHANNEL_TYPE_STREAM_TUBE +
+ QString::fromLatin1(".Service")));
+
+ ChannelClassSpec ftpTube = ChannelClassSpec::outgoingStreamTube(QLatin1String("ftp"));
+ QVERIFY(ftpTube.allProperties().contains(TP_QT4_IFACE_CHANNEL_TYPE_STREAM_TUBE +
+ QString::fromLatin1(".Service")));
+ QCOMPARE(ftpTube.allProperties().value(TP_QT4_IFACE_CHANNEL_TYPE_STREAM_TUBE +
+ QString::fromLatin1(".Service")).toString(), QString::fromLatin1("ftp"));
+ QVERIFY(!bareTube.allProperties().contains(TP_QT4_IFACE_CHANNEL_TYPE_STREAM_TUBE +
+ QString::fromLatin1(".Service")));
+
+ ChannelClassSpec httpTube = ChannelClassSpec::outgoingStreamTube(QLatin1String("http"));
+ QVERIFY(httpTube.allProperties().contains(TP_QT4_IFACE_CHANNEL_TYPE_STREAM_TUBE +
+ QString::fromLatin1(".Service")));
+ QVERIFY(ftpTube.allProperties().contains(TP_QT4_IFACE_CHANNEL_TYPE_STREAM_TUBE +
+ QString::fromLatin1(".Service")));
+ QCOMPARE(httpTube.allProperties().value(TP_QT4_IFACE_CHANNEL_TYPE_STREAM_TUBE +
+ QString::fromLatin1(".Service")).toString(), QString::fromLatin1("http"));
+ QCOMPARE(ftpTube.allProperties().value(TP_QT4_IFACE_CHANNEL_TYPE_STREAM_TUBE +
+ QString::fromLatin1(".Service")).toString(), QString::fromLatin1("ftp"));
+ QVERIFY(!bareTube.allProperties().contains(TP_QT4_IFACE_CHANNEL_TYPE_STREAM_TUBE +
+ QString::fromLatin1(".Service")));
+}
+
+QTEST_MAIN(TestChannelClassSpec)
+
+#include "_gen/channel-class-spec.cpp.moc.hpp"