15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Copyright 2011 Google Inc. All Rights Reserved
25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <string>
55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/faketaskrunner.h"
75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/gunit.h"
85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/sigslot.h"
95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmllite/qname.h"
105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmllite/xmlelement.h"
115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmpp/constants.h"
125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmpp/iqtask.h"
135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmpp/fakexmppclient.h"
145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmpp/jid.h"
155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmpp/pubsubtasks.h"
165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgstruct HandledPubSubItem {
185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string itemid;
195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string payload;
205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass TestPubSubTasksListener : public sigslot::has_slots<> {
235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  TestPubSubTasksListener() : result_count(0), error_count(0) {}
255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnReceiveUpdate(buzz::PubSubReceiveTask* task,
275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                       const std::vector<buzz::PubSubItem>& items) {
285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    OnItems(items);
295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnRequestResult(buzz::PubSubRequestTask* task,
325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                       const std::vector<buzz::PubSubItem>& items) {
335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    OnItems(items);
345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnItems(const std::vector<buzz::PubSubItem>& items) {
375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    for (std::vector<buzz::PubSubItem>::const_iterator item = items.begin();
385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org         item != items.end(); ++item) {
395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      HandledPubSubItem handled_item;
405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      handled_item.itemid = item->itemid;
415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      if (item->elem->FirstElement() != NULL) {
425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        handled_item.payload = item->elem->FirstElement()->Str();
435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      }
445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      this->items.push_back(handled_item);
455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    }
465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnPublishResult(buzz::PubSubPublishTask* task) {
495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ++result_count;
505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnRetractResult(buzz::PubSubRetractTask* task) {
535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ++result_count;
545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void OnError(buzz::IqTask* task, const buzz::XmlElement* stanza) {
575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ++error_count;
585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::vector<HandledPubSubItem> items;
615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  int result_count;
625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  int error_count;
635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass PubSubTasksTest : public testing::Test {
665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  PubSubTasksTest() :
685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      pubsubjid("room@domain.com"),
695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      node("topic"),
705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      itemid("key") {
715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    runner.reset(new talk_base::FakeTaskRunner());
725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    client = new buzz::FakeXmppClient(runner.get());
735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    listener.reset(new TestPubSubTasksListener());
745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::scoped_ptr<talk_base::FakeTaskRunner> runner;
775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Client deleted by deleting runner.
785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  buzz::FakeXmppClient* client;
795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::scoped_ptr<TestPubSubTasksListener> listener;
805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  buzz::Jid pubsubjid;
815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string node;
825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string itemid;
835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PubSubTasksTest, TestRequest) {
865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  buzz::PubSubRequestTask* task =
875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      new buzz::PubSubRequestTask(client, pubsubjid, node);
885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  task->SignalResult.connect(
895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      listener.get(), &TestPubSubTasksListener::OnRequestResult);
905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  task->Start();
915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string expected_iq =
935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "<cli:iq type=\"get\" to=\"room@domain.com\" id=\"0\" "
945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        "xmlns:cli=\"jabber:client\">"
955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        "<pub:pubsub xmlns:pub=\"http://jabber.org/protocol/pubsub\">"
965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org          "<pub:items node=\"topic\"/>"
975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        "</pub:pubsub>"
985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "</cli:iq>";
995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ASSERT_EQ(1U, client->sent_stanzas().size());
1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(expected_iq, client->sent_stanzas()[0]->Str());
1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string result_iq =
1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "<iq xmlns='jabber:client' id='0' type='result' from='room@domain.com'>"
1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "  <pubsub xmlns='http://jabber.org/protocol/pubsub'>"
1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "    <items node='topic'>"
1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "      <item id='key0'>"
1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "        <value0/>"
1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "      </item>"
1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "      <item id='key1'>"
1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "        <value1/>"
1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "      </item>"
1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "    </items>"
1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "  </pubsub>"
1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "</iq>";
1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  client->HandleStanza(buzz::XmlElement::ForStr(result_iq));
1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ASSERT_EQ(2U, listener->items.size());
1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("key0", listener->items[0].itemid);
1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("<pub:value0 xmlns:pub=\"http://jabber.org/protocol/pubsub\"/>",
1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org            listener->items[0].payload);
1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("key1", listener->items[1].itemid);
1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("<pub:value1 xmlns:pub=\"http://jabber.org/protocol/pubsub\"/>",
1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org            listener->items[1].payload);
1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PubSubTasksTest, TestRequestError) {
1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string result_iq =
1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "<iq xmlns='jabber:client' id='0' type='error' from='room@domain.com'>"
1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "  <error type='auth'>"
1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "    <forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>"
1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "  </error>"
1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "</iq>";
1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  buzz::PubSubRequestTask* task =
1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      new buzz::PubSubRequestTask(client, pubsubjid, node);
1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  task->SignalResult.connect(
1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      listener.get(), &TestPubSubTasksListener::OnRequestResult);
1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  task->SignalError.connect(
1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      listener.get(), &TestPubSubTasksListener::OnError);
1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  task->Start();
1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  client->HandleStanza(buzz::XmlElement::ForStr(result_iq));
1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(0, listener->result_count);
1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(1, listener->error_count);
1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PubSubTasksTest, TestReceive) {
1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string items_message =
1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "<message xmlns='jabber:client' from='room@domain.com'>"
1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "  <event xmlns='http://jabber.org/protocol/pubsub#event'>"
1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "    <items node='topic'>"
1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "      <item id='key0'>"
1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "        <value0/>"
1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "      </item>"
1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "      <item id='key1'>"
1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "        <value1/>"
1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "      </item>"
1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "    </items>"
1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "  </event>"
1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "</message>";
1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  buzz::PubSubReceiveTask* task =
1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      new buzz::PubSubReceiveTask(client, pubsubjid, node);
1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  task->SignalUpdate.connect(
1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      listener.get(), &TestPubSubTasksListener::OnReceiveUpdate);
1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  task->Start();
1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  client->HandleStanza(buzz::XmlElement::ForStr(items_message));
1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ASSERT_EQ(2U, listener->items.size());
1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("key0", listener->items[0].itemid);
1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(
1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "<eve:value0 xmlns:eve=\"http://jabber.org/protocol/pubsub#event\"/>",
1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      listener->items[0].payload);
1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ("key1", listener->items[1].itemid);
1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(
1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "<eve:value1 xmlns:eve=\"http://jabber.org/protocol/pubsub#event\"/>",
1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      listener->items[1].payload);
1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PubSubTasksTest, TestPublish) {
1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  buzz::XmlElement* payload =
1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      new buzz::XmlElement(buzz::QName(buzz::NS_PUBSUB, "value"));
1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string expected_iq =
1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "<cli:iq type=\"set\" to=\"room@domain.com\" id=\"0\" "
1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        "xmlns:cli=\"jabber:client\">"
1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        "<pubsub xmlns=\"http://jabber.org/protocol/pubsub\">"
1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org          "<publish node=\"topic\">"
1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org            "<item id=\"key\">"
1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org              "<value/>"
1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org            "</item>"
1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org          "</publish>"
1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        "</pubsub>"
1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "</cli:iq>";
1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::vector<buzz::XmlElement*> children;
1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  children.push_back(payload);
1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  buzz::PubSubPublishTask* task =
2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      new buzz::PubSubPublishTask(client, pubsubjid, node, itemid, children);
2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  task->SignalResult.connect(
2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      listener.get(), &TestPubSubTasksListener::OnPublishResult);
2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  task->Start();
2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ASSERT_EQ(1U, client->sent_stanzas().size());
2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(expected_iq, client->sent_stanzas()[0]->Str());
2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string result_iq =
2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "<iq xmlns='jabber:client' id='0' type='result' from='room@domain.com'/>";
2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  client->HandleStanza(buzz::XmlElement::ForStr(result_iq));
2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(1, listener->result_count);
2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(0, listener->error_count);
2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PubSubTasksTest, TestPublishError) {
2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  buzz::XmlElement* payload =
2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      new buzz::XmlElement(buzz::QName(buzz::NS_PUBSUB, "value"));
2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::vector<buzz::XmlElement*> children;
2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  children.push_back(payload);
2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  buzz::PubSubPublishTask* task =
2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      new buzz::PubSubPublishTask(client, pubsubjid, node, itemid, children);
2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  task->SignalResult.connect(
2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      listener.get(), &TestPubSubTasksListener::OnPublishResult);
2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  task->SignalError.connect(
2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      listener.get(), &TestPubSubTasksListener::OnError);
2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  task->Start();
2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string result_iq =
2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "<iq xmlns='jabber:client' id='0' type='error' from='room@domain.com'>"
2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "  <error type='auth'>"
2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "    <forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>"
2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "  </error>"
2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "</iq>";
2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  client->HandleStanza(buzz::XmlElement::ForStr(result_iq));
2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(0, listener->result_count);
2415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(1, listener->error_count);
2425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
2435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(PubSubTasksTest, TestRetract) {
2455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  buzz::PubSubRetractTask* task =
2465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      new buzz::PubSubRetractTask(client, pubsubjid, node, itemid);
2475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  task->SignalResult.connect(
2485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      listener.get(), &TestPubSubTasksListener::OnRetractResult);
2495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  task->SignalError.connect(
2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      listener.get(), &TestPubSubTasksListener::OnError);
2515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  task->Start();
2525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string expected_iq =
2545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "<cli:iq type=\"set\" to=\"room@domain.com\" id=\"0\" "
2555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        "xmlns:cli=\"jabber:client\">"
2565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        "<pubsub xmlns=\"http://jabber.org/protocol/pubsub\">"
2575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org          "<retract node=\"topic\" notify=\"true\">"
2585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org            "<item id=\"key\"/>"
2595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org          "</retract>"
2605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org        "</pubsub>"
2615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "</cli:iq>";
2625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ASSERT_EQ(1U, client->sent_stanzas().size());
2645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(expected_iq, client->sent_stanzas()[0]->Str());
2655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string result_iq =
2675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      "<iq xmlns='jabber:client' id='0' type='result' from='room@domain.com'/>";
2685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  client->HandleStanza(buzz::XmlElement::ForStr(result_iq));
2705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(1, listener->result_count);
2725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  EXPECT_EQ(0, listener->error_count);
2735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}
274