Home | History | Annotate | Download | only in signin
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/message_loop/message_loop.h"
      6 #include "base/prefs/testing_pref_service.h"
      7 #include "base/strings/utf_string_conversions.h"
      8 #include "chrome/browser/chrome_notification_types.h"
      9 #include "chrome/browser/profiles/profile_info_cache.h"
     10 #include "chrome/browser/signin/signin_manager.h"
     11 #include "chrome/browser/signin/signin_names_io_thread.h"
     12 #include "chrome/test/base/testing_browser_process.h"
     13 #include "chrome/test/base/testing_profile.h"
     14 #include "chrome/test/base/testing_profile_manager.h"
     15 #include "content/public/browser/notification_service.h"
     16 #include "content/public/test/test_browser_thread.h"
     17 #include "testing/gmock/include/gmock/gmock.h"
     18 #include "testing/gtest/include/gtest/gtest.h"
     19 
     20 namespace {
     21 
     22 class SigninNamesOnIOThreadTest : public testing::Test {
     23  public:
     24   SigninNamesOnIOThreadTest();
     25   virtual void SetUp() OVERRIDE;
     26   virtual void TearDown() OVERRIDE;
     27 
     28   void SimulateSignin(const string16& email);
     29   void SimulateSignout(const string16& email);
     30   void AddNewProfile(const string16& name, const string16& email);
     31 
     32   base::MessageLoop message_loop_;
     33   content::TestBrowserThread ui_thread_;
     34   content::TestBrowserThread io_thread_;
     35   TestingProfileManager testing_profile_manager_;
     36   SigninNamesOnIOThread signin_names_;
     37 };
     38 
     39 SigninNamesOnIOThreadTest::SigninNamesOnIOThreadTest()
     40     : ui_thread_(content::BrowserThread::UI, &message_loop_),
     41       io_thread_(content::BrowserThread::IO, &message_loop_),
     42       testing_profile_manager_(
     43           TestingBrowserProcess::GetGlobal()) {
     44 }
     45 
     46 void SigninNamesOnIOThreadTest::SetUp() {
     47   ASSERT_TRUE(testing_profile_manager_.SetUp());
     48 }
     49 
     50 void SigninNamesOnIOThreadTest::TearDown() {
     51   signin_names_.ReleaseResourcesOnUIThread();
     52 }
     53 
     54 void SigninNamesOnIOThreadTest::SimulateSignin(const string16& email) {
     55   GoogleServiceSigninSuccessDetails details(UTF16ToUTF8(email), "password");
     56   content::NotificationService::current()->Notify(
     57       chrome::NOTIFICATION_GOOGLE_SIGNIN_SUCCESSFUL,
     58       content::Source<Profile>(NULL),
     59       content::Details<const GoogleServiceSigninSuccessDetails>(&details));
     60 }
     61 
     62 void SigninNamesOnIOThreadTest::SimulateSignout(const string16& email) {
     63   GoogleServiceSignoutDetails details(UTF16ToUTF8(email));
     64   content::NotificationService::current()->Notify(
     65       chrome::NOTIFICATION_GOOGLE_SIGNED_OUT,
     66       content::Source<Profile>(NULL),
     67       content::Details<const GoogleServiceSignoutDetails>(&details));
     68 }
     69 
     70 void SigninNamesOnIOThreadTest::AddNewProfile(const string16& name,
     71                                               const string16& email) {
     72   ProfileInfoCache* cache = testing_profile_manager_.profile_info_cache();
     73   const base::FilePath& user_data_dir = cache->GetUserDataDir();
     74 #if defined(OS_POSIX)
     75   const base::FilePath profile_dir = user_data_dir.Append(UTF16ToUTF8(name));
     76 #else
     77   const base::FilePath profile_dir = user_data_dir.Append(name);
     78 #endif
     79   cache->AddProfileToCache(profile_dir, name, email, 0, std::string());
     80 }
     81 
     82 }  // namespace
     83 
     84 TEST_F(SigninNamesOnIOThreadTest, Basic) {
     85   ASSERT_EQ(0u, signin_names_.GetEmails().size());
     86 }
     87 
     88 TEST_F(SigninNamesOnIOThreadTest, Signin) {
     89   const string16 email = UTF8ToUTF16("foo (at) gmail.com");
     90   SimulateSignin(email);
     91 
     92   const SigninNamesOnIOThread::EmailSet& emails = signin_names_.GetEmails();
     93   ASSERT_EQ(1u, emails.size());
     94   ASSERT_EQ(1u, emails.count(email));
     95 }
     96 
     97 TEST_F(SigninNamesOnIOThreadTest, Signout) {
     98   const string16 email = UTF8ToUTF16("foo (at) gmail.com");
     99   SimulateSignin(email);
    100   SimulateSignout(email);
    101 
    102   const SigninNamesOnIOThread::EmailSet& emails = signin_names_.GetEmails();
    103   ASSERT_EQ(0u, emails.size());
    104 }
    105 
    106 TEST_F(SigninNamesOnIOThreadTest, HandleUnknownSignout) {
    107   const string16 email = UTF8ToUTF16("foo (at) gmail.com");
    108   SimulateSignin(email);
    109   SimulateSignout(UTF8ToUTF16("bar (at) gmail.com"));
    110 
    111   const SigninNamesOnIOThread::EmailSet& emails = signin_names_.GetEmails();
    112   ASSERT_EQ(1u, emails.size());
    113   ASSERT_EQ(1u, emails.count(email));
    114 }
    115 
    116 TEST_F(SigninNamesOnIOThreadTest, StartWithConnectedProfiles) {
    117   // Setup a couple of connected profiles, and one unconnected.
    118   const string16 email1 = UTF8ToUTF16("foo (at) gmail.com");
    119   const string16 email2 = UTF8ToUTF16("bar (at) gmail.com");
    120   AddNewProfile(UTF8ToUTF16("foo"), email1);
    121   AddNewProfile(UTF8ToUTF16("bar"), email2);
    122   AddNewProfile(UTF8ToUTF16("toto"), string16());
    123 
    124   SigninNamesOnIOThread signin_names;
    125 
    126   const SigninNamesOnIOThread::EmailSet& emails = signin_names.GetEmails();
    127   ASSERT_EQ(2u, emails.size());
    128   ASSERT_EQ(1u, emails.count(email1));
    129   ASSERT_EQ(1u, emails.count(email2));
    130 
    131   signin_names.ReleaseResourcesOnUIThread();
    132 }
    133