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