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)
59ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/observer_list.h"
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/testing_pref_service.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_info_cache.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/signin/fake_signin_manager.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/signin/signin_names_io_thread.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile_manager.h"
16e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "components/signin/core/browser/signin_manager.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_service.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SigninNamesOnIOThreadTest : public testing::Test {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SigninNamesOnIOThreadTest();
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void SimulateSignin(const base::string16& email);
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void AddNewProfile(const base::string16& name, const base::string16& email);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop message_loop_;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread_;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread io_thread_;
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FakeSigninManager* signin_manager_;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfileManager testing_profile_manager_;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SigninNamesOnIOThread signin_names_;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SigninNamesOnIOThreadTest::SigninNamesOnIOThreadTest()
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ui_thread_(content::BrowserThread::UI, &message_loop_),
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      io_thread_(content::BrowserThread::IO, &message_loop_),
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      testing_profile_manager_(
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          TestingBrowserProcess::GetGlobal()) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninNamesOnIOThreadTest::SetUp() {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(testing_profile_manager_.SetUp());
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestingProfile::Builder builder;
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  builder.AddTestingFactory(SigninManagerFactory::GetInstance(),
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            FakeSigninManagerBase::Build);
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  profile_ = builder.Build();
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  signin_manager_ = static_cast<FakeSigninManager*>(
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      SigninManagerFactory::GetForProfile(profile_.get()));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SigninNamesOnIOThreadTest::TearDown() {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signin_names_.ReleaseResourcesOnUIThread();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void SigninNamesOnIOThreadTest::SimulateSignin(const base::string16& email) {
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  signin_manager_->SignIn(base::UTF16ToUTF8(email), "password");
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void SigninNamesOnIOThreadTest::AddNewProfile(const base::string16& name,
66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              const base::string16& email) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProfileInfoCache* cache = testing_profile_manager_.profile_info_cache();
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath& user_data_dir = cache->GetUserDataDir();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::FilePath profile_dir =
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      user_data_dir.Append(base::UTF16ToUTF8(name));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath profile_dir = user_data_dir.Append(name);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  cache->AddProfileToCache(profile_dir, name, email, 0, std::string());
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SigninNamesOnIOThreadTest, Basic) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, signin_names_.GetEmails().size());
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SigninNamesOnIOThreadTest, Signin) {
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::string16 email = base::UTF8ToUTF16("foo@gmail.com");
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateSignin(email);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const SigninNamesOnIOThread::EmailSet& emails = signin_names_.GetEmails();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, emails.size());
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, emails.count(email));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SigninNamesOnIOThreadTest, Signout) {
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::string16 email = base::UTF8ToUTF16("foo@gmail.com");
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateSignin(email);
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  signin_manager_->SignOut(signin_metrics::SIGNOUT_TEST);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const SigninNamesOnIOThread::EmailSet& emails = signin_names_.GetEmails();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, emails.size());
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SigninNamesOnIOThreadTest, StartWithConnectedProfiles) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Setup a couple of connected profiles, and one unconnected.
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::string16 email1 = base::UTF8ToUTF16("foo@gmail.com");
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::string16 email2 = base::UTF8ToUTF16("bar@gmail.com");
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AddNewProfile(base::UTF8ToUTF16("foo"), email1);
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AddNewProfile(base::UTF8ToUTF16("bar"), email2);
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AddNewProfile(base::UTF8ToUTF16("toto"), base::string16());
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SigninNamesOnIOThread signin_names;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const SigninNamesOnIOThread::EmailSet& emails = signin_names.GetEmails();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, emails.size());
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, emails.count(email1));
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, emails.count(email2));
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  signin_names.ReleaseResourcesOnUIThread();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
117