15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/communicator/single_login_attempt.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstddef>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/base/const_communicator.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/base/fake_base_task.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/notifier/communicator/login_settings.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_test_util.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "talk/xmpp/constants.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "talk/xmpp/xmppengine.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/webrtc/libjingle/xmllite/xmlelement.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace buzz {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class XmppTaskParentInterface;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace buzz
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace notifier {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum DelegateState {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDLE, CONNECTED, REDIRECTED, CREDENTIALS_REJECTED, SETTINGS_EXHAUSTED
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeDelegate : public SingleLoginAttempt::Delegate {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeDelegate() : state_(IDLE) {}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnConnect(
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::WeakPtr<buzz::XmppTaskParentInterface> base_task) OVERRIDE {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = CONNECTED;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base_task_ = base_task;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnRedirect(const ServerInformation& redirect_server) OVERRIDE {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = REDIRECTED;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    redirect_server_ = redirect_server;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnCredentialsRejected() OVERRIDE {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = CREDENTIALS_REJECTED;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnSettingsExhausted() OVERRIDE {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_ = SETTINGS_EXHAUSTED;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DelegateState state() const { return state_; }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<buzz::XmppTaskParentInterface> base_task() const {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base_task_;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ServerInformation& redirect_server() const {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return redirect_server_;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DelegateState state_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<buzz::XmppTaskParentInterface> base_task_;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ServerInformation redirect_server_;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MyTestURLRequestContext : public net::TestURLRequestContext {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MyTestURLRequestContext() : TestURLRequestContext(true) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    context_storage_.set_host_resolver(
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_ptr<net::HostResolver>(new net::HangingHostResolver()));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Init();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MyTestURLRequestContext() {}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SingleLoginAttemptTest : public ::testing::Test {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SingleLoginAttemptTest()
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : login_settings_(
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          buzz::XmppClientSettings(),
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          new net::TestURLRequestContextGetter(
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              base::MessageLoopProxy::current(),
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              scoped_ptr<net::TestURLRequestContext>(
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  new MyTestURLRequestContext())),
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ServerList(
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              1,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ServerInformation(
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  net::HostPortPair("example.com", 100), SUPPORTS_SSLTCP)),
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          false /* try_ssltcp_first */,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "auth_mechanism"),
98d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        attempt_(new SingleLoginAttempt(login_settings_, &fake_delegate_)) {}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    message_loop_.RunUntilIdle();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FireRedirect(buzz::XmlElement* redirect_error) {
105d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    attempt_->OnError(buzz::XmppEngine::ERROR_STREAM, 0, redirect_error);
106d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
107d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
108d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  virtual ~SingleLoginAttemptTest() {
109d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    attempt_.reset();
110d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    message_loop_.RunUntilIdle();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop message_loop_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const LoginSettings login_settings_;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
118d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  scoped_ptr<SingleLoginAttempt> attempt_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeDelegate fake_delegate_;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeBaseTask fake_base_task_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fire OnConnect and make sure the base task gets passed to the
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// delegate properly.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SingleLoginAttemptTest, Basic) {
126d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  attempt_->OnConnect(fake_base_task_.AsWeakPtr());
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CONNECTED, fake_delegate_.state());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(fake_base_task_.AsWeakPtr().get(),
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fake_delegate_.base_task().get());
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fire OnErrors and make sure the delegate gets the
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OnSettingsExhausted() event.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SingleLoginAttemptTest, Error) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 2; ++i) {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(IDLE, fake_delegate_.state());
137d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    attempt_->OnError(buzz::XmppEngine::ERROR_NONE, 0, NULL);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(SETTINGS_EXHAUSTED, fake_delegate_.state());
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fire OnErrors but replace the last one with OnConnect, and make
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sure the delegate still gets the OnConnect message.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SingleLoginAttemptTest, ErrorThenSuccess) {
145d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  attempt_->OnError(buzz::XmppEngine::ERROR_NONE, 0, NULL);
146d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  attempt_->OnConnect(fake_base_task_.AsWeakPtr());
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CONNECTED, fake_delegate_.state());
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(fake_base_task_.AsWeakPtr().get(),
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            fake_delegate_.base_task().get());
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)buzz::XmlElement* MakeRedirectError(const std::string& redirect_server) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buzz::XmlElement* stream_error =
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new buzz::XmlElement(buzz::QN_STREAM_ERROR, true);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  stream_error->AddElement(
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new buzz::XmlElement(buzz::QN_XSTREAM_SEE_OTHER_HOST, true));
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buzz::XmlElement* text =
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new buzz::XmlElement(buzz::QN_XSTREAM_TEXT, true);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  stream_error->AddElement(text);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  text->SetBodyText(redirect_server);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return stream_error;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fire a redirect and make sure the delegate gets the proper redirect
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// server info.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SingleLoginAttemptTest, Redirect) {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ServerInformation redirect_server(
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::HostPortPair("example.com", 1000),
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SUPPORTS_SSLTCP);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<buzz::XmlElement> redirect_error(
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MakeRedirectError(redirect_server.server.ToString()));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FireRedirect(redirect_error.get());
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(REDIRECTED, fake_delegate_.state());
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(fake_delegate_.redirect_server().Equals(redirect_server));
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fire a redirect with the host only and make sure the delegate gets
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the proper redirect server info with the default XMPP port.
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SingleLoginAttemptTest, RedirectHostOnly) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ServerInformation redirect_server(
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::HostPortPair("example.com", kDefaultXmppPort),
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SUPPORTS_SSLTCP);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<buzz::XmlElement> redirect_error(
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MakeRedirectError(redirect_server.server.host()));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FireRedirect(redirect_error.get());
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(REDIRECTED, fake_delegate_.state());
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(fake_delegate_.redirect_server().Equals(redirect_server));
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fire a redirect with a zero port and make sure the delegate gets
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the proper redirect server info with the default XMPP port.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SingleLoginAttemptTest, RedirectZeroPort) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ServerInformation redirect_server(
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::HostPortPair("example.com", kDefaultXmppPort),
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SUPPORTS_SSLTCP);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<buzz::XmlElement> redirect_error(
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MakeRedirectError(redirect_server.server.host() + ":0"));
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FireRedirect(redirect_error.get());
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(REDIRECTED, fake_delegate_.state());
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(fake_delegate_.redirect_server().Equals(redirect_server));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fire a redirect with an invalid port and make sure the delegate
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// gets the proper redirect server info with the default XMPP port.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SingleLoginAttemptTest, RedirectInvalidPort) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ServerInformation redirect_server(
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::HostPortPair("example.com", kDefaultXmppPort),
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SUPPORTS_SSLTCP);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<buzz::XmlElement> redirect_error(
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MakeRedirectError(redirect_server.server.host() + ":invalidport"));
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FireRedirect(redirect_error.get());
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(REDIRECTED, fake_delegate_.state());
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(fake_delegate_.redirect_server().Equals(redirect_server));
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fire an empty redirect and make sure the delegate does not get a
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// redirect.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SingleLoginAttemptTest, RedirectEmpty) {
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<buzz::XmlElement> redirect_error(MakeRedirectError(std::string()));
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FireRedirect(redirect_error.get());
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(IDLE, fake_delegate_.state());
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fire a redirect with a missing text element and make sure the
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// delegate does not get a redirect.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SingleLoginAttemptTest, RedirectMissingText) {
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<buzz::XmlElement> redirect_error(MakeRedirectError(std::string()));
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  redirect_error->RemoveChildAfter(redirect_error->FirstChild());
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FireRedirect(redirect_error.get());
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(IDLE, fake_delegate_.state());
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fire a redirect with a missing see-other-host element and make sure
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the delegate does not get a redirect.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SingleLoginAttemptTest, RedirectMissingSeeOtherHost) {
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<buzz::XmlElement> redirect_error(MakeRedirectError(std::string()));
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  redirect_error->RemoveChildAfter(NULL);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FireRedirect(redirect_error.get());
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(IDLE, fake_delegate_.state());
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fire 'Unauthorized' errors and make sure the delegate gets the
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OnCredentialsRejected() event.
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SingleLoginAttemptTest, CredentialsRejected) {
253d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  attempt_->OnError(buzz::XmppEngine::ERROR_UNAUTHORIZED, 0, NULL);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CREDENTIALS_REJECTED, fake_delegate_.state());
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace notifier
260