15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Copyright 2004 Google Inc. All Rights Reserved 25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Author: David Bau 35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <string> 55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <sstream> 65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <iostream> 75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/common.h" 85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/gunit.h" 95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmllite/xmlelement.h" 105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmpp/constants.h" 115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmpp/util_unittest.h" 125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmpp/saslplainmechanism.h" 135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmpp/plainsaslhandler.h" 145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/xmpp/xmppengine.h" 155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing buzz::Jid; 175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing buzz::QName; 185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing buzz::XmlElement; 195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing buzz::XmppEngine; 205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing buzz::XmppIqCookie; 215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing buzz::XmppIqHandler; 225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing buzz::XmppTestHandler; 235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing buzz::QN_ID; 245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing buzz::QN_IQ; 255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing buzz::QN_TYPE; 265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing buzz::QN_ROSTER_QUERY; 275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing buzz::XMPP_RETURN_OK; 285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgusing buzz::XMPP_RETURN_BADARGUMENT; 295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// XmppEngineTestIqHandler 315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This class grabs the response to an IQ stanza and stores it in a string. 325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass XmppEngineTestIqHandler : public XmppIqHandler { 335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void IqResponse(XmppIqCookie, const XmlElement * stanza) { 355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ss_ << stanza->Str(); 365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string IqResponseActivity() { 395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string result = ss_.str(); 405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ss_.str(""); 415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return result; 425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private: 455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::stringstream ss_; 465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass XmppEngineTest : public testing::Test { 495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org XmppEngine* engine() { return engine_.get(); } 515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org XmppTestHandler* handler() { return handler_.get(); } 525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void SetUp() { 535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine_.reset(XmppEngine::Create()); 545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org handler_.reset(new XmppTestHandler(engine_.get())); 555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Jid jid("david@my-server"); 575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::InsecureCryptStringImpl pass; 585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org pass.password() = "david"; 595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine_->SetSessionHandler(handler_.get()); 605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine_->SetOutputHandler(handler_.get()); 615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine_->AddStanzaHandler(handler_.get()); 625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine_->SetUser(jid); 635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine_->SetSaslHandler( 645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org new buzz::PlainSaslHandler(jid, talk_base::CryptString(pass), true)); 655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void TearDown() { 675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org handler_.reset(); 685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine_.reset(); 695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void RunLogin(); 715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private: 735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<XmppEngine> engine_; 745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::scoped_ptr<XmppTestHandler> handler_; 755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgvoid XmppEngineTest::RunLogin() { 785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Connect 795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(XmppEngine::STATE_START, engine()->GetState()); 805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->Connect(); 815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(XmppEngine::STATE_OPENING, engine()->GetState()); 825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("[OPENING]", handler_->SessionActivity()); 845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("<stream:stream to=\"my-server\" xml:lang=\"*\" version=\"1.0\" " 865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "xmlns:stream=\"http://etherx.jabber.org/streams\" " 875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "xmlns=\"jabber:client\">\r\n", handler_->OutputActivity()); 885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string input = 905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "<stream:stream id=\"a5f2d8c9\" version=\"1.0\" " 915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "xmlns:stream=\"http://etherx.jabber.org/streams\" " 925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "xmlns=\"jabber:client\">"; 935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->HandleInput(input.c_str(), input.length()); 945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org input = 965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "<stream:features>" 975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'>" 985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "<required/>" 995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "</starttls>" 1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "<mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>" 1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "<mechanism>DIGEST-MD5</mechanism>" 1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "<mechanism>PLAIN</mechanism>" 1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "</mechanisms>" 1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "</stream:features>"; 1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->HandleInput(input.c_str(), input.length()); 1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("<starttls xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\"/>", 1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org handler_->OutputActivity()); 1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler_->SessionActivity()); 1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler_->StanzaActivity()); 1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org input = "<proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>"; 1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->HandleInput(input.c_str(), input.length()); 1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("[START-TLS my-server]" 1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "<stream:stream to=\"my-server\" xml:lang=\"*\" " 1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "version=\"1.0\" xmlns:stream=\"http://etherx.jabber.org/streams\" " 1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "xmlns=\"jabber:client\">\r\n", handler_->OutputActivity()); 1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler_->SessionActivity()); 1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler_->StanzaActivity()); 1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org input = "<stream:stream id=\"01234567\" version=\"1.0\" " 1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "xmlns:stream=\"http://etherx.jabber.org/streams\" " 1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "xmlns=\"jabber:client\">"; 1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->HandleInput(input.c_str(), input.length()); 1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org input = 1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "<stream:features>" 1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "<mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>" 1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "<mechanism>DIGEST-MD5</mechanism>" 1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "<mechanism>PLAIN</mechanism>" 1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "</mechanisms>" 1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "</stream:features>"; 1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->HandleInput(input.c_str(), input.length()); 1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("<auth xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\" " 1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "mechanism=\"PLAIN\" " 1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "auth:allow-non-google-login=\"true\" " 1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "auth:client-uses-full-bind-result=\"true\" " 1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "xmlns:auth=\"http://www.google.com/talk/protocol/auth\"" 1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ">AGRhdmlkAGRhdmlk</auth>", 1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org handler_->OutputActivity()); 1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler_->SessionActivity()); 1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler_->StanzaActivity()); 1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org input = "<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>"; 1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->HandleInput(input.c_str(), input.length()); 1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("<stream:stream to=\"my-server\" xml:lang=\"*\" version=\"1.0\" " 1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "xmlns:stream=\"http://etherx.jabber.org/streams\" " 1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "xmlns=\"jabber:client\">\r\n", handler_->OutputActivity()); 1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler_->SessionActivity()); 1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler_->StanzaActivity()); 1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org input = "<stream:stream id=\"01234567\" version=\"1.0\" " 1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "xmlns:stream=\"http://etherx.jabber.org/streams\" " 1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "xmlns=\"jabber:client\">"; 1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->HandleInput(input.c_str(), input.length()); 1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org input = "<stream:features>" 1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/>" 1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "<session xmlns='urn:ietf:params:xml:ns:xmpp-session'/>" 1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "</stream:features>"; 1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->HandleInput(input.c_str(), input.length()); 1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("<iq type=\"set\" id=\"0\">" 1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "<bind xmlns=\"urn:ietf:params:xml:ns:xmpp-bind\"/></iq>", 1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org handler_->OutputActivity()); 1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler_->SessionActivity()); 1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler_->StanzaActivity()); 1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org input = "<iq type='result' id='0'>" 1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><jid>" 1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "david@my-server/test</jid></bind></iq>"; 1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->HandleInput(input.c_str(), input.length()); 1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("<iq type=\"set\" id=\"1\">" 1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "<session xmlns=\"urn:ietf:params:xml:ns:xmpp-session\"/></iq>", 1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org handler_->OutputActivity()); 1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler_->SessionActivity()); 1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler_->StanzaActivity()); 1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org input = "<iq type='result' id='1'/>"; 1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->HandleInput(input.c_str(), input.length()); 1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("[OPEN]", handler_->SessionActivity()); 1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler_->StanzaActivity()); 1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(Jid("david@my-server/test"), engine()->FullJid()); 1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// TestSuccessfulLogin() 1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This function simply tests to see if a login works. This includes 1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// encryption and authentication 1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(XmppEngineTest, TestSuccessfulLoginAndDisconnect) { 1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org RunLogin(); 1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->Disconnect(); 1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("</stream:stream>[CLOSED]", handler()->OutputActivity()); 1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("[CLOSED]", handler()->SessionActivity()); 2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler()->StanzaActivity()); 2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(XmppEngineTest, TestSuccessfulLoginAndConnectionClosed) { 2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org RunLogin(); 2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->ConnectionClosed(0); 2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("[CLOSED]", handler()->OutputActivity()); 2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("[CLOSED][ERROR-CONNECTION-CLOSED]", handler()->SessionActivity()); 2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler()->StanzaActivity()); 2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// TestNotXmpp() 2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This tests the error case when connecting to a non XMPP service 2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(XmppEngineTest, TestNotXmpp) { 2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Connect 2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->Connect(); 2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("<stream:stream to=\"my-server\" xml:lang=\"*\" version=\"1.0\" " 2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "xmlns:stream=\"http://etherx.jabber.org/streams\" " 2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "xmlns=\"jabber:client\">\r\n", handler()->OutputActivity()); 2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Send garbage response (courtesy of apache) 2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string input = "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">"; 2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->HandleInput(input.c_str(), input.length()); 2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("[CLOSED]", handler()->OutputActivity()); 2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("[OPENING][CLOSED][ERROR-XML]", handler()->SessionActivity()); 2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler()->StanzaActivity()); 2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// TestPassthrough() 2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This tests that arbitrary stanzas can be passed to the server through 2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// the engine. 2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(XmppEngineTest, TestPassthrough) { 2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Queue up an app stanza 2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org XmlElement application_stanza(QName("test", "app-stanza")); 2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org application_stanza.AddText("this-is-a-test"); 2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->SendStanza(&application_stanza); 2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Do the whole login handshake 2405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org RunLogin(); 2415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("<test:app-stanza xmlns:test=\"test\">this-is-a-test" 2435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "</test:app-stanza>", handler()->OutputActivity()); 2445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // do another stanza 2465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org XmlElement roster_get(QN_IQ); 2475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org roster_get.AddAttr(QN_TYPE, "get"); 2485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org roster_get.AddAttr(QN_ID, engine()->NextId()); 2495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org roster_get.AddElement(new XmlElement(QN_ROSTER_QUERY, true)); 2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->SendStanza(&roster_get); 2515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("<iq type=\"get\" id=\"2\"><query xmlns=\"jabber:iq:roster\"/>" 2525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "</iq>", handler()->OutputActivity()); 2535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // now say the server ends the stream 2555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->HandleInput("</stream:stream>", 16); 2565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("[CLOSED][ERROR-DOCUMENT-CLOSED]", handler()->SessionActivity()); 2575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("[CLOSED]", handler()->OutputActivity()); 2585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler()->StanzaActivity()); 2595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// TestIqCallback() 2625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// This tests the routing of Iq stanzas and responses. 2635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(XmppEngineTest, TestIqCallback) { 2645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org XmppEngineTestIqHandler iq_response; 2655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org XmppIqCookie cookie; 2665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Do the whole login handshake 2685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org RunLogin(); 2695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Build an iq request 2715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org XmlElement roster_get(QN_IQ); 2725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org roster_get.AddAttr(QN_TYPE, "get"); 2735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org roster_get.AddAttr(QN_ID, engine()->NextId()); 2745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org roster_get.AddElement(new XmlElement(QN_ROSTER_QUERY, true)); 2755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->SendIq(&roster_get, &iq_response, &cookie); 2765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("<iq type=\"get\" id=\"2\"><query xmlns=\"jabber:iq:roster\"/>" 2775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "</iq>", handler()->OutputActivity()); 2785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler()->SessionActivity()); 2795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler()->StanzaActivity()); 2805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", iq_response.IqResponseActivity()); 2815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // now say the server responds to the iq 2835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string input = "<iq type='result' id='2'>" 2845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "<query xmlns='jabber:iq:roster'><item>foo</item>" 2855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "</query></iq>"; 2865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->HandleInput(input.c_str(), input.length()); 2875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler()->OutputActivity()); 2885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler()->SessionActivity()); 2895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler()->StanzaActivity()); 2905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("<cli:iq type=\"result\" id=\"2\" xmlns:cli=\"jabber:client\">" 2915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "<query xmlns=\"jabber:iq:roster\"><item>foo</item></query>" 2925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "</cli:iq>", iq_response.IqResponseActivity()); 2935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(XMPP_RETURN_BADARGUMENT, engine()->RemoveIqHandler(cookie, NULL)); 2955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Do it again with another id to test cancel 2975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org roster_get.SetAttr(QN_ID, engine()->NextId()); 2985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->SendIq(&roster_get, &iq_response, &cookie); 2995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("<iq type=\"get\" id=\"3\"><query xmlns=\"jabber:iq:roster\"/>" 3005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "</iq>", handler()->OutputActivity()); 3015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler()->SessionActivity()); 3025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler()->StanzaActivity()); 3035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", iq_response.IqResponseActivity()); 3045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // cancel the handler this time 3065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(XMPP_RETURN_OK, engine()->RemoveIqHandler(cookie, NULL)); 3075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 3085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // now say the server responds to the iq: the iq handler should not get it. 3095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org input = "<iq type='result' id='3'><query xmlns='jabber:iq:roster'><item>bar" 3105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "</item></query></iq>"; 3115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org engine()->HandleInput(input.c_str(), input.length()); 3125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("<cli:iq type=\"result\" id=\"3\" xmlns:cli=\"jabber:client\">" 3135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "<query xmlns=\"jabber:iq:roster\"><item>bar</item></query>" 3145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org "</cli:iq>", handler()->StanzaActivity()); 3155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", iq_response.IqResponseActivity()); 3165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler()->OutputActivity()); 3175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ("", handler()->SessionActivity()); 3185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 319