diff options
| author | Linus Jahn <lnj@kaidan.im> | 2019-12-06 23:47:54 +0100 |
|---|---|---|
| committer | LNJ <lnj@kaidan.im> | 2019-12-08 23:08:44 +0100 |
| commit | d40b65c144a8f7042299bdcc387494ae01a60a46 (patch) | |
| tree | 8f261fc1ebd816145c080b130a208f33e3aa2087 | |
| parent | e286527c1974ac334811aee35f0fe33dcace44d5 (diff) | |
| download | qxmpp-d40b65c144a8f7042299bdcc387494ae01a60a46.tar.gz | |
Refactor QXmppPubSubIq and add missing tests
| -rw-r--r-- | src/base/QXmppConstants.cpp | 2 | ||||
| -rw-r--r-- | src/base/QXmppConstants_p.h | 2 | ||||
| -rw-r--r-- | src/base/QXmppPubSubIq.cpp | 49 | ||||
| -rw-r--r-- | tests/qxmpppubsubiq/tst_qxmpppubsubiq.cpp | 108 |
4 files changed, 133 insertions, 28 deletions
diff --git a/src/base/QXmppConstants.cpp b/src/base/QXmppConstants.cpp index a7073c4a..9fd3bc8f 100644 --- a/src/base/QXmppConstants.cpp +++ b/src/base/QXmppConstants.cpp @@ -57,6 +57,8 @@ const char* ns_private = "jabber:iq:private"; const char* ns_vcard = "vcard-temp"; // XEP-0059: Result Set Management const char* ns_rsm = "http://jabber.org/protocol/rsm"; +// XEP-0060: Publish-Subscribe +const char *ns_pubsub = "http://jabber.org/protocol/pubsub"; // XEP-0065: SOCKS5 Bytestreams const char* ns_bytestreams = "http://jabber.org/protocol/bytestreams"; // XEP-0066: Out of Band Data diff --git a/src/base/QXmppConstants_p.h b/src/base/QXmppConstants_p.h index c54daec7..2cf0a9ee 100644 --- a/src/base/QXmppConstants_p.h +++ b/src/base/QXmppConstants_p.h @@ -69,6 +69,8 @@ extern const char* ns_private; extern const char* ns_vcard; // XEP-0059: Result Set Management extern const char* ns_rsm; +// XEP-0060: Publish-Subscribe +extern const char *ns_pubsub; // XEP-0065: SOCKS5 Bytestreams extern const char* ns_bytestreams; // XEP-0066: Out of Band Data diff --git a/src/base/QXmppPubSubIq.cpp b/src/base/QXmppPubSubIq.cpp index 6dd485dd..5e742845 100644 --- a/src/base/QXmppPubSubIq.cpp +++ b/src/base/QXmppPubSubIq.cpp @@ -29,23 +29,23 @@ #include "QXmppConstants_p.h" #include "QXmppUtils.h" -static const char *ns_pubsub = "http://jabber.org/protocol/pubsub"; - -static const char *pubsub_queries[] = { - "affiliations", - "default", - "items", - "publish", - "retract", - "subscribe", - "subscription", - "subscriptions", - "unsubscribe", +static const QStringList PUBSUB_QUERIES = { + QStringLiteral("affiliations"), + QStringLiteral("default"), + QStringLiteral("items"), + QStringLiteral("publish"), + QStringLiteral("retract"), + QStringLiteral("subscribe"), + QStringLiteral("subscription"), + QStringLiteral("subscriptions"), + QStringLiteral("unsubscribe"), }; class QXmppPubSubIqPrivate : public QSharedData { public: + QXmppPubSubIqPrivate(); + QXmppPubSubIq::QueryType queryType; QString queryJid; QString queryNode; @@ -54,6 +54,11 @@ public: QString subscriptionType; }; +QXmppPubSubIqPrivate::QXmppPubSubIqPrivate() + : queryType(QXmppPubSubIq::ItemsQuery) +{ +} + QXmppPubSubIq::QXmppPubSubIq() : d(new QXmppPubSubIqPrivate) { @@ -148,8 +153,7 @@ void QXmppPubSubIq::setItems(const QList<QXmppPubSubItem> &items) /// \cond bool QXmppPubSubIq::isPubSubIq(const QDomElement &element) { - const QDomElement pubSubElement = element.firstChildElement("pubsub"); - return pubSubElement.namespaceURI() == ns_pubsub; + return element.firstChildElement("pubsub").namespaceURI() == ns_pubsub; } void QXmppPubSubIq::parseElementFromChild(const QDomElement &element) @@ -160,21 +164,16 @@ void QXmppPubSubIq::parseElementFromChild(const QDomElement &element) // determine query type const QString tagName = queryElement.tagName(); - for (int i = ItemsQuery; i <= SubscriptionsQuery; i++) - { - if (tagName == pubsub_queries[i]) - { - d->queryType = static_cast<QueryType>(i); - break; - } - } + int queryType = PUBSUB_QUERIES.indexOf(queryElement.tagName()); + if (queryType > -1) + d->queryType = QueryType(queryType); + d->queryJid = queryElement.attribute("jid"); d->queryNode = queryElement.attribute("node"); // parse contents QDomElement childElement; - switch (d->queryType) - { + switch (d->queryType) { case QXmppPubSubIq::ItemsQuery: case QXmppPubSubIq::PublishQuery: case QXmppPubSubIq::RetractQuery: @@ -202,7 +201,7 @@ void QXmppPubSubIq::toXmlElementFromChild(QXmlStreamWriter *writer) const writer->writeAttribute("xmlns", ns_pubsub); // write query type - writer->writeStartElement(pubsub_queries[d->queryType]); + writer->writeStartElement(PUBSUB_QUERIES.at(d->queryType)); helperToXmlAddAttribute(writer, "jid", d->queryJid); helperToXmlAddAttribute(writer, "node", d->queryNode); diff --git a/tests/qxmpppubsubiq/tst_qxmpppubsubiq.cpp b/tests/qxmpppubsubiq/tst_qxmpppubsubiq.cpp index 56c6814a..83f3ae41 100644 --- a/tests/qxmpppubsubiq/tst_qxmpppubsubiq.cpp +++ b/tests/qxmpppubsubiq/tst_qxmpppubsubiq.cpp @@ -37,6 +37,8 @@ private slots: void testSubscribe(); void testSubscription(); void testSubscriptions(); + void testIsPubSubIq_data(); + void testIsPubSubIq(); }; void tst_QXmppPubSubIq::testItems() @@ -62,6 +64,16 @@ void tst_QXmppPubSubIq::testItems() QCOMPARE(iq.queryJid(), QString()); QCOMPARE(iq.queryNode(), QLatin1String("storage:bookmarks")); serializePacket(iq, xml); + + iq = QXmppPubSubIq(); + iq.setId(QLatin1String("items1")); + iq.setTo(QLatin1String("pubsub.shakespeare.lit")); + iq.setFrom(QLatin1String("francisco@denmark.lit/barracks")); + iq.setType(QXmppIq::Get); + iq.setQueryType(QXmppPubSubIq::ItemsQuery); + iq.setQueryJid({}); + iq.setQueryNode(QLatin1String("storage:bookmarks")); + serializePacket(iq, xml); } void tst_QXmppPubSubIq::testItemsResponse() @@ -133,6 +145,41 @@ void tst_QXmppPubSubIq::testPublish() QCOMPARE(iq.queryType(), QXmppPubSubIq::PublishQuery); QCOMPARE(iq.queryJid(), QString()); QCOMPARE(iq.queryNode(), QLatin1String("storage:bookmarks")); + QCOMPARE(iq.items().first().contents().tagName(), QLatin1String("storage")); + serializePacket(iq, xml); + + // serialize using setters + + QXmppElement itemContentNick; + itemContentNick.setTagName(QStringLiteral("nick")); + itemContentNick.setValue(QStringLiteral("JC")); + + QXmppElement itemContentConference; + itemContentConference.setTagName(QStringLiteral("conference")); + itemContentConference.setAttribute(QStringLiteral("autojoin"), QStringLiteral("true")); + itemContentConference.setAttribute(QStringLiteral("jid"), QStringLiteral("theplay@conference.shakespeare.lit")); + itemContentConference.setAttribute(QStringLiteral("name"), QStringLiteral("The Play's the Thing")); + itemContentConference.appendChild(itemContentNick); + + QXmppElement itemContent; + itemContent.setTagName(QStringLiteral("storage")); + itemContent.setAttribute(QStringLiteral("xmlns"), QStringLiteral("storage:bookmarks")); + itemContent.appendChild(itemContentConference); + + QXmppPubSubItem item; + item.setId(QStringLiteral("current")); + item.setContents(itemContent); + + iq = QXmppPubSubIq(); + iq.setId(QLatin1String("items1")); + iq.setTo(QLatin1String("pubsub.shakespeare.lit")); + iq.setFrom(QLatin1String("francisco@denmark.lit/barracks")); + iq.setType(QXmppIq::Result); + iq.setQueryType(QXmppPubSubIq::PublishQuery); + iq.setQueryJid({}); + iq.setQueryNode(QLatin1String("storage:bookmarks")); + iq.setItems(QList<QXmppPubSubItem>() << item); + serializePacket(iq, xml); } @@ -161,7 +208,22 @@ void tst_QXmppPubSubIq::testRetractItem() QCOMPARE(iq.queryJid(), QString()); QCOMPARE(iq.queryNode(), QLatin1String("princely_musings")); QCOMPARE(iq.items().size(), 1); - QCOMPARE(iq.items().at(0).id(), QString("ae890ac52d0df67ed7cfdf51b644e901")); + QCOMPARE(iq.items().first().id(), QStringLiteral("ae890ac52d0df67ed7cfdf51b644e901")); + serializePacket(iq, xml); + + iq = QXmppPubSubIq(); + iq.setId(QLatin1String("retract1")); + iq.setTo(QLatin1String("pubsub.shakespeare.lit")); + iq.setFrom(QLatin1String("hamlet@denmark.lit/elsinore")); + iq.setType(QXmppIq::Set); + iq.setQueryType(QXmppPubSubIq::RetractQuery); + iq.setQueryJid({}); + iq.setQueryNode(QLatin1String("princely_musings")); + + QXmppPubSubItem item; + item.setId(QStringLiteral("ae890ac52d0df67ed7cfdf51b644e901")); + iq.setItems(QList<QXmppPubSubItem>() << item); + serializePacket(iq, xml); } @@ -201,8 +263,7 @@ void tst_QXmppPubSubIq::testSubscription() "<pubsub xmlns=\"http://jabber.org/protocol/pubsub\">" "<subscription jid=\"francisco@denmark.lit\"" " node=\"princely_musings\"" - " subid=\"ba49252aaa4f5d320c24d3766f0bdcade78c78d3\"" - " subscription=\"subscribed\"/>" + " subid=\"ba49252aaa4f5d320c24d3766f0bdcade78c78d3\"/>" "</pubsub>" "</iq>"); @@ -217,6 +278,17 @@ void tst_QXmppPubSubIq::testSubscription() QCOMPARE(iq.queryNode(), QLatin1String("princely_musings")); QCOMPARE(iq.subscriptionId(), QLatin1String("ba49252aaa4f5d320c24d3766f0bdcade78c78d3")); serializePacket(iq, xml); + + iq = QXmppPubSubIq(); + iq.setId(QLatin1String("sub1")); + iq.setTo(QLatin1String("francisco@denmark.lit/barracks")); + iq.setFrom(QLatin1String("pubsub.shakespeare.lit")); + iq.setType(QXmppIq::Result); + iq.setQueryType(QXmppPubSubIq::SubscriptionQuery); + iq.setQueryJid(QLatin1String("francisco@denmark.lit")); + iq.setQueryNode(QLatin1String("princely_musings")); + iq.setSubscriptionId(QLatin1String("ba49252aaa4f5d320c24d3766f0bdcade78c78d3")); + serializePacket(iq, xml); } void tst_QXmppPubSubIq::testSubscriptions() @@ -244,5 +316,35 @@ void tst_QXmppPubSubIq::testSubscriptions() serializePacket(iq, xml); } +void tst_QXmppPubSubIq::testIsPubSubIq_data() +{ + QTest::addColumn<QByteArray>("xml"); + QTest::addColumn<bool>("isValid"); + + QTest::newRow("valid-pubsub-iq") + << QByteArrayLiteral("<iq><pubsub xmlns=\"http://jabber.org/protocol/pubsub\"></pubsub></iq>") + << true; + + QTest::newRow("wrong-element") + << QByteArrayLiteral("<iq><pubsub2 xmlns=\"http://jabber.org/protocol/pubsub\"></pubsub2></iq>") + << false; + + QTest::newRow("wrong-namespace") + << QByteArrayLiteral("<iq><pubsub xmlns=\"urn:xmpp:pubsub2:0\"></pubsub></iq>") + << false; +} + +void tst_QXmppPubSubIq::testIsPubSubIq() +{ + QFETCH(QByteArray, xml); + QFETCH(bool, isValid); + + QDomDocument doc; + QCOMPARE(doc.setContent(xml, true), true); + QDomElement element = doc.documentElement(); + + QCOMPARE(QXmppPubSubIq::isPubSubIq(element), isValid); +} + QTEST_MAIN(tst_QXmppPubSubIq) #include "tst_qxmpppubsubiq.moc" |
