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