10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/* 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2011, Google Inc. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer. 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * and/or other materials provided with the distribution. 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * derived from this software without specific prior written permission. 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <string> 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <vector> 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3113b2d035e2e7f2f18e3a4d3377bc1a09f43a4ff9buildbot@webrtc.org#include "webrtc/libjingle/xmllite/xmlelement.h" 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/xmpp/constants.h" 330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/xmpp/fakexmppclient.h" 340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/xmpp/mucroomdiscoverytask.h" 35cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/faketaskrunner.h" 36cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/gunit.h" 37cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/sigslot.h" 380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass MucRoomDiscoveryListener : public sigslot::has_slots<> { 400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MucRoomDiscoveryListener() : error_count(0) {} 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnResult(buzz::MucRoomDiscoveryTask* task, 440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool exists, 450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& name, 46f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org const std::string& conversation_id, 470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::set<std::string>& features, 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::map<std::string, std::string>& extended_info) { 490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_exists = exists; 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_name = name; 51f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org last_conversation_id = conversation_id; 520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_features = features; 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org last_extended_info = extended_info; 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnError(buzz::IqTask* task, 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const buzz::XmlElement* error) { 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ++error_count; 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org bool last_exists; 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string last_name; 63f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org std::string last_conversation_id; 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::set<std::string> last_features; 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::map<std::string, std::string> last_extended_info; 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int error_count; 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass MucRoomDiscoveryTaskTest : public testing::Test { 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MucRoomDiscoveryTaskTest() : 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org room_jid("muc-jid-ponies@domain.com"), 73f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org room_name("ponies"), 74f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org conversation_id("test_conversation_id") { 750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void SetUp() { 782a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org runner = new rtc::FakeTaskRunner(); 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org xmpp_client = new buzz::FakeXmppClient(runner); 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org listener = new MucRoomDiscoveryListener(); 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void TearDown() { 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete listener; 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // delete xmpp_client; Deleted by deleting runner. 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org delete runner; 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 892a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::FakeTaskRunner* runner; 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org buzz::FakeXmppClient* xmpp_client; 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MucRoomDiscoveryListener* listener; 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org buzz::Jid room_jid; 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string room_name; 94f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org std::string conversation_id; 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MucRoomDiscoveryTaskTest, TestDiscovery) { 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(0U, xmpp_client->sent_stanzas().size()); 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org buzz::MucRoomDiscoveryTask* task = new buzz::MucRoomDiscoveryTask( 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org xmpp_client, room_jid); 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org task->SignalResult.connect(listener, &MucRoomDiscoveryListener::OnResult); 1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org task->Start(); 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string expected_iq = 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "<cli:iq type=\"get\" to=\"muc-jid-ponies@domain.com\" id=\"0\" " 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "xmlns:cli=\"jabber:client\">" 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "<info:query xmlns:info=\"http://jabber.org/protocol/disco#info\"/>" 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "</cli:iq>"; 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1U, xmpp_client->sent_stanzas().size()); 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_iq, xmpp_client->sent_stanzas()[0]->Str()); 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("", listener->last_name); 115f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ("", listener->last_conversation_id); 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string response_iq = 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "<iq xmlns='jabber:client'" 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " from='muc-jid-ponies@domain.com' id='0' type='result'>" 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " <info:query xmlns:info='http://jabber.org/protocol/disco#info'>" 121f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org " <info:identity name='ponies'>" 122f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org " <han:conversation-id xmlns:han='google:muc#hangout'>" 123f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org "test_conversation_id</han:conversation-id>" 124f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org " </info:identity>" 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " <info:feature var='feature1'/>" 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " <info:feature var='feature2'/>" 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " <data:x xmlns:data='jabber:x:data'>" 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " <data:field var='var1' data:value='value1' />" 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " <data:field var='var2' data:value='value2' />" 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " </data:x>" 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " </info:query>" 1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "</iq>"; 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org xmpp_client->HandleStanza(buzz::XmlElement::ForStr(response_iq)); 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(true, listener->last_exists); 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(room_name, listener->last_name); 138f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org EXPECT_EQ(conversation_id, listener->last_conversation_id); 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2U, listener->last_features.size()); 1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1U, listener->last_features.count("feature1")); 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2U, listener->last_extended_info.size()); 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ("value1", listener->last_extended_info["var1"]); 1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, listener->error_count); 1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MucRoomDiscoveryTaskTest, TestMissingName) { 1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org buzz::MucRoomDiscoveryTask* task = new buzz::MucRoomDiscoveryTask( 1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org xmpp_client, room_jid); 1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org task->SignalError.connect(listener, &MucRoomDiscoveryListener::OnError); 1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org task->Start(); 1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::string error_iq = 1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "<iq xmlns='jabber:client'" 1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " from='muc-jid-ponies@domain.com' id='0' type='result'>" 1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " <info:query xmlns:info='http://jabber.org/protocol/disco#info'>" 1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " <info:identity />" 1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " </info:query>" 1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "</iq>"; 1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, listener->error_count); 1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org xmpp_client->HandleStanza(buzz::XmlElement::ForStr(error_iq)); 1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, listener->error_count); 1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 163