Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2014 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 "chrome/browser/extensions/extension_service_test_base.h" | |
| 6 | |
| 7 #include "base/command_line.h" | |
| 8 #include "base/file_util.h" | |
| 9 #include "base/memory/ref_counted.h" | |
| 10 #include "base/message_loop/message_loop.h" | |
| 11 #include "base/path_service.h" | |
| 12 #include "chrome/browser/extensions/extension_error_reporter.h" | |
| 13 #include "chrome/browser/extensions/extension_garbage_collector_factory.h" | |
| 14 #include "chrome/browser/extensions/extension_service.h" | |
| 15 #include "chrome/browser/extensions/test_extension_system.h" | |
| 16 #include "chrome/browser/extensions/updater/extension_updater.h" | |
| 17 #include "chrome/browser/prefs/browser_prefs.h" | |
| 18 #include "chrome/browser/prefs/pref_service_mock_factory.h" | |
| 19 #include "chrome/browser/prefs/pref_service_syncable.h" | |
| 20 #include "chrome/common/chrome_constants.h" | |
| 21 #include "chrome/common/chrome_paths.h" | |
| 22 #include "chrome/test/base/testing_profile.h" | |
| 23 #include "components/pref_registry/pref_registry_syncable.h" | |
| 24 #include "content/public/browser/browser_context.h" | |
| 25 #include "extensions/browser/extension_prefs.h" | |
| 26 #include "extensions/browser/extension_registry.h" | |
| 27 | |
| 28 #if defined(OS_CHROMEOS) | |
| 29 #include "chrome/browser/chromeos/extensions/install_limiter.h" | |
| 30 #endif | |
| 31 | |
| 32 namespace extensions { | |
| 33 | |
| 34 namespace { | |
| 35 | |
| 36 // Create a testing profile according to |params|. | |
| 37 scoped_ptr<TestingProfile> BuildTestingProfile( | |
| 38 const ExtensionServiceTestBase::ExtensionServiceInitParams& params) { | |
| 39 TestingProfile::Builder profile_builder; | |
| 40 // Create a PrefService that only contains user defined preference values. | |
| 41 PrefServiceMockFactory factory; | |
| 42 // If pref_file is empty, TestingProfile automatically creates | |
| 43 // TestingPrefServiceSyncable instance. | |
| 44 if (!params.pref_file.empty()) { | |
| 45 factory.SetUserPrefsFile(params.pref_file, | |
| 46 base::MessageLoopProxy::current().get()); | |
| 47 scoped_refptr<user_prefs::PrefRegistrySyncable> registry( | |
| 48 new user_prefs::PrefRegistrySyncable); | |
| 49 scoped_ptr<PrefServiceSyncable> prefs( | |
| 50 factory.CreateSyncable(registry.get())); | |
| 51 chrome::RegisterUserProfilePrefs(registry.get()); | |
| 52 profile_builder.SetPrefService(prefs.Pass()); | |
| 53 } | |
| 54 | |
| 55 if (params.profile_is_managed) | |
| 56 profile_builder.SetManagedUserId("asdf"); | |
| 57 | |
| 58 profile_builder.SetPath(params.profile_path); | |
| 59 return profile_builder.Build(); | |
| 60 } | |
| 61 | |
| 62 } // namespace | |
| 63 | |
| 64 ExtensionServiceTestBase::ExtensionServiceInitParams:: | |
| 65 ExtensionServiceInitParams() | |
| 66 : autoupdate_enabled(false), is_first_run(true), profile_is_managed(false) { | |
| 67 } | |
| 68 | |
| 69 // Our message loop may be used in tests which require it to be an IO loop. | |
| 70 ExtensionServiceTestBase::ExtensionServiceTestBase() | |
| 71 : service_(NULL), | |
| 72 thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), | |
| 73 registry_(NULL) { | |
| 74 base::FilePath test_data_dir; | |
| 75 if (!PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir)) { | |
| 76 ADD_FAILURE(); | |
| 77 return; | |
| 78 } | |
| 79 data_dir_ = test_data_dir.AppendASCII("extensions"); | |
| 80 } | |
| 81 | |
| 82 ExtensionServiceTestBase::~ExtensionServiceTestBase() { | |
| 83 // Why? Because |profile_| has to be destroyed before |at_exit_manager_|, but | |
| 84 // is declared above it in the class definition since it's protected. | |
| 85 profile_.reset(); | |
| 86 } | |
| 87 | |
| 88 ExtensionServiceTestBase::ExtensionServiceInitParams | |
| 89 ExtensionServiceTestBase::CreateDefaultInitParams() { | |
| 90 ExtensionServiceInitParams params; | |
| 91 EXPECT_TRUE(temp_dir_.CreateUniqueTempDir()); | |
| 92 base::FilePath path = temp_dir_.path(); | |
| 93 path = path.Append(FILE_PATH_LITERAL("TestingExtensionsPath")); | |
| 94 EXPECT_TRUE(base::DeleteFile(path, true)); | |
| 95 base::File::Error error = base::File::FILE_OK; | |
| 96 EXPECT_TRUE(base::CreateDirectoryAndGetError(path, &error)) << error; | |
| 97 base::FilePath prefs_filename = | |
| 98 path.Append(FILE_PATH_LITERAL("TestPreferences")); | |
| 99 base::FilePath extensions_install_dir = | |
| 100 path.Append(FILE_PATH_LITERAL("Extensions")); | |
| 101 EXPECT_TRUE(base::DeleteFile(extensions_install_dir, true)); | |
| 102 EXPECT_TRUE(base::CreateDirectoryAndGetError(extensions_install_dir, &error)) | |
| 103 << error; | |
| 104 | |
| 105 params.profile_path = path; | |
| 106 params.pref_file = prefs_filename; | |
| 107 params.extensions_install_dir = extensions_install_dir; | |
| 108 return params; | |
| 109 } | |
| 110 | |
| 111 void ExtensionServiceTestBase::InitializeExtensionService( | |
| 112 const ExtensionServiceTestBase::ExtensionServiceInitParams& params) { | |
| 113 profile_ = BuildTestingProfile(params); | |
| 114 CreateExtensionService(params); | |
| 115 | |
| 116 extensions_install_dir_ = params.extensions_install_dir; | |
| 117 registry_ = ExtensionRegistry::Get(profile_.get()); | |
| 118 | |
| 119 // Garbage collector is typically NULL during tests, so give it a build. | |
| 120 ExtensionGarbageCollectorFactory::GetInstance()->SetTestingFactoryAndUse( | |
| 121 profile_.get(), &ExtensionGarbageCollectorFactory::BuildInstanceFor); | |
| 122 } | |
| 123 | |
| 124 void ExtensionServiceTestBase::InitializeEmptyExtensionService() { | |
| 125 InitializeExtensionService(CreateDefaultInitParams()); | |
| 126 } | |
| 127 | |
| 128 void ExtensionServiceTestBase::InitializeInstalledExtensionService( | |
| 129 const base::FilePath& prefs_file, | |
| 130 const base::FilePath& source_install_dir) { | |
| 131 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | |
| 132 base::FilePath path = temp_dir_.path(); | |
| 133 | |
| 134 path = path.Append(FILE_PATH_LITERAL("TestingExtensionsPath")); | |
| 135 ASSERT_TRUE(base::DeleteFile(path, true)); | |
| 136 | |
| 137 base::File::Error error = base::File::FILE_OK; | |
| 138 ASSERT_TRUE(base::CreateDirectoryAndGetError(path, &error)) << error; | |
| 139 | |
| 140 base::FilePath temp_prefs = path.Append(chrome::kPreferencesFilename); | |
| 141 ASSERT_TRUE(base::CopyFile(prefs_file, temp_prefs)); | |
| 142 | |
| 143 base::FilePath extensions_install_dir = | |
| 144 path.Append(FILE_PATH_LITERAL("Extensions")); | |
| 145 ASSERT_TRUE(base::DeleteFile(extensions_install_dir, true)); | |
| 146 ASSERT_TRUE( | |
| 147 base::CopyDirectory(source_install_dir, extensions_install_dir, true)); | |
| 148 | |
| 149 ExtensionServiceInitParams params; | |
| 150 params.profile_path = path; | |
| 151 params.pref_file = temp_prefs; | |
| 152 params.extensions_install_dir = extensions_install_dir; | |
| 153 InitializeExtensionService(params); | |
| 154 } | |
| 155 | |
| 156 void ExtensionServiceTestBase::InitializeGoodInstalledExtensionService() { | |
| 157 base::FilePath source_install_dir = | |
| 158 data_dir_.AppendASCII("good").AppendASCII("Extensions"); | |
| 159 base::FilePath pref_path = | |
| 160 source_install_dir.DirName().Append(chrome::kPreferencesFilename); | |
| 161 InitializeInstalledExtensionService(pref_path, source_install_dir); | |
| 162 } | |
| 163 | |
| 164 void ExtensionServiceTestBase::InitializeExtensionServiceWithUpdater() { | |
| 165 ExtensionServiceInitParams params = CreateDefaultInitParams(); | |
| 166 params.autoupdate_enabled = true; | |
| 167 InitializeExtensionService(params); | |
| 168 service_->updater()->Start(); | |
| 169 } | |
| 170 | |
| 171 void ExtensionServiceTestBase::InitializeProcessManager() { | |
| 172 static_cast<extensions::TestExtensionSystem*>( | |
| 173 ExtensionSystem::Get(profile_.get()))->CreateProcessManager(); | |
| 174 } | |
| 175 | |
| 176 void ExtensionServiceTestBase::SetUp() { | |
| 177 ExtensionErrorReporter::GetInstance()->ClearErrors(); | |
| 178 } | |
| 179 | |
| 180 void ExtensionServiceTestBase::SetUpTestCase() { | |
| 181 // Safe to call multiple times. | |
| 182 ExtensionErrorReporter::Init(false); // no noisy errors. | |
| 183 } | |
| 184 | |
| 185 // These are declared in the .cc so that all inheritors don't need to know | |
| 186 // that TestingProfile derives Profile derives BrowserContext. | |
| 187 content::BrowserContext* ExtensionServiceTestBase::browser_context() { | |
| 188 return profile_.get(); | |
| 189 } | |
|
Yoyo Zhou
2014/06/11 02:13:50
nit: newline
Devlin
2014/06/11 15:44:16
Done.
| |
| 190 Profile* ExtensionServiceTestBase::profile() { | |
| 191 return profile_.get(); | |
| 192 } | |
| 193 | |
| 194 void ExtensionServiceTestBase::CreateExtensionService( | |
| 195 const ExtensionServiceInitParams& params) { | |
| 196 TestExtensionSystem* system = | |
| 197 static_cast<TestExtensionSystem*>(ExtensionSystem::Get(profile_.get())); | |
| 198 if (!params.is_first_run) { | |
| 199 ExtensionPrefs* prefs = system->CreateExtensionPrefs( | |
| 200 base::CommandLine::ForCurrentProcess(), params.extensions_install_dir); | |
| 201 prefs->SetAlertSystemFirstRun(); | |
| 202 } | |
| 203 | |
| 204 service_ = | |
| 205 system->CreateExtensionService(base::CommandLine::ForCurrentProcess(), | |
| 206 params.extensions_install_dir, | |
| 207 params.autoupdate_enabled); | |
| 208 | |
| 209 service_->SetFileTaskRunnerForTesting( | |
| 210 base::MessageLoopProxy::current().get()); | |
| 211 service_->set_extensions_enabled(true); | |
| 212 service_->set_show_extensions_prompts(false); | |
| 213 service_->set_install_updates_when_idle_for_test(false); | |
| 214 | |
| 215 // When we start up, we want to make sure there is no external provider, | |
| 216 // since the ExtensionService on Windows will use the Registry as a default | |
| 217 // provider and if there is something already registered there then it will | |
| 218 // interfere with the tests. Those tests that need an external provider | |
| 219 // will register one specifically. | |
| 220 service_->ClearProvidersForTesting(); | |
| 221 | |
| 222 #if defined(OS_CHROMEOS) | |
| 223 InstallLimiter::Get(profile_.get())->DisableForTest(); | |
| 224 #endif | |
| 225 } | |
| 226 | |
| 227 } // namespace extensions | |
| OLD | NEW |