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