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) 5e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <vector> 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/testing_pref_service.h" 14a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/run_loop.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h" 177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/browser_prefs.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/signin/chrome_signin_client_factory.h" 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/signin/fake_profile_oauth2_token_service.h" 21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/signin/fake_profile_oauth2_token_service_builder.h" 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/signin/profile_oauth2_token_service_factory.h" 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/signin/signin_manager_factory.h" 2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/signin/test_signin_client_builder.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/url_constants.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/profile_oauth2_token_service.h" 3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/signin/core/browser/test_signin_client.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/child_process_security_policy.h" 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/notification_source.h" 33a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_constants.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_urls.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/cookies/cookie_monster.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_status.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)KeyedService* SigninManagerBuild(content::BrowserContext* context) { 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SigninManager* service = NULL; 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Profile* profile = static_cast<Profile*>(context); 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) service = new SigninManager( 51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ChromeSigninClientFactory::GetInstance()->GetForProfile(profile), 52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ProfileOAuth2TokenServiceFactory::GetForProfile(profile)); 53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch service->Initialize(NULL); 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return service; 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TestSigninManagerObserver : public SigninManagerBase::Observer { 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestSigninManagerObserver() : num_failed_signins_(0), 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) num_successful_signins_(0), 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) num_signouts_(0) { 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~TestSigninManagerObserver() {} 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int num_failed_signins_; 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int num_successful_signins_; 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int num_signouts_; 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // SigninManagerBase::Observer: 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GoogleSigninFailed( 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GoogleServiceAuthError& error) OVERRIDE { 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) num_failed_signins_++; 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GoogleSigninSucceeded( 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& account_id, 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& username, 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& password) OVERRIDE { 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) num_successful_signins_++; 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void GoogleSignedOut(const std::string& account_id, 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& username) OVERRIDE { 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) num_signouts_++; 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class SigninManagerTest : public testing::Test { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SigninManagerTest() : manager_(NULL) {} 96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual ~SigninManagerTest() {} 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) manager_ = NULL; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs_.reset(new TestingPrefServiceSimple); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::RegisterLocalState(prefs_->registry()); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingBrowserProcess::GetGlobal()->SetLocalState( 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_.get()); 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestingProfile::Builder builder; 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) builder.AddTestingFactory(ProfileOAuth2TokenServiceFactory::GetInstance(), 106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch BuildFakeProfileOAuth2TokenService); 10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) builder.AddTestingFactory(ChromeSigninClientFactory::GetInstance(), 10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) signin::BuildTestSigninClient); 109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch builder.AddTestingFactory(SigninManagerFactory::GetInstance(), 110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SigninManagerBuild); 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) profile_ = builder.Build(); 11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) static_cast<TestSigninClient*>( 11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ChromeSigninClientFactory::GetInstance()->GetForProfile(profile()))-> 11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SetURLRequestContext(profile_->GetRequestContext()); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (manager_) 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager_->RemoveObserver(&test_observer_); 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 122a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Destroy the SigninManager here, because it relies on profile() which is 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // freed in the base class. 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (naked_manager_) { 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) naked_manager_->Shutdown(); 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) naked_manager_.reset(NULL); 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingBrowserProcess::GetGlobal()->SetLocalState(NULL); 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Manually destroy PrefService and Profile so that they are shutdown 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // in the correct order. Both need to be destroyed before the 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // |thread_bundle_| member. 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) profile_.reset(); 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs_.reset(); // LocalState needs to outlive the profile. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestingProfile* profile() { return profile_.get(); } 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Sets up the signin manager as a service if other code will try to get it as 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // a PKS. 141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void SetUpSigninManagerAsService() { 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(!manager_); 1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(!naked_manager_); 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) manager_ = static_cast<SigninManager*>( 145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SigninManagerFactory::GetForProfile(profile())); 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager_->AddObserver(&test_observer_); 1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Create a naked signin manager if integration with PKSs is not needed. 1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void CreateNakedSigninManager() { 1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(!manager_); 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) naked_manager_.reset(new SigninManager( 153effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ChromeSigninClientFactory::GetInstance()->GetForProfile(profile()), 154effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ProfileOAuth2TokenServiceFactory::GetForProfile(profile()))); 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) manager_ = naked_manager_.get(); 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager_->AddObserver(&test_observer_); 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Shuts down |manager_|. 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ShutDownManager() { 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(manager_); 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager_->RemoveObserver(&test_observer_); 1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager_->Shutdown(); 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (naked_manager_) 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) naked_manager_.reset(NULL); 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager_ = NULL; 1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void ExpectSignInWithRefreshTokenSuccess() { 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(manager_->IsAuthenticated()); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ProfileOAuth2TokenService* token_service = 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetForProfile(profile()); 175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(token_service->RefreshTokenIsAvailable( 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) manager_->GetAuthenticatedUsername())); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should go into token service and stop. 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, test_observer_.num_successful_signins_); 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, test_observer_.num_failed_signins_); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void CompleteSigninCallback(const std::string& oauth_token) { 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) oauth_tokens_fetched_.push_back(oauth_token); 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) manager_->CompletePendingSignin(); 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::TestBrowserThreadBundle thread_bundle_; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestURLFetcherFactory factory_; 1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<SigninManager> naked_manager_; 1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SigninManager* manager_; 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestSigninManagerObserver test_observer_; 193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<TestingProfile> profile_; 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<std::string> oauth_tokens_fetched_; 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestingPrefServiceSimple> prefs_; 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> cookies_; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(SigninManagerTest, SignInWithRefreshToken) { 200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetUpSigninManagerAsService(); 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(manager_->IsAuthenticated()); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) manager_->StartSignInWithRefreshToken( 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "rt1", 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "user@gmail.com", 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "password", 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SigninManager::OAuthTokenFetchedCallback()); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ExpectSignInWithRefreshTokenSuccess(); 2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Should persist across resets. 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShutDownManager(); 2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateNakedSigninManager(); 214e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch manager_->Initialize(NULL); 2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("user@gmail.com", manager_->GetAuthenticatedUsername()); 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(SigninManagerTest, SignInWithRefreshTokenCallbackComplete) { 219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetUpSigninManagerAsService(); 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(manager_->IsAuthenticated()); 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Since the password is empty, must verify the gaia cookies first. 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SigninManager::OAuthTokenFetchedCallback callback = 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&SigninManagerTest::CompleteSigninCallback, 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)); 226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) manager_->StartSignInWithRefreshToken( 227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "rt1", 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "user@gmail.com", 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "password", 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback); 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ExpectSignInWithRefreshTokenSuccess(); 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(1U, oauth_tokens_fetched_.size()); 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(oauth_tokens_fetched_[0], "rt1"); 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(SigninManagerTest, SignOut) { 238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetUpSigninManagerAsService(); 239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) manager_->StartSignInWithRefreshToken( 240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "rt1", 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "user@gmail.com", 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "password", 243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SigninManager::OAuthTokenFetchedCallback()); 244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch manager_->SignOut(signin_metrics::SIGNOUT_TEST); 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(manager_->IsAuthenticated()); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should not be persisted anymore 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShutDownManager(); 2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateNakedSigninManager(); 249e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch manager_->Initialize(NULL); 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(manager_->IsAuthenticated()); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SigninManagerTest, SignOutWhileProhibited) { 254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetUpSigninManagerAsService(); 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(manager_->IsAuthenticated()); 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager_->SetAuthenticatedUsername("user@gmail.com"); 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) manager_->ProhibitSignout(true); 259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch manager_->SignOut(signin_metrics::SIGNOUT_TEST); 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(manager_->IsAuthenticated()); 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) manager_->ProhibitSignout(false); 262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch manager_->SignOut(signin_metrics::SIGNOUT_TEST); 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(manager_->IsAuthenticated()); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SigninManagerTest, TestIsWebBasedSigninFlowURL) { 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(SigninManager::IsWebBasedSigninFlowURL( 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://www.google.com"))); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(SigninManager::IsWebBasedSigninFlowURL( 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("https://accounts.google.com/ServiceLogin?service=chromiumsync"))); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(SigninManager::IsWebBasedSigninFlowURL( 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://accounts.google.com/ServiceLogin?service=chromiumsync"))); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // http, not https, should not be treated as web based signin. 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(SigninManager::IsWebBasedSigninFlowURL( 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://accounts.google.com/ServiceLogin?service=googlemail"))); 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // chromiumsync is double-embedded in a continue query param. 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(SigninManager::IsWebBasedSigninFlowURL( 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("https://accounts.google.com/CheckCookie?" 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "continue=https%3A%2F%2Fwww.google.com%2Fintl%2Fen-US%2Fchrome" 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "%2Fblank.html%3Fsource%3D3%26nonadv%3D1&service=chromiumsync"))); 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 282a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 283a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(SigninManagerTest, Prohibited) { 284a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) g_browser_process->local_state()->SetString( 285a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) prefs::kGoogleServicesUsernamePattern, ".*@google.com"); 2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateNakedSigninManager(); 287e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch manager_->Initialize(g_browser_process->local_state()); 288a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(manager_->IsAllowedUsername("test@google.com")); 289a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(manager_->IsAllowedUsername("happy@google.com")); 290a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(manager_->IsAllowedUsername("test@invalid.com")); 291a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(manager_->IsAllowedUsername("test@notgoogle.com")); 292a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(manager_->IsAllowedUsername(std::string())); 293a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 294a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 295a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(SigninManagerTest, TestAlternateWildcard) { 296a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Test to make sure we accept "*@google.com" as a pattern (treat it as if 297a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // the admin entered ".*@google.com"). 298a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) g_browser_process->local_state()->SetString( 299a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) prefs::kGoogleServicesUsernamePattern, "*@google.com"); 3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateNakedSigninManager(); 301e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch manager_->Initialize(g_browser_process->local_state()); 302a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(manager_->IsAllowedUsername("test@google.com")); 303a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(manager_->IsAllowedUsername("happy@google.com")); 304a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(manager_->IsAllowedUsername("test@invalid.com")); 305a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(manager_->IsAllowedUsername("test@notgoogle.com")); 306a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(manager_->IsAllowedUsername(std::string())); 307a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 308a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 309a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(SigninManagerTest, ProhibitedAtStartup) { 310a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch profile()->GetPrefs()->SetString(prefs::kGoogleServicesUsername, 311a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch "monkey@invalid.com"); 312a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) g_browser_process->local_state()->SetString( 313a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) prefs::kGoogleServicesUsernamePattern, ".*@google.com"); 3144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateNakedSigninManager(); 315e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch manager_->Initialize(g_browser_process->local_state()); 316a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Currently signed in user is prohibited by policy, so should be signed out. 317a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ("", manager_->GetAuthenticatedUsername()); 318a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 319a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 320a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(SigninManagerTest, ProhibitedAfterStartup) { 321a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) std::string user("monkey@invalid.com"); 322a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch profile()->GetPrefs()->SetString(prefs::kGoogleServicesUsername, user); 3234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateNakedSigninManager(); 324e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch manager_->Initialize(g_browser_process->local_state()); 325a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(user, manager_->GetAuthenticatedUsername()); 326a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Update the profile - user should be signed out. 327a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) g_browser_process->local_state()->SetString( 328a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) prefs::kGoogleServicesUsernamePattern, ".*@google.com"); 329a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ("", manager_->GetAuthenticatedUsername()); 330a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 3317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3327dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(SigninManagerTest, ExternalSignIn) { 3334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateNakedSigninManager(); 334e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch manager_->Initialize(g_browser_process->local_state()); 3357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ("", 336a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch profile()->GetPrefs()->GetString(prefs::kGoogleServicesUsername)); 3377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ("", manager_->GetAuthenticatedUsername()); 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, test_observer_.num_successful_signins_); 3397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch manager_->OnExternalSigninCompleted("external@example.com"); 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, test_observer_.num_successful_signins_); 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, test_observer_.num_failed_signins_); 3437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ("external@example.com", 344a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch profile()->GetPrefs()->GetString(prefs::kGoogleServicesUsername)); 3457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ("external@example.com", manager_->GetAuthenticatedUsername()); 3467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(SigninManagerTest, SigninNotAllowed) { 349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string user("user@google.com"); 350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) profile()->GetPrefs()->SetString(prefs::kGoogleServicesUsername, user); 351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) profile()->GetPrefs()->SetBoolean(prefs::kSigninAllowed, false); 352effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetUpSigninManagerAsService(); 353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 354