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