12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/sync/profile_signin_confirmation_helper.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind_helpers.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
149ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_notifier_impl.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/testing_pref_service.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/run_loop.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/test_extension_system.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service_factory.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/browser_prefs.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/extension.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/extension_constants.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/extension_manifest_constants.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/permissions/permission_set.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/testing_pref_service_syncable.h"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/testing_profile.h"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/pref_registry_syncable.h"
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/test_utils.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h"
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h"
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template<typename T>
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void GetValueAndQuit(T* result, const base::Closure& quit, T actual) {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *result = actual;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  quit.Run();
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template<typename T>
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)T GetCallbackResult(
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::Callback<void(const base::Callback<void(T)>&)>& callback) {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  T result = false;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::RunLoop loop;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  callback.Run(base::Bind(&GetValueAndQuit<T>, &result, loop.QuitClosure()));
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  loop.Run();
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return result;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A pref store that can have its read_error property changed for testing.
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestingPrefStoreWithCustomReadError : public TestingPrefStore {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefStoreWithCustomReadError()
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : read_error_(PersistentPrefStore::PREF_READ_ERROR_NO_FILE) {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // By default the profile is "new" (NO_FILE means that the profile
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // wasn't found on disk, so it was created).
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual PrefReadError GetReadError() const OVERRIDE {
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return read_error_;
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool IsInitializationComplete() const OVERRIDE {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_read_error(PrefReadError read_error) {
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    read_error_ = read_error;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TestingPrefStoreWithCustomReadError() {}
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrefReadError read_error_;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kExtensionFilePath[] =
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FILE_PATH_LITERAL("c:\\foo");
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_POSIX)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kExtensionFilePath[] =
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FILE_PATH_LITERAL("/oo");
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static scoped_refptr<extensions::Extension> CreateExtension(
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& name,
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& id) {
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DictionaryValue manifest;
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manifest.SetString(extension_manifest_keys::kVersion, "1.0.0.0");
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  manifest.SetString(extension_manifest_keys::kName, name);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string error;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<extensions::Extension> extension =
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::Extension::Create(
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::FilePath(kExtensionFilePath).AppendASCII(name),
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        extensions::Manifest::INTERNAL,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        manifest,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        extensions::Extension::NO_FLAGS,
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        id,
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &error);
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return extension;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ProfileSigninConfirmationHelperTest : public testing::Test {
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ProfileSigninConfirmationHelperTest()
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      : user_prefs_(NULL),
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        model_(NULL) {
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Create the profile.
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestingProfile::Builder builder;
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    user_prefs_ = new TestingPrefStoreWithCustomReadError;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TestingPrefServiceSyncable* pref_service = new TestingPrefServiceSyncable(
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new TestingPrefStore(),
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        user_prefs_,
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new TestingPrefStore(),
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        new user_prefs::PrefRegistrySyncable(),
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new PrefNotifierImpl());
1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    chrome::RegisterUserProfilePrefs(pref_service->registry());
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    builder.SetPrefService(make_scoped_ptr<PrefServiceSyncable>(pref_service));
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    profile_ = builder.Build();
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Initialize the services we check.
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    profile_->CreateBookmarkModel(true);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    model_ = BookmarkModelFactory::GetForProfile(profile_.get());
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui_test_utils::WaitForBookmarkModelToLoad(model_);
141bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    ASSERT_TRUE(profile_->CreateHistoryService(true, false));
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extensions::TestExtensionSystem* system =
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        static_cast<extensions::TestExtensionSystem*>(
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            extensions::ExtensionSystem::Get(profile_.get()));
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CommandLine command_line(CommandLine::NO_PROGRAM);
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    system->CreateExtensionService(&command_line,
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   base::FilePath(kExtensionFilePath),
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   false);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // TestExtensionSystem uses DeleteSoon, so we need to delete the profile
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // and then run the message queue to clean up.
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    profile_.reset();
1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::RunLoop().RunUntilIdle();
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  content::TestBrowserThreadBundle thread_bundle_;
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestingPrefStoreWithCustomReadError* user_prefs_;
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BookmarkModel* model_;
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined OS_CHROMEOS
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::ScopedTestCrosSettings test_cros_settings_;
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::ScopedTestUserManager test_user_manager_;
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ProfileSigninConfirmationHelperTest, DoNotPromptForNewProfile) {
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Profile is new and there's no profile data.
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetCallbackResult(
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Bind(
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &ui::CheckShouldPromptForNewProfile,
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_.get())));
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ProfileSigninConfirmationHelperTest, PromptForNewProfile_Bookmarks) {
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(model_);
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Profile is new but has bookmarks.
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_->AddURL(model_->bookmark_bar_node(), 0, string16(ASCIIToUTF16("foo")),
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 GURL("http://foo.com"));
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetCallbackResult(
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Bind(
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &ui::CheckShouldPromptForNewProfile,
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_.get())));
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ProfileSigninConfirmationHelperTest, PromptForNewProfile_Extensions) {
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* extensions =
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::ExtensionSystem::Get(profile_.get())->extension_service();
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(extensions);
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Profile is new but has synced extensions.
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (The web store doesn't count.)
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<extensions::Extension> webstore =
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateExtension("web store", extension_misc::kWebStoreAppId);
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions->extension_prefs()->AddGrantedPermissions(
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      webstore->id(), make_scoped_refptr(new extensions::PermissionSet).get());
205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  extensions->AddExtension(webstore.get());
206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(GetCallbackResult(
207868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::Bind(&ui::CheckShouldPromptForNewProfile, profile_.get())));
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<extensions::Extension> extension =
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CreateExtension("foo", std::string());
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions->extension_prefs()->AddGrantedPermissions(
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      extension->id(), make_scoped_refptr(new extensions::PermissionSet).get());
213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  extensions->AddExtension(extension.get());
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(GetCallbackResult(
215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::Bind(&ui::CheckShouldPromptForNewProfile, profile_.get())));
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ProfileSigninConfirmationHelperTest, PromptForNewProfile_History) {
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HistoryService* history = HistoryServiceFactory::GetForProfile(
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      profile_.get(),
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Profile::EXPLICIT_ACCESS);
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(history);
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Profile is new but has more than $(kHistoryEntriesBeforeNewProfilePrompt)
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // history items.
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  char buf[18];
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < 10; i++) {
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::snprintf(buf, arraysize(buf), "http://foo.com/%d", i);
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    history->AddPage(
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GURL(std::string(buf)), base::Time::Now(), NULL, 1,
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GURL(), history::RedirectList(), content::PAGE_TRANSITION_LINK,
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        history::SOURCE_BROWSED, false);
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetCallbackResult(
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Bind(
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &ui::CheckShouldPromptForNewProfile,
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_.get())));
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ProfileSigninConfirmationHelperTest, PromptForNewProfile_TypedURLs) {
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HistoryService* history = HistoryServiceFactory::GetForProfile(
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      profile_.get(),
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Profile::EXPLICIT_ACCESS);
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(history);
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Profile is new but has a typed URL.
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  history->AddPage(
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("http://example.com"), base::Time::Now(), NULL, 1,
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL(), history::RedirectList(), content::PAGE_TRANSITION_TYPED,
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      history::SOURCE_BROWSED, false);
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetCallbackResult(
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Bind(
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &ui::CheckShouldPromptForNewProfile,
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_.get())));
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ProfileSigninConfirmationHelperTest, PromptForNewProfile_Restarted) {
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Browser has been shut down since profile was created.
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  user_prefs_->set_read_error(PersistentPrefStore::PREF_READ_ERROR_NONE);
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetCallbackResult(
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::Bind(
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              &ui::CheckShouldPromptForNewProfile,
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              profile_.get())));
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
268