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