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