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/observer_list.h" 7#include "base/prefs/testing_pref_service.h" 8#include "base/strings/utf_string_conversions.h" 9#include "chrome/browser/chrome_notification_types.h" 10#include "chrome/browser/profiles/profile_info_cache.h" 11#include "chrome/browser/signin/fake_signin_manager.h" 12#include "chrome/browser/signin/signin_names_io_thread.h" 13#include "chrome/test/base/testing_browser_process.h" 14#include "chrome/test/base/testing_profile.h" 15#include "chrome/test/base/testing_profile_manager.h" 16#include "components/signin/core/browser/signin_manager.h" 17#include "content/public/browser/notification_service.h" 18#include "content/public/test/test_browser_thread.h" 19#include "testing/gmock/include/gmock/gmock.h" 20#include "testing/gtest/include/gtest/gtest.h" 21 22class SigninNamesOnIOThreadTest : public testing::Test { 23 public: 24 SigninNamesOnIOThreadTest(); 25 virtual void SetUp() OVERRIDE; 26 virtual void TearDown() OVERRIDE; 27 28 void SimulateSignin(const base::string16& email); 29 void AddNewProfile(const base::string16& name, const base::string16& email); 30 31 base::MessageLoop message_loop_; 32 content::TestBrowserThread ui_thread_; 33 content::TestBrowserThread io_thread_; 34 scoped_ptr<TestingProfile> profile_; 35 FakeSigninManager* signin_manager_; 36 TestingProfileManager testing_profile_manager_; 37 SigninNamesOnIOThread signin_names_; 38}; 39 40SigninNamesOnIOThreadTest::SigninNamesOnIOThreadTest() 41 : ui_thread_(content::BrowserThread::UI, &message_loop_), 42 io_thread_(content::BrowserThread::IO, &message_loop_), 43 testing_profile_manager_( 44 TestingBrowserProcess::GetGlobal()) { 45} 46 47void SigninNamesOnIOThreadTest::SetUp() { 48 ASSERT_TRUE(testing_profile_manager_.SetUp()); 49 TestingProfile::Builder builder; 50 builder.AddTestingFactory(SigninManagerFactory::GetInstance(), 51 FakeSigninManagerBase::Build); 52 profile_ = builder.Build(); 53 signin_manager_ = static_cast<FakeSigninManager*>( 54 SigninManagerFactory::GetForProfile(profile_.get())); 55} 56 57void SigninNamesOnIOThreadTest::TearDown() { 58 signin_names_.ReleaseResourcesOnUIThread(); 59} 60 61void SigninNamesOnIOThreadTest::SimulateSignin(const base::string16& email) { 62 signin_manager_->SignIn(base::UTF16ToUTF8(email), "password"); 63} 64 65void SigninNamesOnIOThreadTest::AddNewProfile(const base::string16& name, 66 const base::string16& email) { 67 ProfileInfoCache* cache = testing_profile_manager_.profile_info_cache(); 68 const base::FilePath& user_data_dir = cache->GetUserDataDir(); 69#if defined(OS_POSIX) 70 const base::FilePath profile_dir = 71 user_data_dir.Append(base::UTF16ToUTF8(name)); 72#else 73 const base::FilePath profile_dir = user_data_dir.Append(name); 74#endif 75 cache->AddProfileToCache(profile_dir, name, email, 0, std::string()); 76} 77 78TEST_F(SigninNamesOnIOThreadTest, Basic) { 79 ASSERT_EQ(0u, signin_names_.GetEmails().size()); 80} 81 82TEST_F(SigninNamesOnIOThreadTest, Signin) { 83 const base::string16 email = base::UTF8ToUTF16("foo@gmail.com"); 84 SimulateSignin(email); 85 86 const SigninNamesOnIOThread::EmailSet& emails = signin_names_.GetEmails(); 87 ASSERT_EQ(1u, emails.size()); 88 ASSERT_EQ(1u, emails.count(email)); 89} 90 91TEST_F(SigninNamesOnIOThreadTest, Signout) { 92 const base::string16 email = base::UTF8ToUTF16("foo@gmail.com"); 93 SimulateSignin(email); 94 signin_manager_->SignOut(signin_metrics::SIGNOUT_TEST); 95 96 const SigninNamesOnIOThread::EmailSet& emails = signin_names_.GetEmails(); 97 ASSERT_EQ(0u, emails.size()); 98} 99 100TEST_F(SigninNamesOnIOThreadTest, StartWithConnectedProfiles) { 101 // Setup a couple of connected profiles, and one unconnected. 102 const base::string16 email1 = base::UTF8ToUTF16("foo@gmail.com"); 103 const base::string16 email2 = base::UTF8ToUTF16("bar@gmail.com"); 104 AddNewProfile(base::UTF8ToUTF16("foo"), email1); 105 AddNewProfile(base::UTF8ToUTF16("bar"), email2); 106 AddNewProfile(base::UTF8ToUTF16("toto"), base::string16()); 107 108 SigninNamesOnIOThread signin_names; 109 110 const SigninNamesOnIOThread::EmailSet& emails = signin_names.GetEmails(); 111 ASSERT_EQ(2u, emails.size()); 112 ASSERT_EQ(1u, emails.count(email1)); 113 ASSERT_EQ(1u, emails.count(email2)); 114 115 signin_names.ReleaseResourcesOnUIThread(); 116} 117