10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Copyright 2011 Google Inc. All Rights Reserved
20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <string>
50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
613b2d035e2e7f2f18e3a4d3377bc1a09f43a4ff9buildbot@webrtc.org#include "webrtc/libjingle/xmllite/qname.h"
713b2d035e2e7f2f18e3a4d3377bc1a09f43a4ff9buildbot@webrtc.org#include "webrtc/libjingle/xmllite/xmlelement.h"
80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/xmpp/constants.h"
90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/xmpp/fakexmppclient.h"
100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/xmpp/jid.h"
110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/xmpp/pubsubclient.h"
12cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/faketaskrunner.h"
13cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/gunit.h"
14cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/sigslot.h"
150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstruct HandledPubSubItem {
170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string itemid;
180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string payload;
190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass TestPubSubItemsListener : public sigslot::has_slots<> {
220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  TestPubSubItemsListener() : error_count(0) {}
240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void OnItems(buzz::PubSubClient*,
260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org               const std::vector<buzz::PubSubItem>& items) {
270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    for (std::vector<buzz::PubSubItem>::const_iterator item = items.begin();
280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org         item != items.end(); ++item) {
290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      HandledPubSubItem handled_item;
300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      handled_item.itemid = item->itemid;
310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      if (item->elem->FirstElement() != NULL) {
320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        handled_item.payload = item->elem->FirstElement()->Str();
330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      }
340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      this->items.push_back(handled_item);
350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void OnRequestError(buzz::PubSubClient* client,
390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                      const buzz::XmlElement* stanza) {
400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    error_count++;
410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void OnPublishResult(buzz::PubSubClient* client,
440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       const std::string& task_id,
450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       const buzz::XmlElement* item) {
460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    result_task_id = task_id;
470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void OnPublishError(buzz::PubSubClient* client,
500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                      const std::string& task_id,
510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                      const buzz::XmlElement* item,
520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                      const buzz::XmlElement* stanza) {
530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    error_count++;
540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    error_task_id = task_id;
550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void OnRetractResult(buzz::PubSubClient* client,
580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       const std::string& task_id) {
590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    result_task_id = task_id;
600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void OnRetractError(buzz::PubSubClient* client,
630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                      const std::string& task_id,
640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                      const buzz::XmlElement* stanza) {
650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    error_count++;
660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    error_task_id = task_id;
670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<HandledPubSubItem> items;
700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int error_count;
710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string error_task_id;
720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string result_task_id;
730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass PubSubClientTest : public testing::Test {
760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  PubSubClientTest() :
780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      pubsubjid("room@domain.com"),
790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      node("topic"),
800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      itemid("key") {
812a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    runner.reset(new rtc::FakeTaskRunner());
820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    xmpp_client = new buzz::FakeXmppClient(runner.get());
830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    client.reset(new buzz::PubSubClient(xmpp_client, pubsubjid, node));
840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    listener.reset(new TestPubSubItemsListener());
850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    client->SignalItems.connect(
860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        listener.get(), &TestPubSubItemsListener::OnItems);
870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    client->SignalRequestError.connect(
880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        listener.get(), &TestPubSubItemsListener::OnRequestError);
890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    client->SignalPublishResult.connect(
900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        listener.get(), &TestPubSubItemsListener::OnPublishResult);
910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    client->SignalPublishError.connect(
920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        listener.get(), &TestPubSubItemsListener::OnPublishError);
930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    client->SignalRetractResult.connect(
940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        listener.get(), &TestPubSubItemsListener::OnRetractResult);
950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    client->SignalRetractError.connect(
960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        listener.get(), &TestPubSubItemsListener::OnRetractError);
970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
992a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<rtc::FakeTaskRunner> runner;
1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // xmpp_client deleted by deleting runner.
1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  buzz::FakeXmppClient* xmpp_client;
1022a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<buzz::PubSubClient> client;
1032a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<TestPubSubItemsListener> listener;
1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  buzz::Jid pubsubjid;
1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string node;
1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string itemid;
1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PubSubClientTest, TestRequest) {
1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  client->RequestItems();
1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string expected_iq =
1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "<cli:iq type=\"get\" to=\"room@domain.com\" id=\"0\" "
1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        "xmlns:cli=\"jabber:client\">"
1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        "<pub:pubsub xmlns:pub=\"http://jabber.org/protocol/pubsub\">"
1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          "<pub:items node=\"topic\"/>"
1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        "</pub:pubsub>"
1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "</cli:iq>";
1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_EQ(1U, xmpp_client->sent_stanzas().size());
1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(expected_iq, xmpp_client->sent_stanzas()[0]->Str());
1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string result_iq =
1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "<iq xmlns='jabber:client' id='0' type='result' from='room@domain.com'>"
1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "  <pubsub xmlns='http://jabber.org/protocol/pubsub'>"
1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "    <items node='topic'>"
1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "      <item id='key0'>"
1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "        <value0a/>"
1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "      </item>"
1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "      <item id='key1'>"
1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "        <value1a/>"
1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "      </item>"
1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "    </items>"
1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "  </pubsub>"
1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "</iq>";
1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  xmpp_client->HandleStanza(buzz::XmlElement::ForStr(result_iq));
1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_EQ(2U, listener->items.size());
1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ("key0", listener->items[0].itemid);
1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ("<pub:value0a xmlns:pub=\"http://jabber.org/protocol/pubsub\"/>",
1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            listener->items[0].payload);
1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ("key1", listener->items[1].itemid);
1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ("<pub:value1a xmlns:pub=\"http://jabber.org/protocol/pubsub\"/>",
1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            listener->items[1].payload);
1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string items_message =
1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "<message xmlns='jabber:client' from='room@domain.com'>"
1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "  <event xmlns='http://jabber.org/protocol/pubsub#event'>"
1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "    <items node='topic'>"
1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "      <item id='key0'>"
1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "        <value0b/>"
1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "      </item>"
1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "      <item id='key1'>"
1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "        <value1b/>"
1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "      </item>"
1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "    </items>"
1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "  </event>"
1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "</message>";
1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  xmpp_client->HandleStanza(buzz::XmlElement::ForStr(items_message));
1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_EQ(4U, listener->items.size());
1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ("key0", listener->items[2].itemid);
1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ("<eve:value0b"
1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            " xmlns:eve=\"http://jabber.org/protocol/pubsub#event\"/>",
1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            listener->items[2].payload);
1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ("key1", listener->items[3].itemid);
1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ("<eve:value1b"
1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            " xmlns:eve=\"http://jabber.org/protocol/pubsub#event\"/>",
1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            listener->items[3].payload);
1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PubSubClientTest, TestRequestError) {
1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string result_iq =
1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "<iq xmlns='jabber:client' id='0' type='error' from='room@domain.com'>"
1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "  <error type='auth'>"
1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "    <forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>"
1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "  </error>"
1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "</iq>";
1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  client->RequestItems();
1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  xmpp_client->HandleStanza(buzz::XmlElement::ForStr(result_iq));
1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, listener->error_count);
1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PubSubClientTest, TestPublish) {
1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  buzz::XmlElement* payload =
1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      new buzz::XmlElement(buzz::QName(buzz::NS_PUBSUB, "value"));
1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string task_id;
1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  client->PublishItem(itemid, payload, &task_id);
1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string expected_iq =
1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "<cli:iq type=\"set\" to=\"room@domain.com\" id=\"0\" "
1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        "xmlns:cli=\"jabber:client\">"
1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        "<pubsub xmlns=\"http://jabber.org/protocol/pubsub\">"
1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          "<publish node=\"topic\">"
1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            "<item id=\"key\">"
1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org              "<value/>"
1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            "</item>"
2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          "</publish>"
2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        "</pubsub>"
2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "</cli:iq>";
2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_EQ(1U, xmpp_client->sent_stanzas().size());
2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(expected_iq, xmpp_client->sent_stanzas()[0]->Str());
2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string result_iq =
2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "<iq xmlns='jabber:client' id='0' type='result' from='room@domain.com'/>";
2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  xmpp_client->HandleStanza(buzz::XmlElement::ForStr(result_iq));
2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(task_id, listener->result_task_id);
2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PubSubClientTest, TestPublishError) {
2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  buzz::XmlElement* payload =
2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      new buzz::XmlElement(buzz::QName(buzz::NS_PUBSUB, "value"));
2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string task_id;
2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  client->PublishItem(itemid, payload, &task_id);
2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string result_iq =
2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "<iq xmlns='jabber:client' id='0' type='error' from='room@domain.com'>"
2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "  <error type='auth'>"
2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "    <forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>"
2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "  </error>"
2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "</iq>";
2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  xmpp_client->HandleStanza(buzz::XmlElement::ForStr(result_iq));
2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, listener->error_count);
2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(task_id, listener->error_task_id);
2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PubSubClientTest, TestRetract) {
2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string task_id;
2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  client->RetractItem(itemid, &task_id);
2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string expected_iq =
2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "<cli:iq type=\"set\" to=\"room@domain.com\" id=\"0\" "
2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        "xmlns:cli=\"jabber:client\">"
2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        "<pubsub xmlns=\"http://jabber.org/protocol/pubsub\">"
2410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          "<retract node=\"topic\" notify=\"true\">"
2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            "<item id=\"key\"/>"
2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          "</retract>"
2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        "</pubsub>"
2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "</cli:iq>";
2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_EQ(1U, xmpp_client->sent_stanzas().size());
2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(expected_iq, xmpp_client->sent_stanzas()[0]->Str());
2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string result_iq =
2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "<iq xmlns='jabber:client' id='0' type='result' from='room@domain.com'/>";
2520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  xmpp_client->HandleStanza(buzz::XmlElement::ForStr(result_iq));
2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(task_id, listener->result_task_id);
2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(PubSubClientTest, TestRetractError) {
2580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string task_id;
2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  client->RetractItem(itemid, &task_id);
2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string result_iq =
2620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "<iq xmlns='jabber:client' id='0' type='error' from='room@domain.com'>"
2630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "  <error type='auth'>"
2640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "    <forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>"
2650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "  </error>"
2660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "</iq>";
2670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  xmpp_client->HandleStanza(buzz::XmlElement::ForStr(result_iq));
2690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, listener->error_count);
2700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(task_id, listener->error_task_id);
2710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
272