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" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/url_constants.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/signin/core/browser/profile_oauth2_token_service.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/child_process_security_policy.h" 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/notification_source.h" 31a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_constants.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_urls.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/cookies/cookie_monster.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_status.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)KeyedService* SigninManagerBuild(content::BrowserContext* context) { 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SigninManager* service = NULL; 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Profile* profile = static_cast<Profile*>(context); 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) service = new SigninManager( 49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ChromeSigninClientFactory::GetInstance()->GetForProfile(profile), 50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ProfileOAuth2TokenServiceFactory::GetForProfile(profile)); 51e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch service->Initialize(NULL); 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return service; 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TestSigninManagerObserver : public SigninManagerBase::Observer { 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestSigninManagerObserver() : num_failed_signins_(0), 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) num_successful_signins_(0), 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) num_signouts_(0) { 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~TestSigninManagerObserver() {} 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int num_failed_signins_; 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int num_successful_signins_; 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int num_signouts_; 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // SigninManagerBase::Observer: 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GoogleSigninFailed( 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GoogleServiceAuthError& error) OVERRIDE { 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) num_failed_signins_++; 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GoogleSigninSucceeded( 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& username, const std::string& password) OVERRIDE { 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) num_successful_signins_++; 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void GoogleSignedOut(const std::string& username) OVERRIDE { 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) num_signouts_++; 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class SigninManagerTest : public testing::Test { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SigninManagerTest() : manager_(NULL) {} 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual ~SigninManagerTest() {} 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) manager_ = NULL; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs_.reset(new TestingPrefServiceSimple); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::RegisterLocalState(prefs_->registry()); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingBrowserProcess::GetGlobal()->SetLocalState( 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prefs_.get()); 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestingProfile::Builder builder; 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) builder.AddTestingFactory(ProfileOAuth2TokenServiceFactory::GetInstance(), 101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch BuildFakeProfileOAuth2TokenService); 102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch builder.AddTestingFactory(SigninManagerFactory::GetInstance(), 103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SigninManagerBuild); 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) profile_ = builder.Build(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (manager_) 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager_->RemoveObserver(&test_observer_); 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 111a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Destroy the SigninManager here, because it relies on profile() which is 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // freed in the base class. 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (naked_manager_) { 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) naked_manager_->Shutdown(); 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) naked_manager_.reset(NULL); 1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingBrowserProcess::GetGlobal()->SetLocalState(NULL); 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Manually destroy PrefService and Profile so that they are shutdown 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // in the correct order. Both need to be destroyed before the 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // |thread_bundle_| member. 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) profile_.reset(); 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) prefs_.reset(); // LocalState needs to outlive the profile. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TestingProfile* profile() { return profile_.get(); } 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Sets up the signin manager as a service if other code will try to get it as 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // a PKS. 130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void SetUpSigninManagerAsService() { 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(!manager_); 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(!naked_manager_); 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) manager_ = static_cast<SigninManager*>( 134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SigninManagerFactory::GetForProfile(profile())); 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager_->AddObserver(&test_observer_); 1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Create a naked signin manager if integration with PKSs is not needed. 1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void CreateNakedSigninManager() { 1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(!manager_); 1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) naked_manager_.reset(new SigninManager( 142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ChromeSigninClientFactory::GetInstance()->GetForProfile(profile()), 143effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ProfileOAuth2TokenServiceFactory::GetForProfile(profile()))); 1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) manager_ = naked_manager_.get(); 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager_->AddObserver(&test_observer_); 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Shuts down |manager_|. 1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ShutDownManager() { 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(manager_); 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager_->RemoveObserver(&test_observer_); 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager_->Shutdown(); 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (naked_manager_) 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) naked_manager_.reset(NULL); 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager_ = NULL; 1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void ExpectSignInWithRefreshTokenSuccess() { 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(manager_->GetAuthenticatedUsername().empty()); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ProfileOAuth2TokenService* token_service = 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ProfileOAuth2TokenServiceFactory::GetForProfile(profile()); 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(token_service->RefreshTokenIsAvailable( 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) manager_->GetAuthenticatedUsername())); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should go into token service and stop. 1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, test_observer_.num_successful_signins_); 1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, test_observer_.num_failed_signins_); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void CompleteSigninCallback(const std::string& oauth_token) { 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) oauth_tokens_fetched_.push_back(oauth_token); 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) manager_->CompletePendingSignin(); 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::TestBrowserThreadBundle thread_bundle_; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::TestURLFetcherFactory factory_; 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<SigninManager> naked_manager_; 1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SigninManager* manager_; 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestSigninManagerObserver test_observer_; 182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<TestingProfile> profile_; 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<std::string> oauth_tokens_fetched_; 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TestingPrefServiceSimple> prefs_; 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> cookies_; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(SigninManagerTest, SignInWithRefreshToken) { 189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetUpSigninManagerAsService(); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->GetAuthenticatedUsername().empty()); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) manager_->StartSignInWithRefreshToken( 193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "rt1", 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "user@gmail.com", 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "password", 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SigninManager::OAuthTokenFetchedCallback()); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ExpectSignInWithRefreshTokenSuccess(); 1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Should persist across resets. 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShutDownManager(); 2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateNakedSigninManager(); 203e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch manager_->Initialize(NULL); 2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ("user@gmail.com", manager_->GetAuthenticatedUsername()); 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(SigninManagerTest, SignInWithRefreshTokenCallbackComplete) { 208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetUpSigninManagerAsService(); 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(manager_->GetAuthenticatedUsername().empty()); 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Since the password is empty, must verify the gaia cookies first. 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SigninManager::OAuthTokenFetchedCallback callback = 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&SigninManagerTest::CompleteSigninCallback, 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this)); 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) manager_->StartSignInWithRefreshToken( 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "rt1", 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "user@gmail.com", 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "password", 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback); 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ExpectSignInWithRefreshTokenSuccess(); 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(1U, oauth_tokens_fetched_.size()); 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(oauth_tokens_fetched_[0], "rt1"); 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(SigninManagerTest, SignOut) { 227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetUpSigninManagerAsService(); 228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) manager_->StartSignInWithRefreshToken( 229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "rt1", 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "user@gmail.com", 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "password", 232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SigninManager::OAuthTokenFetchedCallback()); 23308fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu manager_->SignOut(signin_metrics::SIGNOUT_TEST); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->GetAuthenticatedUsername().empty()); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should not be persisted anymore 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ShutDownManager(); 2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateNakedSigninManager(); 238e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch manager_->Initialize(NULL); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(manager_->GetAuthenticatedUsername().empty()); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SigninManagerTest, SignOutWhileProhibited) { 243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetUpSigninManagerAsService(); 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(manager_->GetAuthenticatedUsername().empty()); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager_->SetAuthenticatedUsername("user@gmail.com"); 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) manager_->ProhibitSignout(true); 24808fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu manager_->SignOut(signin_metrics::SIGNOUT_TEST); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(manager_->GetAuthenticatedUsername().empty()); 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) manager_->ProhibitSignout(false); 25108fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu manager_->SignOut(signin_metrics::SIGNOUT_TEST); 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(manager_->GetAuthenticatedUsername().empty()); 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SigninManagerTest, TestIsWebBasedSigninFlowURL) { 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(SigninManager::IsWebBasedSigninFlowURL( 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://www.google.com"))); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(SigninManager::IsWebBasedSigninFlowURL( 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("https://accounts.google.com/ServiceLogin?service=chromiumsync"))); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(SigninManager::IsWebBasedSigninFlowURL( 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://accounts.google.com/ServiceLogin?service=chromiumsync"))); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // http, not https, should not be treated as web based signin. 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(SigninManager::IsWebBasedSigninFlowURL( 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("http://accounts.google.com/ServiceLogin?service=googlemail"))); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // chromiumsync is double-embedded in a continue query param. 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(SigninManager::IsWebBasedSigninFlowURL( 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL("https://accounts.google.com/CheckCookie?" 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "continue=https%3A%2F%2Fwww.google.com%2Fintl%2Fen-US%2Fchrome" 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "%2Fblank.html%3Fsource%3D3%26nonadv%3D1&service=chromiumsync"))); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 271a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 272a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(SigninManagerTest, Prohibited) { 273a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) g_browser_process->local_state()->SetString( 274a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) prefs::kGoogleServicesUsernamePattern, ".*@google.com"); 2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateNakedSigninManager(); 276e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch manager_->Initialize(g_browser_process->local_state()); 277a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(manager_->IsAllowedUsername("test@google.com")); 278a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(manager_->IsAllowedUsername("happy@google.com")); 279a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(manager_->IsAllowedUsername("test@invalid.com")); 280a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(manager_->IsAllowedUsername("test@notgoogle.com")); 281a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(manager_->IsAllowedUsername(std::string())); 282a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 283a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 284a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(SigninManagerTest, TestAlternateWildcard) { 285a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Test to make sure we accept "*@google.com" as a pattern (treat it as if 286a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // the admin entered ".*@google.com"). 287a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) g_browser_process->local_state()->SetString( 288a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) prefs::kGoogleServicesUsernamePattern, "*@google.com"); 2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateNakedSigninManager(); 290e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch manager_->Initialize(g_browser_process->local_state()); 291a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(manager_->IsAllowedUsername("test@google.com")); 292a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_TRUE(manager_->IsAllowedUsername("happy@google.com")); 293a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(manager_->IsAllowedUsername("test@invalid.com")); 294a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(manager_->IsAllowedUsername("test@notgoogle.com")); 295a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_FALSE(manager_->IsAllowedUsername(std::string())); 296a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 297a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 298a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(SigninManagerTest, ProhibitedAtStartup) { 299a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch profile()->GetPrefs()->SetString(prefs::kGoogleServicesUsername, 300a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch "monkey@invalid.com"); 301a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) g_browser_process->local_state()->SetString( 302a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) prefs::kGoogleServicesUsernamePattern, ".*@google.com"); 3034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateNakedSigninManager(); 304e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch manager_->Initialize(g_browser_process->local_state()); 305a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Currently signed in user is prohibited by policy, so should be signed out. 306a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ("", manager_->GetAuthenticatedUsername()); 307a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 308a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 309a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)TEST_F(SigninManagerTest, ProhibitedAfterStartup) { 310a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) std::string user("monkey@invalid.com"); 311a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch profile()->GetPrefs()->SetString(prefs::kGoogleServicesUsername, user); 3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateNakedSigninManager(); 313e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch manager_->Initialize(g_browser_process->local_state()); 314a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ(user, manager_->GetAuthenticatedUsername()); 315a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Update the profile - user should be signed out. 316a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) g_browser_process->local_state()->SetString( 317a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) prefs::kGoogleServicesUsernamePattern, ".*@google.com"); 318a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) EXPECT_EQ("", manager_->GetAuthenticatedUsername()); 319a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 3207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3217dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(SigninManagerTest, ExternalSignIn) { 3224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CreateNakedSigninManager(); 323e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch manager_->Initialize(g_browser_process->local_state()); 3247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ("", 325a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch profile()->GetPrefs()->GetString(prefs::kGoogleServicesUsername)); 3267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ("", manager_->GetAuthenticatedUsername()); 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, test_observer_.num_successful_signins_); 3287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch manager_->OnExternalSigninCompleted("external@example.com"); 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, test_observer_.num_successful_signins_); 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, test_observer_.num_failed_signins_); 3327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ("external@example.com", 333a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch profile()->GetPrefs()->GetString(prefs::kGoogleServicesUsername)); 3347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ("external@example.com", manager_->GetAuthenticatedUsername()); 3357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(SigninManagerTest, SigninNotAllowed) { 338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string user("user@google.com"); 339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) profile()->GetPrefs()->SetString(prefs::kGoogleServicesUsername, user); 340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) profile()->GetPrefs()->SetBoolean(prefs::kSigninAllowed, false); 341effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SetUpSigninManagerAsService(); 342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 343